diff --git a/.githooks/pre-commit b/.githooks/pre-commit
index e5f27c4..a6116ed 100755
--- a/.githooks/pre-commit
+++ b/.githooks/pre-commit
@@ -148,8 +148,8 @@ fi
# Ensure JavaScript files are minified. #
##################################################################
-# Get the newly added and modified files.
-mapfile -t all_changed_files < <(git diff --cached --name-only)
+# Get the newly added and modified files, but not deleted files.
+mapfile -t all_changed_files < <(git diff --cached --name-only --diff-filter=d)
script_name=$(basename "$0")
# Loop through all newly added or modified files.
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 7b17dbc..ce7da01 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1 +1,2 @@
* @welpo
+i18n/ar.toml @TheAwiteb
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..b6d081d
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1 @@
+github: welpo
diff --git a/.github/ISSUE_TEMPLATE/2_bug_report.yml b/.github/ISSUE_TEMPLATE/2_bug_report.yml
new file mode 100644
index 0000000..95746f9
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/2_bug_report.yml
@@ -0,0 +1,62 @@
+name: "🐛 Bug report"
+description: "Did you run into an issue while using tabi?"
+labels: ["bug"]
+body:
+- type: textarea
+ attributes:
+ label: "System information"
+ description: |
+ Please provide the following information:
+ - Zola version: Run `zola --version`
+ - tabi version or commit hash
+ placeholder: |
+ Zola version:
+ tabi version or commit:
+ validations:
+ required: true
+
+- type: textarea
+ attributes:
+ label: "Expected behaviour"
+ description: "Tell us what should have happened."
+ placeholder: "Describe what you expected tabi to do…"
+ validations:
+ required: true
+
+- type: textarea
+ attributes:
+ label: "Actual behaviour"
+ description: "Tell us what happens instead of the expected behavior."
+ placeholder: "Describe what actually happened…"
+ validations:
+ required: true
+
+- type: textarea
+ attributes:
+ label: "Steps to reproduce"
+ description: "Please provide detailed steps to reproduce the issue."
+ placeholder: |
+ 1. Set up `config.toml` with these settings: …
+ 2. Create content with this structure: …
+ 3. Run Zola with these arguments: …
+ 4. See the following error: …
+ validations:
+ required: true
+
+- type: textarea
+ attributes:
+ label: "Additional context"
+ description: >
+ Please provide any relevant configuration files, error messages, or screenshots that might help us understand the issue.
+ You can drag and drop files here to attach them.
+ validations:
+ required: false
+
+- type: checkboxes
+ attributes:
+ label: "Final checklist"
+ options:
+ - label: "I've checked that the issue isn't already reported."
+ required: true
+ - label: "I've tested with the latest version of tabi to check if the issue has already been fixed."
+ required: true
diff --git a/.github/ISSUE_TEMPLATE/3_feature_request.yml b/.github/ISSUE_TEMPLATE/3_feature_request.yml
new file mode 100644
index 0000000..44509e2
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/3_feature_request.yml
@@ -0,0 +1,34 @@
+name: "✨ Feature request"
+description: "Suggest an idea for tabi"
+labels: ["enhancement"]
+body:
+- type: textarea
+ attributes:
+ label: "Summary and motivation"
+ description: "Briefly describe the feature and why it would be valuable for tabi users."
+ placeholder: |
+ Describe:
+ - What the feature is
+ - Why it would be useful
+ - Any examples from other projects
+ validations:
+ required: true
+
+- type: textarea
+ attributes:
+ label: "Implementation details"
+ description: "Share any ideas you have about how this could be implemented."
+ placeholder: "Technical suggestions, potential approaches, or specific requirements."
+ validations:
+ required: false
+
+- type: checkboxes
+ attributes:
+ label: "Checklist"
+ options:
+ - label: "I've searched existing issues to make sure this feature hasn't already been requested."
+ required: true
+ - label: "This feature aligns with tabi's philosophy (minimal JS, accessible…)"
+ required: true
+ - label: "I'm willing to contribute to the implementation of this feature."
+ required: false
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
deleted file mode 100644
index ec4cfdf..0000000
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ /dev/null
@@ -1,24 +0,0 @@
----
-name: Bug report
-about: Did you run into an issue while using tabi?
-title: ''
-labels: bug
-assignees: ''
-
----
-
-# Bug Report
-
-## Environment
-
-Zola version:
-tabi version or commit:
-
-## Expected Behavior
-Tell us what should have happened.
-
-## Current Behavior
-Tell us what happens instead of the expected behavior.
-
-## Step to Reproduce
-Please provide the steps to reproduce the issue.
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..48fd57e
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,5 @@
+blank_issues_enabled: false
+contact_links:
+ - name: 💬 tabi discussions
+ url: https://github.com/welpo/tabi/discussions
+ about: If you have questions or need help, feel free to ask here~
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
deleted file mode 100644
index c109080..0000000
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-name: Feature request
-about: Suggest an idea for this project.
-title: ''
-labels: enhancement
-assignees: ''
-
----
-
-# Feature Request
-
-## Summary
-Briefly describe what this feature request is about.
-
-## Motivation
-Why should this feature be implemented? How will it benefit the project and its users?
-
-## Detailed Description
-Please provide a detailed description of the proposed feature, including any suggestions you have for how it could be implemented.
-
-## Additional Context
-Add any other context or screenshots about the feature request here. If this feature request is related to a problem, please describe it.
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 24ca7ea..643c368 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -58,6 +58,7 @@ If you need help, please ask! -->
- [ ] I have verified the accessibility of my changes
- [ ] I have tested all possible scenarios for this change
- [ ] I have updated `theme.toml` with a sane default for the feature
+- [ ] I have updated `config.toml` in [tabi-start](https://github.com/welpo/tabi-start)
- [ ] I have made corresponding changes to the documentation:
- [ ] Updated `config.toml` comments
- [ ] Updated `theme.toml` comments
diff --git a/.github/renovate.json b/.github/renovate.json
index a2a9d39..65967b6 100644
--- a/.github/renovate.json
+++ b/.github/renovate.json
@@ -1,9 +1,13 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["config:recommended", ":automergeMinor", ":disableDependencyDashboard"],
- "commitMessageAction": "chore(deps): update",
"commitMessagePrefix": "⬆️",
+ "commitMessageAction": "chore(deps): update",
+ "commitMessageTopic": "{{{depName}}}",
"labels": ["dependencies"],
+ "git-submodules": {
+ "enabled": true
+ },
"packageRules": [
{
"updateTypes": ["pin"],
@@ -16,6 +20,10 @@
{
"updateTypes": ["rollback"],
"commitMessagePrefix": "⬇️"
+ },
+ {
+ "matchFileNames": ["scripts/release/**"],
+ "automerge": true
}
]
}
diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml
index 89967a4..d038ece 100644
--- a/.github/workflows/cd.yml
+++ b/.github/workflows/cd.yml
@@ -8,12 +8,12 @@ on:
jobs:
deploy:
name: Deploy and release
- runs-on: ubuntu-22.04
+ runs-on: ubuntu-24.04
permissions:
contents: write
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
fetch-depth: 0
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 6142f76..0eae0c1 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -15,29 +15,29 @@ jobs:
if: github.event_name == 'pull_request'
steps:
- name: Checkout Code
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Zola Build
- uses: shalzz/zola-deploy-action@v0.18.0
+ uses: shalzz/zola-deploy-action@v0.21.0
env:
BUILD_ONLY: true
- name: Zola Check
- uses: shalzz/zola-deploy-action@v0.18.0
+ uses: shalzz/zola-deploy-action@v0.21.0
env:
BUILD_ONLY: true
CHECK_LINKS: true
build_and_deploy:
name: Build and Deploy on Main Push
- runs-on: ubuntu-22.04
+ runs-on: ubuntu-24.04
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
steps:
- name: Checkout Code
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Build and Deploy
- uses: shalzz/zola-deploy-action@v0.18.0
+ uses: shalzz/zola-deploy-action@v0.21.0
env:
PAGES_BRANCH: gh-pages
TOKEN: ${{ secrets.TOKEN }}
diff --git a/.github/workflows/git-sumi.yml b/.github/workflows/git-sumi.yml
index b1af84c..87c68e0 100644
--- a/.github/workflows/git-sumi.yml
+++ b/.github/workflows/git-sumi.yml
@@ -8,14 +8,21 @@ on:
- synchronize
- ready_for_review
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
+ cancel-in-progress: true
+
permissions:
pull-requests: read
jobs:
main:
name: Run git-sumi
- runs-on: ubuntu-latest
+ runs-on: ubuntu-24.04
steps:
+ - name: Set header length for dependency updates
+ if: contains(github.event.pull_request.title, 'chore(deps)')
+ run: echo "GIT_SUMI_MAX_HEADER_LENGTH=80" >> $GITHUB_ENV
- uses: welpo/git-sumi-action@main
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/upgrade-deps.yml b/.github/workflows/upgrade-deps.yml
new file mode 100644
index 0000000..776ad9d
--- /dev/null
+++ b/.github/workflows/upgrade-deps.yml
@@ -0,0 +1,89 @@
+name: Dependency upgrade
+on:
+ workflow_dispatch:
+ inputs:
+ dependency:
+ description: 'Dependency to upgrade'
+ required: true
+ type: choice
+ options:
+ - all
+ - mermaid
+ - katex
+ schedule:
+ - cron: '32 4 * * *'
+
+jobs:
+ upgrade-dependency:
+ name: Upgrade dependency
+ runs-on: ubuntu-24.04
+ permissions:
+ contents: write
+ pull-requests: write
+ strategy:
+ matrix:
+ dependency: ${{ github.event_name == 'schedule' && fromJson('["mermaid", "katex"]') || fromJson(format('["{0}"]', github.event.inputs.dependency)) }}
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v5
+ with:
+ fetch-depth: 0
+
+ - name: Set up environment
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y jq npm curl git
+ npm install uglify-js -g
+ uglifyjs --version
+
+ - name: Configure GPG key
+ run: |
+ echo -n ${{ secrets.GPG_PRIVATE_KEY }} | base64 --decode | gpg --import
+
+ - name: Configure Git
+ run: |
+ git config --global user.signingkey 33EACFE956484C3940BFEEDCE4EC28F8DFB57474
+ git config --global commit.gpgsign true
+ git config --global user.name "welpo"
+ git config --global user.email "welpo@users.noreply.github.com"
+
+ - name: Check for existing branch
+ id: check_branch
+ run: |
+ if git ls-remote --heads origin deps/upgrade-${{ matrix.dependency }} | grep -q deps/upgrade-${{ matrix.dependency }}; then
+ echo "branch_exists=true" >> $GITHUB_OUTPUT
+ else
+ echo "branch_exists=false" >> $GITHUB_OUTPUT
+ fi
+
+ - name: Handle existing branch
+ if: steps.check_branch.outputs.branch_exists == 'true'
+ run: |
+ echo "Branch deps/upgrade-${{ matrix.dependency }} already exists."
+ echo "Skipping upgrade as there's already an open PR"
+ exit 0
+
+ - name: Create and switch to new branch
+ run: |
+ git checkout -b deps/upgrade-${{ matrix.dependency }}
+
+ - name: Run upgrade script
+ shell: bash
+ run: |
+ if [[ "${{ matrix.dependency }}" == "all" ]]; then
+ bash scripts/upgrade-deps --all
+ else
+ bash scripts/upgrade-deps --${{ matrix.dependency }}
+ fi
+
+ - name: Push changes and create PR
+ shell: bash
+ run: |
+ if git diff --quiet HEAD origin/main; then
+ echo "No changes to push for ${{ matrix.dependency }}"
+ exit 0
+ fi
+ git push -u origin deps/upgrade-${{ matrix.dependency }}
+ gh pr create --fill --base main --head deps/upgrade-${{ matrix.dependency }} --label "dependencies"
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..6fc8561
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "scripts/release"]
+ path = scripts/release
+ url = https://github.com/welpo/release.git
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c7f3499..1e90c61 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,11 +4,409 @@ Welcome to the changelog for tabi. This document aims to provide a comprehensive
We use Semantic Versioning (SemVer) for our version numbers, formatted as MAJOR.MINOR.PATCH. Major version changes involve significant (breaking) changes, minor versions introduce features and improvements in a backward compatible manner, and patch versions are for bug fixes and minor tweaks.
+## [4.1.0](https://github.com/welpo/tabi/compare/v4.0.0..v4.1.0) - 2025-06-14
+
+### ✨ Features
+
+- *(feed)* Add feed icon tag pages ([#522](https://github.com/welpo/tabi/issues/522)) by [@tzinm](https://github.com/tzinm) and [@welpo](https://github.com/welpo)
+- *(i18n)* Add Finnish language ([#505](https://github.com/welpo/tabi/issues/505)) by [@axelkar](https://github.com/axelkar) and [@welpo](https://github.com/welpo)
+- *(indieweb)* Add hidden h-card ([#506](https://github.com/welpo/tabi/issues/506)) by [@mmai](https://github.com/mmai) and [@welpo](https://github.com/welpo)
+- *(socials)* Add itch.io icon ([#520](https://github.com/welpo/tabi/issues/520)) by [@mystal](https://github.com/mystal)
+- *(webmentions)* Add hcard in post page ([#524](https://github.com/welpo/tabi/issues/524)) by [@mmai](https://github.com/mmai) and [@welpo](https://github.com/welpo)
+- Add support for webmentions ([#485](https://github.com/welpo/tabi/issues/485)) by [@gortavoher](https://github.com/gortavoher), [@Jeremiah](https://github.com/Jeremiah) Russell, [@Henri](https://github.com/Henri) Bourcereau and [@welpo](https://github.com/welpo)
+- Extend tabi `
` and `` elements ([#528](https://github.com/welpo/tabi/issues/528)) by [@axis7818](https://github.com/axis7818) and [@welpo](https://github.com/welpo)
+- Parse markdown in post summary & description ([#517](https://github.com/welpo/tabi/issues/517)) by [@rktjump](https://github.com/rktjump) and [@welpo](https://github.com/welpo)
+- Cache bust images in shortcodes ([#504](https://github.com/welpo/tabi/issues/504)) by [@axelkar](https://github.com/axelkar)
+
+### 🐛 Bug fixes
+
+- *(feed)* Prioritise description > summary ([#525](https://github.com/welpo/tabi/issues/525)) by [@tzinm](https://github.com/tzinm)
+- Render author HTML on page metadata ([7321fc5](https://github.com/welpo/tabi/commit/7321fc5a43fa50dc24c9fa87714612a2295b904a)) by [@welpo](https://github.com/welpo)
+- Allow feed icon to be hidden ([#533](https://github.com/welpo/tabi/issues/533)) by [@bajacc](https://github.com/bajacc)
+- Fix hcard html tags ([#508](https://github.com/welpo/tabi/issues/508)) by [@mmai](https://github.com/mmai)
+- Fix external link icon breaking word wrapping ([#498](https://github.com/welpo/tabi/issues/498)) by [@welpo](https://github.com/welpo)
+- Fix padding hover on links with code (custom font) ([#494](https://github.com/welpo/tabi/issues/494)) by [@clement-escolano](https://github.com/clement-escolano)
+
+### 💄 Styling
+
+- Remove extra spacing after author ([2e29782](https://github.com/welpo/tabi/commit/2e29782279d8154cb9c6f1df9a2401612ec77948)) by [@welpo](https://github.com/welpo)
+
+### ♻️ Refactor
+
+- Add "target_attribute" macro ([#515](https://github.com/welpo/tabi/issues/515)) by [@tzinm](https://github.com/tzinm) and @Óscar
+- Improve error message when title is unset ([a384ac8](https://github.com/welpo/tabi/commit/a384ac80c8e6b8be46d4a335930fba697a523af9)) by [@welpo](https://github.com/welpo)
+
+### 🔧 Miscellaneous tasks
+
+- *(CI)* Fix Mermaid version detection ([e11186a](https://github.com/welpo/tabi/commit/e11186a8448f94494b350402f76a2cc5e5a98a97)) by [@welpo](https://github.com/welpo)
+- *(README)* Add b1n.io to 'sites using tabi' ([#531](https://github.com/welpo/tabi/issues/531)) by [@b1nhack](https://github.com/b1nhack)
+- *(README)* Fix broken link tag ([#516](https://github.com/welpo/tabi/issues/516)) by [@Olexandr88](https://github.com/Olexandr88)
+- *(README)* Add tzinm's blog to 'sites using tabi' ([#496](https://github.com/welpo/tabi/issues/496)) by [@tzinm](https://github.com/tzinm)
+
+### 👥 New contributors
+
+🫶 [@gortavoher](https://github.com/gortavoher) made their first contribution in [#485](https://github.com/welpo/tabi/pull/485)
+
+🫶 [@bajacc](https://github.com/bajacc) made their first contribution in [#533](https://github.com/welpo/tabi/pull/533)
+
+🫶 [@axis7818](https://github.com/axis7818) made their first contribution in [#528](https://github.com/welpo/tabi/pull/528)
+
+🫶 [@b1nhack](https://github.com/b1nhack) made their first contribution in [#531](https://github.com/welpo/tabi/pull/531)
+
+🫶 [@tzinm](https://github.com/tzinm) made their first contribution in [#525](https://github.com/welpo/tabi/pull/525)
+
+🫶 [@mmai](https://github.com/mmai) made their first contribution in [#524](https://github.com/welpo/tabi/pull/524)
+
+🫶 [@rktjump](https://github.com/rktjump) made their first contribution in [#517](https://github.com/welpo/tabi/pull/517)
+
+🫶 [@mystal](https://github.com/mystal) made their first contribution in [#520](https://github.com/welpo/tabi/pull/520)
+
+🫶 [@axelkar](https://github.com/axelkar) made their first contribution in [#504](https://github.com/welpo/tabi/pull/504)
+
+🫶 [@clement-escolano](https://github.com/clement-escolano) made their first contribution in [#494](https://github.com/welpo/tabi/pull/494)
+
+## [4.0.0](https://github.com/welpo/tabi/compare/v3.1.0..v4.0.0) - 2025-02-16
+
+### 💥 BREAKING CHANGES 💥
+
+- *(archive)* Enforce chronological sorting ([#483](https://github.com/welpo/tabi/issues/483)) by [@welpo](https://github.com/welpo)
+- Add tag filtering for projects ([#431](https://github.com/welpo/tabi/issues/431)) ([a783329](https://github.com/welpo/tabi/commit/a7833299fff4c753e35fa1f00667d8801f541f9a)) by [@welpo](https://github.com/welpo)
+
+### ✨ Features
+
+- *(archive)* [**‼️BREAKING‼️**] Enforce chronological sorting ([#483](https://github.com/welpo/tabi/issues/483)) by [@welpo](https://github.com/welpo)
+- *(shortcodes)* Add 'aside' shortcode for side notes ([#452](https://github.com/welpo/tabi/issues/452)) by [@welpo](https://github.com/welpo)
+- *(socials)* Add more Fediverse social icons ([89ad44c](https://github.com/welpo/tabi/commit/89ad44ce26d002f2f2c3baa6cf769fb8972551af)) by [@welpo](https://github.com/welpo)
+- *(socials)* Add Letterboxd social icon ([0e0a391](https://github.com/welpo/tabi/commit/0e0a391ea84c3ed8b66931158ddef1e4cdd161f4)) by [@welpo](https://github.com/welpo)
+- *(socials)* Add ORCID icon ([cf63855](https://github.com/welpo/tabi/commit/cf6385553c779710d1164509f3fc0d480e858ebd)) by [@welpo](https://github.com/welpo)
+- Add `hide_from_main_feed` support ([#490](https://github.com/welpo/tabi/issues/490)) by [@welpo](https://github.com/welpo)
+- Support Zola's native code block names ([#489](https://github.com/welpo/tabi/issues/489)) by [@welpo](https://github.com/welpo)
+- Render markdown in page titles & descriptions ([#486](https://github.com/welpo/tabi/issues/486)) by [@stalkerGH](https://github.com/stalkerGH) and [@welpo](https://github.com/welpo)
+- Add indicator to external links ([#443](https://github.com/welpo/tabi/issues/443)) by [@welpo](https://github.com/welpo)
+- Allow setting post_listing_date per section ([a3ae897](https://github.com/welpo/tabi/commit/a3ae897c8310ba6a1da72db0fc81f19ca8993d6f)) by [@welpo](https://github.com/welpo)
+- Render section content ([#484](https://github.com/welpo/tabi/issues/484)) by [@welpo](https://github.com/welpo)
+- Support disabling header font-subset ([#458](https://github.com/welpo/tabi/issues/458)) by [@Nizzlay](https://github.com/Nizzlay) and [@welpo](https://github.com/welpo)
+- Support using info-page.html for sections ([#455](https://github.com/welpo/tabi/issues/455)) by [@wischi-chr](https://github.com/wischi-chr) and [@welpo](https://github.com/welpo)
+- Add `raw_path` parameter to image shortcodes ([#439](https://github.com/welpo/tabi/issues/439)) by [@welpo](https://github.com/welpo)
+- [**‼️BREAKING‼️**] Add tag filtering for projects ([#431](https://github.com/welpo/tabi/issues/431)) ([a783329](https://github.com/welpo/tabi/commit/a7833299fff4c753e35fa1f00667d8801f541f9a)) by [@welpo](https://github.com/welpo)
+
+### 🐛 Bug fixes
+
+- *(CSP)* Improve CSP coverage ([#471](https://github.com/welpo/tabi/issues/471)) by [@stekershaw](https://github.com/stekershaw)
+- *(analytics)* Update umami domain ([#448](https://github.com/welpo/tabi/issues/448)) by [@arichtman](https://github.com/arichtman)
+- *(feed)* Styling now works in all website paths ([45fe170](https://github.com/welpo/tabi/commit/45fe17046704e249be3b5fbb94a3355d21149d4d)) by [@welpo](https://github.com/welpo)
+- *(feed)* Load CSS in subfolder setups ([#467](https://github.com/welpo/tabi/issues/467)) by [@welpo](https://github.com/welpo)
+- Adapt footnotes styling for zola 0.19.x & 0.20.x ([1c067e7](https://github.com/welpo/tabi/commit/1c067e708eac4282a2191507f046eacd9f18e0f6)) by [@welpo](https://github.com/welpo)
+- Improve menu accessibility ([#482](https://github.com/welpo/tabi/issues/482)) by [@welpo](https://github.com/welpo)
+- Support external URLs in menu ([#481](https://github.com/welpo/tabi/issues/481)) by [@welpo](https://github.com/welpo)
+- Remove `nofollow` robots meta tag ([#465](https://github.com/welpo/tabi/issues/465)) by [@Nizzlay](https://github.com/Nizzlay)
+- Show feed icon without socials ([de6fa58](https://github.com/welpo/tabi/commit/de6fa58fe3b276c12f16f9ddc1cf9f93269161f9)) by [@welpo](https://github.com/welpo)
+- Add separator between update date & remote changes link ([2cc336d](https://github.com/welpo/tabi/commit/2cc336d9d0f7019015a356242230f0568658a523)) by [@welpo](https://github.com/welpo)
+- Support relative paths in inherited social media card ([#432](https://github.com/welpo/tabi/issues/432)) by [@welpo](https://github.com/welpo)
+
+### 💄 Styling
+
+- *(admonitions)* Fix external link icon ([2b106b7](https://github.com/welpo/tabi/commit/2b106b7c628e01046495a3add7a9ec4cc00b9fa3)) by [@welpo](https://github.com/welpo)
+- Increase emoji favicon size ([d777d5d](https://github.com/welpo/tabi/commit/d777d5d99679ab609bebb89726aef80562b30d87)) by [@welpo](https://github.com/welpo)
+- Remove extra whitespace in post metadata ([dbb0e82](https://github.com/welpo/tabi/commit/dbb0e826b6572531d4c44bdb031d68207a906666)) by [@welpo](https://github.com/welpo)
+- Use text-colour for hover on `rt` in links ([a6b6c32](https://github.com/welpo/tabi/commit/a6b6c3205096fd718757a6f32ff07d60bcc22808)) by [@welpo](https://github.com/welpo)
+- Fix home banner layout for short intro ([#438](https://github.com/welpo/tabi/issues/438)) by [@welpo](https://github.com/welpo)
+- Fix numbered code blocks on iOS Safari ([4be8a56](https://github.com/welpo/tabi/commit/4be8a5634fa2990825e9bc785029c4dddb340c39)) by [@welpo](https://github.com/welpo)
+- Fix numbered code blocks ([#437](https://github.com/welpo/tabi/issues/437)) by [@welpo](https://github.com/welpo)
+- Retain base code block style in admonitions ([557ea77](https://github.com/welpo/tabi/commit/557ea7786ffbad75fafdd69d864d6073fd1dadbc)) by [@welpo](https://github.com/welpo)
+
+### 📝 Documentation
+
+- *(README)* Fix typo ([#457](https://github.com/welpo/tabi/issues/457)) by [@Olexandr88](https://github.com/Olexandr88)
+- *(README)* Add maintenance badges ([4834a9e](https://github.com/welpo/tabi/commit/4834a9e85ff89f1678374752289116bce6f3a076)) by [@welpo](https://github.com/welpo)
+- *(demo)* Basic Arabic translation ([#390](https://github.com/welpo/tabi/issues/390)) by [@TheAwiteb](https://github.com/TheAwiteb) and [@welpo](https://github.com/welpo)
+- *(series)* Add tip for custom text permalinks ([4029657](https://github.com/welpo/tabi/commit/402965786beb942aab0922de68cd98952f9a9be0)) by [@welpo](https://github.com/welpo)
+- *(shortcodes)* Clarify aside usage ([1dcd615](https://github.com/welpo/tabi/commit/1dcd615615b492dffc00c34bd7e1bbc680cf95fd)) by [@welpo](https://github.com/welpo)
+- *(shortcodes)* Clarify `position` parameter usage for "aside" ([da1b6bb](https://github.com/welpo/tabi/commit/da1b6bb0cc7719f3de23a6855d80dc0262d5c025)) by [@welpo](https://github.com/welpo)
+- Suggest MathML in lieu of KaTeX for JS-free math ([eb03953](https://github.com/welpo/tabi/commit/eb0395352caffab67f1ad9b81aab51824e9feb54)) by [@welpo](https://github.com/welpo)
+- Add tabi-start integration ([#441](https://github.com/welpo/tabi/issues/441)) by [@welpo](https://github.com/welpo)
+
+### ♻️ Refactor
+
+- Only show project tag filter with 2 or more tags ([180fc53](https://github.com/welpo/tabi/commit/180fc533844ec3427c447f7040ea837520c4fe5d)) by [@welpo](https://github.com/welpo)
+
+### 🔧 Miscellaneous tasks
+
+- *(CI)* Add concurrency control to sumi action ([47ea26d](https://github.com/welpo/tabi/commit/47ea26db97cfbd87518ab00b892fdbb245577535)) by [@welpo](https://github.com/welpo)
+- *(CI)* Add dependencies label to upgrade PRs ([551b3d2](https://github.com/welpo/tabi/commit/551b3d28c6852c3a1e7acf3c645e0d7b84e079cb)) by [@welpo](https://github.com/welpo)
+- *(CI)* Ignore deleted files in pre-commit ([f93def0](https://github.com/welpo/tabi/commit/f93def0692146a15b63d19406ec1180b9e41ba3d)) by [@welpo](https://github.com/welpo)
+- *(README)* Add idle-ti.me blog to sites using tabi ([#479](https://github.com/welpo/tabi/issues/479)) by [@be-next](https://github.com/be-next)
+- *(README)* Add zzmzaw's blog to sites using tabi ([#469](https://github.com/welpo/tabi/issues/469)) by [@ZzMzaw](https://github.com/ZzMzaw)
+- *(README)* Add nizzlay.com to Sites using tabi ([#464](https://github.com/welpo/tabi/issues/464)) by [@Nizzlay](https://github.com/Nizzlay)
+- *(README)* Add szabolcs.me to Sites using tabi ([#451](https://github.com/welpo/tabi/issues/451)) by [@szabolcsf](https://github.com/szabolcsf)
+- *(README)* Set original colours for docs|up badge ([69713c9](https://github.com/welpo/tabi/commit/69713c973c11d7646c8fe56476261d96cc1978d8)) by [@welpo](https://github.com/welpo)
+- *(deps)* Check for existing branch upgrades ([29bbd2e](https://github.com/welpo/tabi/commit/29bbd2eecc97aaaa95c61f8fb736d1301042aa91)) by [@welpo](https://github.com/welpo)
+- *(docs)* Fix Series section headings ([0778212](https://github.com/welpo/tabi/commit/077821208f161e813da90c56db817b743bc211c4)) by [@welpo](https://github.com/welpo)
+- *(docs)* Use internal links in home description ([0b10560](https://github.com/welpo/tabi/commit/0b10560a94f4a0a4bcb8536ee0595e8c4f4df800)) by [@welpo](https://github.com/welpo)
+- *(projects)* Add nemui project ([11eb774](https://github.com/welpo/tabi/commit/11eb774bd74562a4628f87a130575281aa469918)) by [@welpo](https://github.com/welpo)
+- *(upgrade-deps)* Improve version detection ([0688628](https://github.com/welpo/tabi/commit/06886284202f670be2034dcedbf6130446b91436)) by [@welpo](https://github.com/welpo)
+- Add "shuku" project ([e1b6054](https://github.com/welpo/tabi/commit/e1b60542dfc3eb9bed39a92d3b7acfae88f32b84)) by [@welpo](https://github.com/welpo)
+- Add ずつ (zutsu) project page ([c6d1c3d](https://github.com/welpo/tabi/commit/c6d1c3dff844461c7c774882dec8a87d7d3ea548)) by [@welpo](https://github.com/welpo)
+- Fix dōteki docs link ([c15098a](https://github.com/welpo/tabi/commit/c15098a959242765353c7fab0906d1fc596c64c0)) by [@welpo](https://github.com/welpo)
+- Update git-sumi & dōteki projects ([6d44320](https://github.com/welpo/tabi/commit/6d44320f45bc381c65e370f8f03bf3525b59e05a)) by [@welpo](https://github.com/welpo)
+
+### 👥 New contributors
+
+🫶 [@stalkerGH](https://github.com/stalkerGH) made their first contribution in [#486](https://github.com/welpo/tabi/pull/486)
+
+🫶 [@stekershaw](https://github.com/stekershaw) made their first contribution in [#471](https://github.com/welpo/tabi/pull/471)
+
+🫶 [@Nizzlay](https://github.com/Nizzlay) made their first contribution in [#465](https://github.com/welpo/tabi/pull/465)
+
+🫶 [@Olexandr88](https://github.com/Olexandr88) made their first contribution in [#457](https://github.com/welpo/tabi/pull/457)
+
+🫶 [@wischi-chr](https://github.com/wischi-chr) made their first contribution in [#455](https://github.com/welpo/tabi/pull/455)
+
+🫶 [@szabolcsf](https://github.com/szabolcsf) made their first contribution in [#451](https://github.com/welpo/tabi/pull/451)
+
+## [3.1.0](https://github.com/welpo/tabi/compare/v3.0.0..v3.1.0) - 2024-11-14
+
+### ✨ Features
+
+- *(shortcodes)* Support body admonitions ([#423](https://github.com/welpo/tabi/issues/423)) by [@welpo](https://github.com/welpo)
+- Allow pinned posts with pagination ([#428](https://github.com/welpo/tabi/issues/428)) by [@welpo](https://github.com/welpo)
+- Add pinned posts functionality ([#424](https://github.com/welpo/tabi/issues/424)) by [@welpo](https://github.com/welpo)
+- Add series functionality ([#406](https://github.com/welpo/tabi/issues/406)) by [@ZzMzaw](https://github.com/ZzMzaw) and [@welpo](https://github.com/welpo)
+
+### 🐛 Bug fixes
+
+- Link to "All posts" in non-default-language root ([3b7fd3d](https://github.com/welpo/tabi/commit/3b7fd3db9c33fd3ca6114ca00fffa2a91f682a0a)) by [@welpo](https://github.com/welpo)
+- Isso comments in multilingual setups ([#427](https://github.com/welpo/tabi/issues/427)) by [@welpo](https://github.com/welpo)
+
+### 💄 Styling
+
+- Colour scrollbar to match primary colour ([#430](https://github.com/welpo/tabi/issues/430)) by [@welpo](https://github.com/welpo)
+- Set accent color to match theme ([#429](https://github.com/welpo/tabi/issues/429)) by [@welpo](https://github.com/welpo)
+- Fix info admonition code color ([5927409](https://github.com/welpo/tabi/commit/5927409c41e71d6943deee426fc75a94037cee36)) by [@welpo](https://github.com/welpo)
+- Improve navigation bar & metadata wrapping ([#425](https://github.com/welpo/tabi/issues/425)) by [@welpo](https://github.com/welpo)
+- Fix hover color for element in links ([87f1099](https://github.com/welpo/tabi/commit/87f1099caa8741bcacadf2aae2677a529395e454)) by [@welpo](https://github.com/welpo)
+- Add styling for keyboard input ([51fee5d](https://github.com/welpo/tabi/commit/51fee5d660232a1eafeb39f439fe5377f3f63406)) by [@welpo](https://github.com/welpo)
+
+### 📝 Documentation
+
+- *(README)* Fix typo ([#421](https://github.com/welpo/tabi/issues/421)) by [@ZzMzaw](https://github.com/ZzMzaw)
+- Highlight pinned posts feature ([c3c344a](https://github.com/welpo/tabi/commit/c3c344a76fb894ec87fc9896e7a0202788e001c5)) by [@welpo](https://github.com/welpo)
+- Clarify instructions for listing recent posts ([#418](https://github.com/welpo/tabi/issues/418)) ([3442fd9](https://github.com/welpo/tabi/commit/3442fd9ff0c0a093f08bb27aaa0d92e5993df29b)) by [@welpo](https://github.com/welpo)
+
+### ♻️ Refactor
+
+- *(GitHub)* Update issue templates ([5687f3b](https://github.com/welpo/tabi/commit/5687f3bacb6ed69ffbe4143e93b6c95ce8fb5c59)) by [@welpo](https://github.com/welpo)
+
+### 🔧 Miscellaneous tasks
+
+- *(CI)* Allow longer PR titles for dep updates ([e2c5c6e](https://github.com/welpo/tabi/commit/e2c5c6e9b749c3591af6a822eee65c1ee1854c01)) by [@welpo](https://github.com/welpo)
+- *(CI)* Allow longer PR titles for dep updates ([fa9f160](https://github.com/welpo/tabi/commit/fa9f16034241ccee6229ef0279b3b9bc65249cfa)) by [@welpo](https://github.com/welpo)
+- *(CI)* Allow longer PR titles for dep updates ([bd45a1a](https://github.com/welpo/tabi/commit/bd45a1ae45997b950c703d1ebf1e34b3b82173eb)) by [@welpo](https://github.com/welpo)
+- *(deps)* Remove local release script ([2e3cff2](https://github.com/welpo/tabi/commit/2e3cff2ef1ca8396c632de48b21174601d5ff46c)) by [@welpo](https://github.com/welpo)
+- *(projects)* Add ラム (ramu) project ([f300129](https://github.com/welpo/tabi/commit/f3001298c24d49d234247c9cce2a6c771778c1c3)) by [@welpo](https://github.com/welpo)
+- Change codeblock language from plaintext to txt ([57a0a8e](https://github.com/welpo/tabi/commit/57a0a8e1a09d586acdf5c72464d79328e0c9b27f)) by [@welpo](https://github.com/welpo)
+
+## [3.0.0](https://github.com/welpo/tabi/compare/v2.17.0..v3.0.0) - 2024-10-18
+
+### 💥 BREAKING CHANGES 💥
+
+- Force code blocks LTR rendering ([#412](https://github.com/welpo/tabi/issues/412)) ([092ccdd](https://github.com/welpo/tabi/commit/092ccdd1ba8bf08cc738664ba4fbe9e7a0ff282e)) by [@welpo](https://github.com/welpo)
+
+### ✨ Features
+
+- Add force_text_direction shortcode ([#414](https://github.com/welpo/tabi/issues/414)) ([c9f8d27](https://github.com/welpo/tabi/commit/c9f8d27b962217ff0fb09b30ec14aee65fe8518d)) by [@welpo](https://github.com/welpo)
+- [**‼️BREAKING‼️**] Force code blocks LTR rendering ([#412](https://github.com/welpo/tabi/issues/412)) ([092ccdd](https://github.com/welpo/tabi/commit/092ccdd1ba8bf08cc738664ba4fbe9e7a0ff282e)) by [@welpo](https://github.com/welpo)
+
+### 🐛 Bug fixes
+
+- Update CSP for GoatCounter ([#413](https://github.com/welpo/tabi/issues/413)) by [@noeddl](https://github.com/noeddl)
+
+### 📝 Documentation
+
+- *(CONTRIBUTING)* Fix broken link to commit message style ([11e246a](https://github.com/welpo/tabi/commit/11e246a876eef846e8c1e26add7331f25beb9c27)) by [@welpo](https://github.com/welpo)
+- *(mastering tabi)* Mention social links rel='me' ([5db70b7](https://github.com/welpo/tabi/commit/5db70b7978e7141be9396d3f69375a87b2d44ed2)) by [@welpo](https://github.com/welpo)
+
+### 🔧 Miscellaneous tasks
+
+- Update git-cliff variables to `commit.remote` ([0a36ef5](https://github.com/welpo/tabi/commit/0a36ef55ee092fe7bb1f8803c04a4cb8245b2a13)) by [@welpo](https://github.com/welpo)
+
+### 👥 New contributors
+
+🫶 [@noeddl](https://github.com/noeddl) made their first contribution in [#413](https://github.com/welpo/tabi/pull/413)
+
+## [2.17.0](https://github.com/welpo/tabi/compare/v2.16.0..v2.17.0) - 2024-10-10
+
+### ✨ Features
+
+- Add fediverse creator metadata support ([#409](https://github.com/welpo/tabi/issues/409)) by [@arichtman](https://github.com/arichtman), [@Ariel](https://github.com/Ariel) Richtman and [@welpo](https://github.com/welpo)
+
+### 🐛 Bug fixes
+
+- *(search)* Restore highlighting functionality ([#401](https://github.com/welpo/tabi/issues/401)) by [@welpo](https://github.com/welpo)
+- Set proper URL for self-hosted Umami ([#402](https://github.com/welpo/tabi/issues/402)) by [@soumendrak](https://github.com/soumendrak)
+
+### 📝 Documentation
+
+- Add mermaid shortcode usage ([#407](https://github.com/welpo/tabi/issues/407)) by [@ZzMzaw](https://github.com/ZzMzaw) and [@welpo](https://github.com/welpo)
+- Update comment in config.toml RE: #402 ([c50edbd](https://github.com/welpo/tabi/commit/c50edbd453eca2f031bc97a5a25caa206644d568)) by [@welpo](https://github.com/welpo)
+
+### ♻️ Refactor
+
+- *(search)* Reduce search lag on mobile ([7ceada9](https://github.com/welpo/tabi/commit/7ceada974b7c3f2c52aaa5688af631c806901aed)) by [@welpo](https://github.com/welpo)
+
+### 🔧 Miscellaneous tasks
+
+- *(README)* Add jmbhughes.com to showcase ([#404](https://github.com/welpo/tabi/issues/404)) by [@jmbhughes](https://github.com/jmbhughes)
+- *(deps)* Replace local release script w/ git submodule ([66239be](https://github.com/welpo/tabi/commit/66239bee016406c87a227b685eb70a464546e199)) by [@welpo](https://github.com/welpo)
+- *(deps)* Automate KaTeX/mermaid upgrades ([fc04ab4](https://github.com/welpo/tabi/commit/fc04ab4e40977bafa1b821c77e38554d287f69bc)) by [@welpo](https://github.com/welpo)
+- Reformat social card creation tip ([47fcee8](https://github.com/welpo/tabi/commit/47fcee8f81fb10bcd7cc042cc4a80dcada244b6d)) by [@welpo](https://github.com/welpo)
+
+### 👥 New contributors
+
+🫶 [@github-actions](https://github.com/github-actions)[bot] made their first contribution in [#405](https://github.com/welpo/tabi/pull/405)
+
+🫶 [@jmbhughes](https://github.com/jmbhughes) made their first contribution in [#404](https://github.com/welpo/tabi/pull/404)
+
+🫶 [@soumendrak](https://github.com/soumendrak) made their first contribution in [#402](https://github.com/welpo/tabi/pull/402)
+
+## [2.16.0](https://github.com/welpo/tabi/compare/v2.15.0..v2.16.0) - 2024-09-22
+
+### ✨ Features
+
+- *(remote_text shortcode)* Support line ranges ([#399](https://github.com/welpo/tabi/issues/399)) ([008b976](https://github.com/welpo/tabi/commit/008b976e06e0b93e021e2ca641eda42521e58f98)) by [@welpo](https://github.com/welpo)
+- *(remote_text shortcode)* Support relative paths ([#398](https://github.com/welpo/tabi/issues/398)) by [@welpo](https://github.com/welpo)
+
+## [2.15.0](https://github.com/welpo/tabi/compare/v2.14.0..v2.15.0) - 2024-09-20
+
+### ✨ Features
+
+- *(feed)* Make "Visit website" link context-aware ([#394](https://github.com/welpo/tabi/issues/394)) by [@welpo](https://github.com/welpo)
+- *(search)* Hide "clear search" icon if input is empty ([#388](https://github.com/welpo/tabi/issues/388)) by [@welpo](https://github.com/welpo)
+
+### 🐛 Bug fixes
+
+- *(feed)* Resolve Atom feed validation issues ([#393](https://github.com/welpo/tabi/issues/393)) by [@welpo](https://github.com/welpo)
+- Allow pages within pages ([#385](https://github.com/welpo/tabi/issues/385)) by [@welpo](https://github.com/welpo)
+- Improve dark mode and OS theme handling ([#380](https://github.com/welpo/tabi/issues/380)) by [@welpo](https://github.com/welpo)
+
+### 💄 Styling
+
+- Improve RTL styling consistency ([#381](https://github.com/welpo/tabi/issues/381)) by [@welpo](https://github.com/welpo)
+
+### 🔧 Miscellaneous tasks
+
+- *(README)* Add Ponderosa Games to showcase ([#395](https://github.com/welpo/tabi/issues/395)) by [@JVimes](https://github.com/JVimes)
+- *(deps)* Avoid masking return values ([1b11f4b](https://github.com/welpo/tabi/commit/1b11f4b321d0ae52179d88cc3ecd1b72ef2b37ae)) by [@welpo](https://github.com/welpo)
+- *(deps)* Check local deps version to early exit ([b5cbad4](https://github.com/welpo/tabi/commit/b5cbad422bc14f44a620bcbb87449f2425c16af6)) by [@welpo](https://github.com/welpo)
+- Set [@TheAwiteb](https://github.com/TheAwiteb) as owner of Arabic translation ([edb0873](https://github.com/welpo/tabi/commit/edb087392f2989b4f08122c81fa3e51d17fbb6b8)) by [@welpo](https://github.com/welpo)
+
+### 👥 New contributors
+
+🫶 [@JVimes](https://github.com/JVimes) made their first contribution in [#395](https://github.com/welpo/tabi/pull/395)
+
+## [2.14.0](https://github.com/welpo/tabi/compare/v2.13.0..v2.14.0) - 2024-09-08
+
+### ✨ Features
+
+- *(i18n)* Add Odia language ([#372](https://github.com/welpo/tabi/issues/372))
+- *(i18n)* Add Estonian language ([#365](https://github.com/welpo/tabi/issues/365)) by [@NippleOfAnApe](https://github.com/NippleOfAnApe)
+- Add Mermaid diagram support ([#370](https://github.com/welpo/tabi/issues/370)) by [@welpo](https://github.com/welpo)
+
+### 🐛 Bug fixes
+
+- *(RTL)* Fix blockquote style ([#368](https://github.com/welpo/tabi/issues/368)) by [@TheAwiteb](https://github.com/TheAwiteb) and [@welpo](https://github.com/welpo)
+- Reduce main page header/list sizes ([#375](https://github.com/welpo/tabi/issues/375)) by [@welpo](https://github.com/welpo)
+- Add missing quotes to HTML attributes ([#367](https://github.com/welpo/tabi/issues/367)) by [@DataTriny](https://github.com/DataTriny)
+
+### 💄 Styling
+
+- Use note admonition for TL;DR ([b9bf4b2](https://github.com/welpo/tabi/commit/b9bf4b2fd67c71647c0d2a1bd77dee8cb9e0ec49)) by [@welpo](https://github.com/welpo)
+
+### 📝 Documentation
+
+- *(mastering tabi)* Clarify prev/next links requirements ([6219b92](https://github.com/welpo/tabi/commit/6219b9200cfd544b999b064fabfa0ca37d4815d8)) by [@welpo](https://github.com/welpo)
+
+### ♻️ Refactor
+
+- *(footer)* Lazy load social icons ([9e7b845](https://github.com/welpo/tabi/commit/9e7b845e544758792831da520379e04089909b78)) by [@welpo](https://github.com/welpo)
+
+### 🔧 Miscellaneous tasks
+
+- *(deps)* Add KaTeX to dependency upgrade script ([001ec8f](https://github.com/welpo/tabi/commit/001ec8fc9a9524efbe4c3c04669fb64be4ed8efd)) by [@welpo](https://github.com/welpo)
+- *(deps)* Add script to upgrade mermaid ([d73c4bd](https://github.com/welpo/tabi/commit/d73c4bde5a12d434a595be877f4452fa0c20ae30)) by [@welpo](https://github.com/welpo)
+- *(release)* Ensure script is ran from default branch ([82f7a98](https://github.com/welpo/tabi/commit/82f7a984d54046a4f884461b3c5f52ac830661bf)) by [@welpo](https://github.com/welpo)
+- Add funding information ([8d22a42](https://github.com/welpo/tabi/commit/8d22a42e3fd5d909eaf90f7132e818b9c45f7b07)) by [@welpo](https://github.com/welpo)
+
+### 👥 New contributors
+
+🫶 @ made their first contribution in [#372](https://github.com/welpo/tabi/pull/372)
+
+🫶 [@DataTriny](https://github.com/DataTriny) made their first contribution in [#367](https://github.com/welpo/tabi/pull/367)
+
+🫶 [@NippleOfAnApe](https://github.com/NippleOfAnApe) made their first contribution in [#365](https://github.com/welpo/tabi/pull/365)
+
+## [2.13.0](https://github.com/welpo/tabi/compare/v2.12.0..v2.13.0) - 2024-07-24
+
+### ✨ Features
+
+- Follow user OS theme with JS disabled ([#357](https://github.com/welpo/tabi/issues/357)) by [@welpo](https://github.com/welpo)
+- Add date visibility options to post list ([#330](https://github.com/welpo/tabi/issues/330)) by [@sam9032](https://github.com/sam9032) and [@welpo](https://github.com/welpo)
+
+### 🐛 Bug fixes
+
+- *(header)* Render feed links based on config ([#358](https://github.com/welpo/tabi/issues/358)) by [@welpo](https://github.com/welpo)
+- *(post_listing_date)* Show original date for unedited articles ([#355](https://github.com/welpo/tabi/issues/355)) by [@sam9032](https://github.com/sam9032)
+- *(search)* Close modal when clicking current page result ([#350](https://github.com/welpo/tabi/issues/350)) by [@welpo](https://github.com/welpo)
+
+### 💄 Styling
+
+- *(error)* Enhance visibility of Zola errors ([#359](https://github.com/welpo/tabi/issues/359)) by [@welpo](https://github.com/welpo)
+- Match footnote backlinks size on Zola v0.19 ([0f18ac2](https://github.com/welpo/tabi/commit/0f18ac264df8b9766c4d431dfd37f5f5799f3834)) by [@welpo](https://github.com/welpo)
+
+### 📝 Documentation
+
+- *(mastering tabi)* Fix broken image ([1111631](https://github.com/welpo/tabi/commit/1111631325e3ebf8ae3a2f6cd18492cfc5aa44c2)) by [@welpo](https://github.com/welpo)
+- Mention custom Twitter card & automatic OG tags ([fbb81f9](https://github.com/welpo/tabi/commit/fbb81f976433d93ee3787f4a9d5c6c3049f815a2)) by [@welpo](https://github.com/welpo)
+- Deprecate JS footnote backlinks ([ced0cb4](https://github.com/welpo/tabi/commit/ced0cb43b6b4b4f6fba583990e428ddedbf52af3)) by [@welpo](https://github.com/welpo)
+- Fix broken internal links ([4145364](https://github.com/welpo/tabi/commit/4145364e085929ae9c09ccb908a0bae77a0b7520)) by [@welpo](https://github.com/welpo)
+
+### 🔧 Miscellaneous tasks
+
+- *(release)* Add error handling function ([9585843](https://github.com/welpo/tabi/commit/9585843b14131843775e41df67fe9cc60c95a2ea)) by [@welpo](https://github.com/welpo)
+- *(release)* Ensure local repository is in good state ([617a940](https://github.com/welpo/tabi/commit/617a940cf823917bc86df5f05350236c40560dc0)) by [@welpo](https://github.com/welpo)
+
+### 👥 New contributors
+
+🫶 [@sam9032](https://github.com/sam9032) made their first contribution in [#355](https://github.com/welpo/tabi/pull/355)
+
+🫶 [@renovate](https://github.com/renovate)[bot] made their first contribution in [#345](https://github.com/welpo/tabi/pull/345)
+
+## [2.12.0](https://github.com/welpo/tabi/compare/v2.11.0..v2.12.0) - 2024-06-29
+
+### ✨ Features
+
+- *(admonitions)* Allow swapping admonition icons ([#340](https://github.com/welpo/tabi/issues/340)) by [@welpo](https://github.com/welpo)
+- *(socials)* Add Debian icon ([82ecbc1](https://github.com/welpo/tabi/commit/82ecbc145489bf4415d7a3500be85191524d1b53)) by [@welpo](https://github.com/welpo)
+- Allow sorting tags based on post count ([#344](https://github.com/welpo/tabi/issues/344)) by [@metaleap](https://github.com/metaleap) and [@welpo](https://github.com/welpo)
+- Add option to use sans-serif font everywhere ([a907f56](https://github.com/welpo/tabi/commit/a907f56bd568378b099c0706fa4c92d7102b1688)) by [@welpo](https://github.com/welpo)
+
+### 📝 Documentation
+
+- *(mastering tabi)* Clarify post sorting in Archive ([c9c8ed8](https://github.com/welpo/tabi/commit/c9c8ed84a00136469a53d30b6e694b6cb845c5fa)) by [@welpo](https://github.com/welpo)
+
+### ♻️ Refactor
+
+- Improve "Last updated on" format ([#342](https://github.com/welpo/tabi/issues/342)) by [@welpo](https://github.com/welpo)
+
+### 👥 New contributors
+
+🫶 [@metaleap](https://github.com/metaleap) made their first contribution in [#344](https://github.com/welpo/tabi/pull/344)
+
## [2.11.0](https://github.com/welpo/tabi/compare/v2.10.0..v2.11.0) - 2024-06-24
### ✨ Features
-- *(socials)* Add bluesky icon ([#333](https://github.com/welpo/tabi/issues/333)) by [@gacallea](https://github.com/gacallea)
+- *(socials)* Add bluesky icon ([#333](https://github.com/welpo/tabi/issues/333)) by [@andreacfromtheapp](https://github.com/andreacfromtheapp)
- Allow HTML tags in multilingual quote author ([be7628a](https://github.com/welpo/tabi/commit/be7628aeaa573b69739a2751e93d77da0b587124)) by [@welpo](https://github.com/welpo)
### 🐛 Bug fixes
@@ -32,7 +430,7 @@ We use Semantic Versioning (SemVer) for our version numbers, formatted as MAJOR.
### 👥 New contributors
-🫶 [@gacallea](https://github.com/gacallea) made their first contribution in [#333](https://github.com/welpo/tabi/pull/333)
+🫶 [@andreacfromtheapp](https://github.com/andreacfromtheapp) made their first contribution in [#333](https://github.com/welpo/tabi/pull/333)
## [2.10.0](https://github.com/welpo/tabi/compare/v2.9.0..v2.10.0) - 2024-05-30
@@ -174,6 +572,10 @@ We use Semantic Versioning (SemVer) for our version numbers, formatted as MAJOR.
- *(release)* Replace both pull and issue links ([e951e95](https://github.com/welpo/tabi/commit/e951e951102249707a4c899f0d194b781c3466d2)) by [@welpo](https://github.com/welpo)
+### 👥 New contributors
+
+🫶 [@be-next](https://github.com/be-next) made their first contribution in [#284](https://github.com/welpo/tabi/pull/284)
+
## [2.4.0](https://github.com/welpo/tabi/compare/v2.3.0..v2.4.0) - 2024-03-02
### ✨ Features
@@ -266,6 +668,10 @@ We use Semantic Versioning (SemVer) for our version numbers, formatted as MAJOR.
- Update changelog sections ([0e6c5c2](https://github.com/welpo/tabi/commit/0e6c5c269177712ae58649fe24662b407315d3f1)) by [@welpo](https://github.com/welpo)
- Add continuous deployment workflow ([9b8b139](https://github.com/welpo/tabi/commit/9b8b1396cfaeefd61050cdf49bf81f01977e5899)) by [@welpo](https://github.com/welpo)
+### 👥 New contributors
+
+🫶 [@TheAwiteb](https://github.com/TheAwiteb) made their first contribution in [#264](https://github.com/welpo/tabi/pull/264)
+
## [2.1.0](https://github.com/welpo/tabi/compare/v2.0.0..v2.1.0) - 2024-01-29
### ✨ Features
@@ -276,6 +682,10 @@ We use Semantic Versioning (SemVer) for our version numbers, formatted as MAJOR.
- *(README)* Add CSS code block setup in required config ([c9d6b62](https://github.com/welpo/tabi/commit/c9d6b629078f70f4392818a17a4a7ac6b11c0480)) by [@welpo](https://github.com/welpo)
+### 👥 New contributors
+
+🫶 [@andwati](https://github.com/andwati) made their first contribution in [#257](https://github.com/welpo/tabi/pull/257)
+
## [2.0.0](https://github.com/welpo/tabi/compare/v1.0.0..v2.0.0) - 2024-01-15
### 💥 BREAKING CHANGES 💥
@@ -315,6 +725,10 @@ We use Semantic Versioning (SemVer) for our version numbers, formatted as MAJOR.
- *(home-banner)* [**‼️BREAKING‼️**] Force proper header.img path ([#254](https://github.com/welpo/tabi/issues/254)) by [@welpo](https://github.com/welpo)
- *(i18n)* [**‼️BREAKING‼️**] Force config.toml copyright translation ([#255](https://github.com/welpo/tabi/issues/255)) ([9f39b7f](https://github.com/welpo/tabi/commit/9f39b7fe47721eb7aaea04d8b9ee66b557b7eabf)) by [@welpo](https://github.com/welpo)
+### 👥 New contributors
+
+🫶 [@arichtman](https://github.com/arichtman) made their first contribution in [#231](https://github.com/welpo/tabi/pull/231)
+
## 1.0.0 - 2023-12-29
### 💥 BREAKING CHANGES 💥
@@ -855,16 +1269,30 @@ We use Semantic Versioning (SemVer) for our version numbers, formatted as MAJOR.
### 👥 New contributors
+🫶 [@welpo](https://github.com/welpo) made their first contribution
+
+🫶 [@ZzMzaw](https://github.com/ZzMzaw) made their first contribution in [#215](https://github.com/welpo/tabi/pull/215)
+
🫶 [@joberthrogers18](https://github.com/joberthrogers18) made their first contribution in [#219](https://github.com/welpo/tabi/pull/219)
🫶 [@xvello](https://github.com/xvello) made their first contribution in [#218](https://github.com/welpo/tabi/pull/218)
🫶 [@donovanglover](https://github.com/donovanglover) made their first contribution in [#205](https://github.com/welpo/tabi/pull/205)
+🫶 [@nyadiia](https://github.com/nyadiia) made their first contribution in [#195](https://github.com/welpo/tabi/pull/195)
+
+🫶 [@Almost-Senseless-Coder](https://github.com/Almost-Senseless-Coder) made their first contribution in [#192](https://github.com/welpo/tabi/pull/192)
+
🫶 [@Jieiku](https://github.com/Jieiku) made their first contribution in [#173](https://github.com/welpo/tabi/pull/173)
+🫶 [@sandman](https://github.com/sandman) made their first contribution in [#170](https://github.com/welpo/tabi/pull/170)
+
+🫶 [@Smtbook](https://github.com/Smtbook) made their first contribution in [#166](https://github.com/welpo/tabi/pull/166)
+
🫶 [@SeaDve](https://github.com/SeaDve) made their first contribution in [#165](https://github.com/welpo/tabi/pull/165)
🫶 [@stevenroose](https://github.com/stevenroose) made their first contribution in [#124](https://github.com/welpo/tabi/pull/124)
+🫶 [@serginogal](https://github.com/serginogal) made their first contribution
+
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 0096eb4..42e6424 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -25,7 +25,7 @@ Working on your first Pull Request? You can learn how from this free video serie
Please make sure the following is done when submitting a pull request:
1. **Keep your PR small**. Small pull requests are much easier to review and more likely to get merged. Make sure the PR does only one thing, otherwise please split it.
-2. **Use descriptive titles**. It is recommended to follow this [commit message style](#conventional-commit-messages).
+2. **Use descriptive titles**. It is recommended to follow this [commit message style](#conventional-commit-messages-with-gitmoji).
3. **Test your changes**. Make sure to test different configurations that might affect your changes.
4. **Fill the PR template**. The template will guide you through the process of submitting a PR.
@@ -37,7 +37,7 @@ Format: ` (): `
`` is an emoji from the [gitmoji](https://gitmoji.dev/) list. It makes it easier to visually scan the commit history and quickly grasp the purpose of changes.
-`` is optional. If your change affects a specific part of the codebase, consider adding the scope. Scopes should be brief but recognizable, e.g. `config`, `gitmoji`, or `cli`.
+`` is optional. If your change affects a specific part of the codebase, consider adding the scope. Scopes should be brief but recognizable, e.g. `config`, `feed`, or `search`.
The various types of commits:
@@ -47,7 +47,7 @@ The various types of commits:
- `docs`: a change to the website or other Markdown documents.
- `refactor`: a change to code that doesn't change behaviour, e.g. splitting files, renaming internal variables, improving code style…
- `chore`: upgrading dependencies, releasing new versions… Chores that are **regularly done** for maintenance purposes.
-- `misc`: anything else that doesn't change production code, yet is not `test` or `chore`. e.g. updating GitHub actions workflow.
+- `misc`: anything else that doesn't change production code, yet is not `chore`. e.g. updating GitHub actions workflow.
The commits within your PR don't need to follow this convention (we'll [squash them](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/configuring-commit-squashing-for-pull-requests)). However, the PR title should be in this format. If you're not sure about the title, don't worry, we'll help you fix it. Your code is more important than conventions!
diff --git a/README.md b/README.md
index c35d43f..595f5f6 100644
--- a/README.md
+++ b/README.md
@@ -5,22 +5,29 @@
-
+
-
+
+
+
+
+
-# tabi
+# 🌱 tabi
-A fast, lightweight, and modern [Zola](https://www.getzola.org) theme with multi-language support. It aims to be a personal page and home to blog posts.
+An accessible [Zola](https://www.getzola.org) theme with [search](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#search), [multi-language support](https://welpo.github.io/tabi/blog/faq-languages/), [optional JavaScript](https://welpo.github.io/tabi/blog/javascript/), a perfect Lighthouse score, and [comprehensive documentation](https://welpo.github.io/tabi). Crafted for personal websites and blogs.
+
+> [!TIP]
+> Want to start blogging right away? Use the [tabi-start template](https://github.com/welpo/tabi-start) to get a complete site up and running in minutes.
See a live preview (and the theme's documentation) [here](https://welpo.github.io/tabi).
@@ -38,13 +45,18 @@ tabi has a perfect score on Google's Lighthouse audit:
- [X] [Set any language as default](https://welpo.github.io/tabi/blog/faq-languages/#how-do-i-set-a-default-language-for-my-site). Set your base site to Chinese, Spanish, French, Hindi… or any [other supported language](/i18n). The theme's interface will be translated accordingly.
- [X] [Integration with remote repositories](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#git-repository-integration) on GitHub, GitLab, Gitea & Codeberg for commit history and showing the site source.
+- [X] [Series support](https://welpo.github.io/tabi/blog/series/) for creating sequential content like tutorials, courses, and multi-part stories.
- [X] Dark and light themes. Defaults to the OS setting, with a switcher in the navigation bar.
- [X] Thorough documentation. See [Mastering tabi Settings: A Comprehensive Guide](https://welpo.github.io/tabi/blog/mastering-tabi-settings/).
- [X] Perfect Lighthouse score (Performance, Accessibility, Best Practices and SEO).
- [X] [Comprehensive multi-language support](https://welpo.github.io/tabi/blog/faq-languages/#how-does-tabi-handle-multilingual-support). Add as many languages as you wish.
- [X] Support for [comments using giscus, utterances, Hyvor Talk, or Isso](https://welpo.github.io/tabi/blog/comments/).
+- [X] [Indieweb](https://indieweb.org/) ready with microformats, [hcard](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#representative-h-card) and [webmentions](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#webmentions) support.
- [X] Code syntax highlighting with colours based on [Catppuccin](https://github.com/catppuccin/catppuccin) Frappé.
+- [X] [Mermaid support](https://welpo.github.io/tabi/blog/shortcodes/#mermaid-diagrams) to create diagrams and charts with text.
- [X] [Local search](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#search) with an accessible, multi-lingual interface.
+- [X] [Custom Twitter card](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#social-media-cards) and automatic Open Graph tags.
+- [X] Anonymous [like buttons](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#iine) powered by [iine](https://iine.to).
- [X] [KaTeX](https://katex.org/) support for mathematical notation.
- [X] [Stylized and human readable Atom feed](https://welpo.github.io/tabi/atom.xml).
- [X] [Stylized and human readable sitemap](https://welpo.github.io/tabi/sitemap.xml).
@@ -58,16 +70,21 @@ tabi has a perfect score on Google's Lighthouse audit:
- [X] [Custom canonical URLs](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#canonical-url).
- [X] [Custom shortcodes](https://welpo.github.io/tabi/blog/shortcodes/).
- [X] [Customizable skins](https://welpo.github.io/tabi/blog/customise-tabi/).
-- [X] [Footnote backlinks](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#footnote-backlinks).
- [X] [Social media cards](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#social-media-cards).
- [X] Responsive design.
- [X] [Projects page](https://welpo.github.io/tabi/projects/).
- [X] [Archive page](https://welpo.github.io/tabi/archive/).
+- [X] [Pinned posts](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#pinning-posts).
- [X] [Social links](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#social-media-icons).
- [X] [Tags](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#tags).
## Installation
+> [!NOTE]
+> The fastest way to create a new site is to use the [tabi-start template](https://github.com/welpo/tabi-start). This gives you a complete blog setup with all the essential configuration ready to go.
+
+### Manual installation
+
To add tabi to you existing Zola site:
0. Initialize a Git repository in your project directory (if you haven't already):
@@ -110,24 +127,40 @@ highlight_code = true
highlight_theme = "css"
```
-5. Create a `content/_index.md` file with the following content:
+5. Create a `content/_index.md` file. This file controls how your home page looks and behaves. Choose one of the following options:
-```
-+++
-title = "Home"
-paginate_by = 5 # Set the number of posts per page
-template = "index.html"
-+++
-```
+ **Option A: Serve posts from `/`**:
-If you want to serve your blog posts from a different path, such as `blog/`, add a `section_path` in the `[extra]` section of `content/_index.md` (this file will need pagination):
+ ```
+ +++
+ title = "Home"
+ paginate_by = 5 # Show 5 posts per page.
+ +++
+ ```
-```
-[extra]
-section_path = "blog/_index.md"
-```
+ - This will display posts in `content/` with pagination.
-**Note**: use the full path to the section's `_index.md` file. Simply using `section_path = "blog/"` will not work.
+ **Option B: Serve posts from a different path (e.g., `blog/`)**:
+
+ ```
+ +++
+ title = "Home"
+ # Note we're not setting `paginate_by` here.
+
+ [extra]
+ section_path = "blog/_index.md" # Where to find your posts.
+ max_posts = 5 # Show 5 posts on the home page.
+ +++
+ ```
+
+ - This will display the latest 5 posts from the `blog/` section.
+ - Do not set `paginate_by` if you choose this option.
+ - Use the full path to the section's `_index.md` file. Using `section_path = "blog/"` will not work.
+
+> [!WARNING]
+> Do not set both `paginate_by` and `section_path` in `content/_index.md`.
+>
+> These settings are mutually exclusive and using both may result in no posts being displayed.
6. If you want an introduction section (see screenshot above), add these lines to `content/_index.md`:
@@ -174,21 +207,37 @@ git pull
| Website | Creator | Description | Site Source |
| - | - | - | - |
| [osc.garden](https://osc.garden) | Óscar Fernández ([welpo](https://github.com/welpo)) | Data science, psychology, and Zola | [Source](https://github.com/welpo/osc.garden) |
-| [sandip.live](https://sandip.live) | Sandip G ([sandman](https://github.com/sandman)) | Startups, tech and the good life | [Source](https://github.com/sandman/sandman.github.io) |
| [seadve.github.io](https://seadve.github.io/) | Dave Patrick Caberto ([SeaDve](https://github.com/SeaDve/)) | Personal blog and portfolio with custom CSS | [Source](https://github.com/SeaDve/seadve.github.io) |
| [mikufan.page](https://mikufan.page) | [Nadia](https://github.com/nyadiia) | Personal blog | [Source](https://github.com/nyadiia/mikufan.page) |
| [tim-boettcher.online](https://tim-boettcher.online/) | [Tim Böttcher](https://codeberg.org/Tim-Boettcher/) | Insights and ramblings of a deafblind programmer | [Source](https://codeberg.org/Tim-Boettcher/tim-boettcher-online/) |
| [www.richtman.au](https://www.richtman.au) | [Ariel Richtman](https://github.com/arichtman) | Personal tech blog | [Source](https://github.com/arichtman/www.richtman.au) |
+| [Ponderosa Games](https://ponderosagames.com/) | John Burak ([JVimes](https://github.com/jvimes)) | A friendly indie game company | — |
+| [jmbhughes.com](https://jmbhughes.com/) | Marcus Hughes ([jmbhughes](https://github.com/jmbhughes)) | Personal blog | [Source](https://github.com/jmbhughes/jmbhughes.github.io) |
+| [szabolcs.me](https://szabolcs.me) | Szabolcs Fazekas ([szabolcsf](https://github.com/szabolcsf)) | Personal blog | [Source](https://github.com/szabolcsf/szabolcs.me) |
+| [Nizzlay](https://nizzlay.com) | Niels Gouman ([Nizzlay](https://github.com/Nizzlay)) | Personal blog | [Source](https://github.com/Nizzlay/nizzlay.com) |
+| [ZzMzaw's blog](https://zzmzaw.github.io/) | ZzMzaw ([ZzMzaw](https://github.com/ZzMzaw)) | Personal blog | [Source](https://github.com/ZzMzaw/zzmzaw.github.io) |
+| [idle-ti.me](https://idle-ti.me/) | Jérôme Ramette ([be-next](https://github.com/be-next)) | Personal blog | [Source](https://github.com/be-next/idle-ti.me) |
+| [tzinm.me](https://tzinm.me/) | [Tzinm](https://github.com/tzinm) | Personal blog | [Source](https://codeberg.org/tzinm/blog) |
+| [b1n.io](https://b1n.io) | [b1nhack](https://github.com/b1nhack) | Linux kernel vulnerability researcher | [Source](https://github.com/b1nhack/blog) |
+| [posixlycorrect.com](https://posixlycorrect.com/) | [Fabian Montero](https://git.posixlycorrect.com/fabian) | Personal homepage | [Source](https://git.posixlycorrect.com/fabian/homepage) |
Using tabi? Feel free to create a PR and add your site to this list.
## Inspiration
This theme was inspired by:
-- [shadharon](https://github.com/syedzayyan/shadharon) — tabi started as a fork of [syedzayyan](https://github.com/syedzayyan)'s theme;
-- [tailwind-nextjs-starter-blog](https://github.com/timlrx/tailwind-nextjs-starter-blog);
-- [abridge](https://github.com/Jieiku/abridge);
-- [internetVin's blog](https://internetvin.ghost.io).
+
+- [shadharon](https://github.com/syedzayyan/shadharon) — tabi started as a fork of [syedzayyan](https://github.com/syedzayyan)'s theme
+- [tailwind-nextjs-starter-blog](https://github.com/timlrx/tailwind-nextjs-starter-blog)
+- [abridge](https://github.com/Jieiku/abridge)
+
+## Support
+
+Something not working? Have an idea? Let us know!
+
+- Questions? → [Start a discussion](https://github.com/welpo/tabi/discussions)
+- Found a bug? → [Report it here](https://github.com/welpo/tabi/issues/new?&labels=bug&template=2_bug_report.yml)
+- Feature request? → [Tell us more!](https://github.com/welpo/tabi/issues/new?&labels=feature&template=3_feature_request.yml)
## Contributing
diff --git a/cliff.toml b/cliff.toml
index 360bd75..9e9dc97 100644
--- a/cliff.toml
+++ b/cliff.toml
@@ -37,7 +37,7 @@ body = """
{% macro commit(commit, in_breaking_section=false) -%}
- {% if commit.scope %}*({{ commit.scope }})* {% endif %}{% if commit.breaking and not in_breaking_section %}[**‼️BREAKING‼️**] {% endif %}\
{{ commit.message | upper_first }}\
- {% if not commit.github.pr_number %} ([{{ commit.id | truncate(length=7, end="") }}]({{ self::remote_url() }}/commit/{{ commit.id }})){%- endif -%}{% if commit.github.username %} by @{{ commit.github.username }} \
+ {% if not commit.remote.pr_number %} ([{{ commit.id | truncate(length=7, end="") }}]({{ self::remote_url() }}/commit/{{ commit.id }})){%- endif -%}{% if commit.remote.username %} by @{{ commit.remote.username }} \
{%- set co_authors = commit.footers | filter(attribute="token", value="Co-authored-by") | map(attribute="value") -%}
{%- set number_of_co_authors = co_authors | length -%}
{%- for co_author in co_authors -%}
diff --git a/config.toml b/config.toml
index fd3332b..a62acbe 100644
--- a/config.toml
+++ b/config.toml
@@ -1,14 +1,14 @@
base_url = "https://welpo.github.io/tabi"
title = "~/tabi"
-description = "tabi is a fast, lightweight, and modern Zola theme with multi-language support, optional JavaScript, and a perfect Lighthouse score."
+description = "tabi is an accessible Zola theme with search, multi-language support, optional JavaScript, a perfect Lighthouse score, and comprehensive documentation. Crafted for personal websites and blogs."
author = "welpo"
-generate_feed = true
+generate_feeds = true
compile_sass = true
minify_html = true
build_search_index = true
-# To translate the entire theme, there must be a file with the same ISO 639-1
-# (or IETF BCP 47) Code in the `i18n` folder of your site or the tabi theme
+# To translate the entire theme, there must be a file with the same language code
+# in the `i18n` folder of your site or the tabi theme.
# For example, "i18n/fr.toml" for French or "i18n/zh-Hans.toml" for Simplified Chinese.
# Otherwise the theme will be in English.
# See https://welpo.github.io/tabi/blog/faq-languages/ for more details.
@@ -28,15 +28,18 @@ include_content = true
# At which character to truncate the content to. Useful if you have a lot of pages and the index would
# become too big to load on the site. Defaults to not being set.
# truncate_content_length = 100
-# Wether to produce the search index as a javascript file or as a JSON file.
+# Whether to produce the search index as a javascript file or as a JSON file.
# Accepted value "elasticlunr_javascript" or "elasticlunr_json".
index_format = "elasticlunr_json"
[markdown]
highlight_code = true
+bottom_footnotes = true
# To use a Zola built-in theme, CSP needs to allow unsafe-inline for style-src.
highlight_theme = "css"
smart_punctuation = true
+# Set to 'external' to add an indicator next to external links.
+external_links_class = "external"
[link_checker]
internal_level = "warn"
@@ -49,17 +52,24 @@ skip_anchor_prefixes = [
[languages.es]
title = "~/tabi"
-description = "tabi es un tema de Zola rápido, liviano y moderno con JavaScript opcional y una puntuación perfecta en Lighthouse."
-generate_feed = true
+description = "tabi es un tema accesible para Zola con búsqueda, soporte multilingüe, JavaScript opcional, una puntuación perfecta en Lighthouse y documentación exhaustiva. Diseñado para sitios web y blogs personales."
+generate_feeds = true
taxonomies = [{name = "tags", feed = true}]
build_search_index = true
[languages.ca]
title = "~/tabi"
-description = "tabi és un tema de Zola ràpid, lleuger i modern amb JavaScript opcional i una puntuació perfecta a Lighthouse."
-generate_feed = true
+description = "tabi és un tema accessible per a Zola amb cerca, suport multilingüe, JavaScript opcional, una puntuació perfecta a Lighthouse i documentació exhaustiva. Dissenyat per a llocs web i blogs personals."
+generate_feeds = true
taxonomies = [{name = "tags", feed = true}]
+[languages.ar]
+title = "~/تابي"
+description = "تابي هو قالب Zola سريع وحديث مع دعم متعدد اللغات و JavaScript اختياري ودرجة Lighthouse مثالية."
+generate_feeds = true
+taxonomies = [{name = "tags", feed = true}]
+build_search_index = false
+
[extra]
# Check out the documentation (or the comments below) to learn how to customise tabi:
# https://welpo.github.io/tabi/blog/mastering-tabi-settings/
@@ -71,12 +81,16 @@ taxonomies = [{name = "tags", feed = true}]
# index_format = "elasticlunr_javascript"
# index_format = ""
+# Use sans-serif font everywhere.
+# By default, the serif font is only used in articles.
+override_serif_with_sans = false
+
# Enable JavaScript theme toggler to allow users to switch between dark/light mode.
-# If disabled, your site will only use the theme specified in the `default_theme` variable.
+# If disabled, your site will use the theme specified in the `default_theme` variable.
theme_switcher = true
# This setting determines the default theme on load ("light" or "dark").
-# To default to the user's OS-level theme, leave it empty or unset.
+# To follow the user's OS theme, leave it empty or unset.
default_theme = ""
# Choose the colourscheme (skin) for the theme. Default is "teal".
@@ -94,6 +108,9 @@ skin = ""
browser_theme_color = "#087e96"
# browser_theme_color = ["#ffffff", "#000000"] # Example of light/dark colours.
+# For multilingual sites: show current language code on the language switcher.
+show_selected_language_code_in_language_switcher = false
+
# List additional stylesheets to load site-wide.
# These stylesheets should be located in your site's `static` directory.
# Example: stylesheets = ["extra1.css", "path/extra2.css"]
@@ -121,13 +138,18 @@ show_remote_changes = true # Defaults to true.
# Show a link to the repository of the site, right next to the "Powered by Zola & tabi" text.
show_remote_source = true # Defaults to true.
-# Add a "copy" button to codeblocks (loads ~700 bytes of JavaScript).
+# Add a "copy" button to code blocks (loads ~700 bytes of JavaScript).
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
copy_button = true
-# Loads the necessary JavaScript (~400 bytes) to use the "Show source or path" shortcode: https://welpo.github.io/tabi/blog/shortcodes/#show-source-or-path
+# Make code block names clickable if they are URLs (loads ~400 bytes of JavaScript).
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
-add_src_to_code_block = false
+code_block_name_links = false
+
+# Force left-to-right (LTR) direction for code blocks.
+# Set to false to allow code to follow the document's natural direction.
+# Can be set at page or section levels. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
+force_codeblock_ltr = true
# Show the author(s) of a page.
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
@@ -141,6 +163,32 @@ show_reading_time = true
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
show_date = true
+# Determines how dates are displayed in the post listing (e.g. front page or /blog). Options:
+# "date" - Show only the original date of the post (default if unset).
+# "updated" - Show only the last updated date of the post. If there is no last updated date, it shows the original date.
+# "both" - Show both the original date and the last updated date.
+post_listing_date = "date"
+
+# Enable iine like buttons on all posts: https://iine.to/
+# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
+iine = true
+iine_icon = "thumbs_up" # See https://iine.to/#customise
+# Unify like counts across all language versions of the same page.
+# When enabled, likes on /es/blog/hello/ will count towards /blog/hello/ (default language).
+iine_unified_languages = true
+
+# Show "Jump to posts" link next to series' title.
+# By default, the link appears automatically when a series description exceeds 2000 characters.
+# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
+# show_jump_to_posts = true
+
+# Determines if indexes should be increasing (false) or decreasing (true) in series' posts list.
+# It has only effect if the section uses indexes metadata (which is only the case for series as of now).
+# Can be set at section levels, following the hierarchy: section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
+post_listing_index_reversed = false # Defaults to false.
+
+# DEPRECATED!
+# Use Zola's built-in `bottom_footnotes = true` in the [markdown] section instead. (Available since v0.19.0)
# Adds backlinks to footnotes (loads ~500 bytes of JavaScripts).
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
footnote_backlinks = false
@@ -149,6 +197,16 @@ footnote_backlinks = false
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
katex = false
+# Enable Mermaid diagrams for all posts.
+# Loads ~2.5MB of JavaScript.
+# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
+mermaid = false
+
+# Serve Mermaid JavaScript locally. Version bundled with tabi.
+# If set to false, it will load the latest version from JSDelivr.
+# Only relevant when `mermaid = true`.
+serve_local_mermaid = true
+
# Show links to previous and next articles at the bottom of posts.
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
show_previous_next_article_links = false
@@ -180,6 +238,17 @@ long_date_format = "%d %B %Y"
# Default is "6th July 2049" in English and "%-d %B %Y" in other languages.
short_date_format = ""
+# Date format used for the archive page.
+# Default is "06 July" in English and "%d %b" in other languages.
+archive_date_format = ""
+
+# Per-language date format overrides.
+# Examples: Spanish uses "3 de febrero de 2024", German uses "3. Februar 2024"
+date_formats = [
+ { lang = "es", long = "%d de %B de %Y", short = "%-d %b %Y" },
+ { lang = "de", long = "%d. %B %Y", short = "%d.%m.%Y", archive = "%d. %b" },
+]
+
# Custom separator used in title tag and posts metadata (between date, time to read, and tags).
separator = "•"
@@ -188,6 +257,17 @@ separator = "•"
# Compact: tag_name^n (superscript number)
compact_tags = false
+# How tags are sorted in a Tags listing based on templates/tags/list.html.
+# "name" for alphabetical, "frequency" for descending count of posts.
+# Default: "name".
+tag_sorting = "name"
+
+# Show clickable tags above cards.html template (e.g. projects/) to filter the displayed items.
+# Loads JS to filter. If JS is disabled, the buttons are links to the tag's page.
+# Can be set at the section or config.toml level, following the hierarchy: section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
+# Default: true
+enable_cards_tag_filtering = true
+
# Invert the order of the site title and page title in the browser tab.
# Example: true => "Blog • ~/tabi", false => "~/tabi • Blog"
invert_title_order = false
@@ -203,7 +283,7 @@ favicon_emoji = "🌱"
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
# Learn how to create these images in batch and automatically:
# https://osc.garden/blog/automating-social-media-cards-zola/
-social_media_card = "social_cards/index.jpg"
+social_media_card = "index.jpg"
menu = [
{ name = "blog", url = "blog", trailing_slash = true },
@@ -239,6 +319,11 @@ socials = [
{ name = "spotify", url = "https://open.spotify.com/artist/5Hv2bYBhMp1lUHFri06xkE", icon = "spotify" },
]
+# Fediverse profile.
+# Adds metadata to feature the author's profile in Mastodon link previews.
+# Example: for @username@example.com, use:
+# fediverse_creator = { handle = "username", domain = "example.com" }
+
# Extra menu to show on the footer, below socials section.
footer_menu = [
{url = "about", name = "about", trailing_slash = true},
@@ -280,10 +365,14 @@ allowed_domains = [
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
enable_csp = true
-# Custom subset of characters for the header.
-# If set to true, the `static/custom_subset.css` file will be loaded first.
-# This avoids a flashing text issue in Firefox.
-# Please see https://welpo.github.io/tabi/blog/custom-font-subset/ to learn how to create this file.
+# Font subsetting configuration.
+# This feature helps prevent text flashing in Firefox when using custom fonts.
+# See: https://welpo.github.io/tabi/blog/custom-font-subset/
+# Enable or disable font subsetting completely, both built-in and custom subsets.
+enable_subset = true
+# Use a custom subset of characters for the header.
+# If true, tabi will load the `static/custom_subset.css` file.
+# If false, tabi will use the default language-specific subset (English or Spanish).
custom_subset = true
[extra.analytics]
@@ -295,7 +384,7 @@ service = "goatcounter"
# For GoatCounter, this is the code you choose during signup.
# For Umami, this is the website ID.
# For Plausible, this is the domain name (e.g. "example.com").
-# Note: Leave this field empty if you're self-hosting.
+# Note: Leave this field empty if you're self-hosting GoatCounter.
# id = "yourID"
# Optional: Specify the URL for self-hosted analytics instances.
@@ -305,6 +394,9 @@ service = "goatcounter"
# Leave this field empty if you're using the service's default hosting.
self_hosted_url = "https://tabi-stats.osc.garden"
+# Optional: For Umami, enable this option to respect users' Do Not Track (DNT) settings. The default is true.
+do_not_track = true
+
# giscus support for comments. https://giscus.app
# Setup instructions: https://welpo.github.io/tabi/blog/comments/#setup
[extra.giscus]
@@ -360,3 +452,69 @@ avatar = true
voting = true
page_author_hashes = "" # hash (or list of hashes) of the author.
lazy_loading = true # Loads when the comments are in the viewport (using the Intersection Observer API).
+
+[extra.webmentions]
+# To disable for a specific section or page, set webmentions = false in that page/section's front matter's [extra] section.
+enable = false
+# Specify the domain registered with webmention.io.
+domain = ""
+
+# The HTML ID for the object to fill in with the webmention data.
+# Defaults to "webmentions"
+# id = "webmentions"
+
+# data configuration for the webmention.min.js script
+# The base URL to use for this page. Defaults to window.location
+# page_url =
+
+# Additional URLs to check, separated by |s
+# add_urls
+
+# The maximum number of words to render in reply mentions.
+# wordcount = 20
+
+# The maximum number of mentions to retrieve. Defaults to 30.
+# max_webmentions = 30
+
+# By default, Webmentions render using the mf2 'url' element, which plays
+# nicely with webmention bridges (such as brid.gy and telegraph)
+# but allows certain spoofing attacks. If you would like to prevent
+# spoofing, set this to a non-empty string (e.g. "true").
+# prevent_spoofing
+
+# What to order the responses by; defaults to 'published'. See
+# https://github.com/aaronpk/webmention.io#api
+# sort_by
+
+# The order to sort the responses by; defaults to 'up' (i.e. oldest
+# first). See https://github.com/aaronpk/webmention.io#api
+# sort_dir
+
+# If set to a non-empty string (e.g. "true"), will display comment-type responses
+# (replies/mentions/etc.) as being part of the reactions
+# (favorites/bookmarks/etc.) instead of in a separate comment list.
+# comments_are_reactions = "true"
+
+# h-card configuration
+# Will identify you on the indieweb (see https://microformats.org/wiki/h-card)
+[extra.hcard]
+# Enable home page h-card.
+# enable = true
+# Add your email to the card if extra.email is set and not encoded.
+# with_mail = true
+# Add your social links ('socials' config) to the card.
+# with_social_links = true
+# Homepage url. Defaults to the value of 'base_url'.
+# homepage = "https://myhomepage.net"
+# avatar = "img/profile.webp"
+# Display name, default to the value of 'author'.
+# full_name = "John Doe"
+# Small bio, as shown on social media profiles.
+# biography = "Fond of the indieweb"
+#
+# You can add any property from https://microformats.org/wiki/h-card#Properties
+# Make sure to replace all '-' characters by '_'
+# Examples:
+# p_nickname = "nickname"
+# p_locality = "Bordeaux"
+# p_country_name = "France"
diff --git a/content/_index.ar.md b/content/_index.ar.md
new file mode 100644
index 0000000..4f8b6a4
--- /dev/null
+++ b/content/_index.ar.md
@@ -0,0 +1,18 @@
++++
+title = "أخر التدوينات"
+sort_by = "date"
+template = "section.html"
+
+[extra]
+header = {title = "اهلاً انا تابي~", img = "img/main.webp", img_alt = "أوسكار فرنانديز, كاتب السمة" }
+section_path = "blog/_index.ar.md"
+max_posts = 4
+projects_path = "projects/_index.ar.md"
+max_projects = 3
+show_projects_first = false
+social_media_card = "ar.jpg"
++++
+
+تابي هو قالب Zola سريع وعصري. يهدف ليكون صفحة ومدونة شخصية. يتميز بتقييم مثالي في Lighthouse، وتصميم متجاوب، وسمات داكنة وفاتحة، وشِفرات قصيرة مخصصة، والعديد من المميزات الأخرى.
+
+> ملاحظة: هذه الصفحة هي عرض توضيحي لدعم اللغة العربية في تابي. للحصول على التوثيق الكامل، يرجى الرجوع إلى [النسخة الإنجليزية](@/_index.md).
diff --git a/content/_index.ca.md b/content/_index.ca.md
index ed92599..a5da748 100644
--- a/content/_index.ca.md
+++ b/content/_index.ca.md
@@ -1,7 +1,6 @@
+++
title = "Publicacions recents"
sort_by = "date"
-template = "section.html"
[extra]
header = {title = "Hola! Soc tabi~", img = "img/main.webp", img_alt = "Óscar Fernández, l'autor de tabi" }
@@ -10,7 +9,7 @@ max_posts = 4
projects_path = "projects/_index.ca.md"
max_projects = 3
show_projects_first = false
-social_media_card = "social_cards/ca.jpg"
+social_media_card = "ca.jpg"
+++
-tabi és un tema de [Zola](https://www.getzola.org) ràpid, lleuger i modern. Té com a objectiu ser una pàgina personal i llar d'entrades de blog. Compta amb una puntuació perfecta de Lighthouse, disseny responsive, tema fosc i clar, shortcodes personalitzats i molt més.
+tabi és un tema accessible per a Zola amb [cerca](@/blog/mastering-tabi-settings/index.ca.md#cerca), [suport multilingüe](@/blog/faq-languages/index.ca.md), [JavaScript opcional](@/blog/javascript/index.ca.md), una puntuació perfecta a Lighthouse i documentació exhaustiva. Dissenyat per a llocs web i blogs personals.
diff --git a/content/_index.es.md b/content/_index.es.md
index 51b9e2b..53eb2e9 100644
--- a/content/_index.es.md
+++ b/content/_index.es.md
@@ -1,7 +1,6 @@
+++
title = "Publicaciones recientes"
sort_by = "date"
-template = "section.html"
[extra]
header = {title = "¡Hola! Soy tabi~", img = "img/main.webp", img_alt = "Óscar Fernández, el autor de tabi" }
@@ -10,7 +9,7 @@ max_posts = 4
projects_path = "projects/_index.es.md"
max_projects = 3
show_projects_first = false
-social_media_card = "social_cards/es.jpg"
+social_media_card = "es.jpg"
+++
-tabi es un tema de [Zola](https://www.getzola.org) rápido, ligero y moderno. Su objetivo es ser una página personal y hogar para publicaciones de blogs. Cuenta con una puntuación perfecta en Lighthouse, diseño responsive, tema oscuro y claro, shortcodes personalizados y mucho más.
+tabi es un tema accesible para [Zola](https://www.getzola.org) con [búsqueda](@/blog/mastering-tabi-settings/index.es.md#busqueda), [soporte multilingüe](@/blog/faq-languages/index.es.md), [JavaScript opcional](@/blog/javascript/index.es.md), una puntuación perfecta en Lighthouse y documentación exhaustiva. Diseñado para sitios web y blogs personales.
diff --git a/content/_index.md b/content/_index.md
index fba6172..4d1dbe6 100644
--- a/content/_index.md
+++ b/content/_index.md
@@ -1,7 +1,6 @@
+++
title = "Latest posts"
sort_by = "date"
-template = "section.html"
[extra]
header = {title = "Hello! I'm tabi~", img = "img/main.webp", img_alt = "Óscar Fernández, the theme's author" }
@@ -10,7 +9,7 @@ max_posts = 4
projects_path = "projects/_index.md"
max_projects = 3
show_projects_first = false
-social_media_card = "social_cards/index.jpg"
+social_media_card = "index.jpg"
+++
-tabi is a fast, lightweight, and modern [Zola](https://www.getzola.org) theme. It aims to be a personal page and home to blog posts. It features a perfect Lighthouse score, responsive design, dark and light themes, custom shortcodes, and much more.
+tabi is an accessible [Zola](https://www.getzola.org) theme with [search](@/blog/mastering-tabi-settings/index.md#search), [multi-language support](@/blog/faq-languages/index.md), [optional JavaScript](@/blog/javascript/index.md), a perfect Lighthouse score, and comprehensive documentation. Crafted for personal websites and blogs.
diff --git a/content/ar.jpg b/content/ar.jpg
new file mode 100644
index 0000000..64e77bc
Binary files /dev/null and b/content/ar.jpg differ
diff --git a/content/archive/_index.ar.md b/content/archive/_index.ar.md
new file mode 100644
index 0000000..59055be
--- /dev/null
+++ b/content/archive/_index.ar.md
@@ -0,0 +1,4 @@
++++
+title = "الأرشيف"
+template = "archive.html"
++++
diff --git a/content/archive/_index.ca.md b/content/archive/_index.ca.md
index 984a17a..869b1d2 100644
--- a/content/archive/_index.ca.md
+++ b/content/archive/_index.ca.md
@@ -3,5 +3,5 @@ title = "Arxiu"
template = "archive.html"
[extra]
-social_media_card = "archive/social_cards/ca_archive.jpg"
+social_media_card = "ca_archive.jpg"
+++
diff --git a/content/archive/_index.es.md b/content/archive/_index.es.md
index c7bca8f..9f33695 100644
--- a/content/archive/_index.es.md
+++ b/content/archive/_index.es.md
@@ -3,5 +3,5 @@ title = "Archivo"
template = "archive.html"
[extra]
-social_media_card = "archive/social_cards/es_archive.jpg"
+social_media_card = "es_archive.jpg"
+++
diff --git a/content/archive/_index.md b/content/archive/_index.md
index dea9aab..10cf255 100644
--- a/content/archive/_index.md
+++ b/content/archive/_index.md
@@ -3,5 +3,5 @@ title = "Archive"
template = "archive.html"
[extra]
-social_media_card = "archive/social_cards/archive.jpg"
+social_media_card = "archive.jpg"
+++
diff --git a/content/archive/social_cards/archive.jpg b/content/archive/archive.jpg
similarity index 100%
rename from content/archive/social_cards/archive.jpg
rename to content/archive/archive.jpg
diff --git a/content/archive/social_cards/ca_archive.jpg b/content/archive/ca_archive.jpg
similarity index 100%
rename from content/archive/social_cards/ca_archive.jpg
rename to content/archive/ca_archive.jpg
diff --git a/content/archive/social_cards/es_archive.jpg b/content/archive/es_archive.jpg
similarity index 100%
rename from content/archive/social_cards/es_archive.jpg
rename to content/archive/es_archive.jpg
diff --git a/content/blog/_index.ar.md b/content/blog/_index.ar.md
new file mode 100644
index 0000000..55a7a88
--- /dev/null
+++ b/content/blog/_index.ar.md
@@ -0,0 +1,10 @@
++++
+paginate_by = 5
+title = "التدوينات"
+sort_by = "date"
+template = "section.html"
+insert_anchor_links = "right"
+
+[extra]
+show_previous_next_article_links = true
++++
diff --git a/content/blog/_index.ca.md b/content/blog/_index.ca.md
index 7a72231..25e0758 100644
--- a/content/blog/_index.ca.md
+++ b/content/blog/_index.ca.md
@@ -2,10 +2,9 @@
paginate_by = 5
title = "Blog"
sort_by = "date"
-template = "section.html"
insert_anchor_links = "left"
[extra]
-social_media_card = "blog/social_cards/ca_blog.jpg"
+social_media_card = "ca_blog.jpg"
show_previous_next_article_links = true
+++
diff --git a/content/blog/_index.es.md b/content/blog/_index.es.md
index a367dbb..201c2d4 100644
--- a/content/blog/_index.es.md
+++ b/content/blog/_index.es.md
@@ -2,10 +2,9 @@
paginate_by = 5
title = "Blog"
sort_by = "date"
-template = "section.html"
insert_anchor_links = "left"
[extra]
-social_media_card = "blog/social_cards/es_blog.jpg"
+social_media_card = "es_blog.jpg"
show_previous_next_article_links = true
+++
diff --git a/content/blog/_index.md b/content/blog/_index.md
index 036db4d..22dbcda 100644
--- a/content/blog/_index.md
+++ b/content/blog/_index.md
@@ -2,10 +2,9 @@
paginate_by = 5
title = "Blog"
sort_by = "date"
-template = "section.html"
insert_anchor_links = "left"
[extra]
-social_media_card = "blog/social_cards/blog.jpg"
+social_media_card = "blog.jpg"
show_previous_next_article_links = true
+++
diff --git a/content/blog/social_cards/blog.jpg b/content/blog/blog.jpg
similarity index 100%
rename from content/blog/social_cards/blog.jpg
rename to content/blog/blog.jpg
diff --git a/content/blog/social_cards/ca_blog.jpg b/content/blog/ca_blog.jpg
similarity index 100%
rename from content/blog/social_cards/ca_blog.jpg
rename to content/blog/ca_blog.jpg
diff --git a/content/blog/custom-font-subset/index.ca.md b/content/blog/custom-font-subset/index.ca.md
index ede8541..20906aa 100644
--- a/content/blog/custom-font-subset/index.ca.md
+++ b/content/blog/custom-font-subset/index.ca.md
@@ -1,7 +1,7 @@
+++
title = "Optimitza la càrrega amb un subconjunt de font personalitzat"
date = 2023-04-29
-updated = 2023-07-08
+updated = 2025-01-12
description = "Aprèn com crear un subconjunt personalitzat que només inclogui els glifs necessaris."
[taxonomies]
@@ -21,7 +21,11 @@ Per solucionar això, tabi carrega un subconjunt de glifs per a l'encapçalament
Per defecte, tabi inclou fitxers de subconjunts per a caràcters en anglès i espanyol (amb alguns símbols). Aquests fitxers es carreguen quan la pàgina o el lloc web de Zola està en aquest idioma.
-Per a una optimització addicional, pots crear un subconjunt de fonts personalitzat que només inclogui els caràcters utilitzats en el teu encapçalament.
+{% admonition(type="tip") %}
+Si estàs fent servir una font personalitzada, pots crear el teu propi subconjunt (segueix llegint) o desactivar completament els subconjunts predeterminats amb `enable_subset = false` a `config.toml`.
+{% end %}
+
+Per a una optimització addicional, a continuació t'expliquem com crear un subconjunt de fonts personalitzat que només inclogui els caràcters utilitzats en el teu encapçalament.
## Requisits
diff --git a/content/blog/custom-font-subset/index.es.md b/content/blog/custom-font-subset/index.es.md
index 4f00491..31e8197 100644
--- a/content/blog/custom-font-subset/index.es.md
+++ b/content/blog/custom-font-subset/index.es.md
@@ -1,7 +1,7 @@
+++
title = "Optimiza la carga con un subconjunto de fuente personalizado"
date = 2023-04-29
-updated = 2023-07-08
+updated = 2025-01-12
description = "Aprende cómo crear un subconjunto personalizado que solo incluya los glifos necesarios."
[taxonomies]
@@ -21,7 +21,11 @@ Para solucionar esto, tabi carga un subconjunto de glifos para el encabezado. Da
Por defecto, tabi incluye archivos de subconjuntos para caracteres en inglés y español (con algunos símbolos). Estos archivos se cargan cuando la página o el sitio de Zola está en ese idioma.
-Para una optimización adicional, puedes crear un subconjunto de fuentes personalizado que solo incluya los caracteres utilizados en tu encabezado.
+{% admonition(type="tip") %}
+Si estás usando una fuente personalizada, puedes crear tu propio subconjunto (ver más abajo) o desactivar completamente los subconjuntos predeterminados con `enable_subset = false` en tu `config.toml`.
+{% end %}
+
+Para una optimización adicional, a continuación verás cómo crear un subconjunto de fuentes personalizado que solo incluya los caracteres utilizados en tu encabezado.
## Requisitos
diff --git a/content/blog/custom-font-subset/index.md b/content/blog/custom-font-subset/index.md
index 9cd54d3..fdb1d6b 100644
--- a/content/blog/custom-font-subset/index.md
+++ b/content/blog/custom-font-subset/index.md
@@ -1,7 +1,7 @@
+++
title = "Optimise loading times with a custom font subset"
date = 2023-04-29
-updated = 2023-07-08
+updated = 2025-01-12
description = "Learn how to create a custom subset that only includes the necessary glyphs."
[taxonomies]
@@ -21,7 +21,11 @@ To fix this, tabi loads a subset of glyphs for the header. Since this (slightly)
By default, there are subset files for English and Spanish characters (with a few symbols). These files are loaded when the Zola page/site is set to that language.
-For further optimisation, you can create a custom font subset that only includes the characters used in your header.
+{% admonition(type="tip") %}
+If you're using a custom font, either create your custom subset (see below) or disable the built-in subsets completely with `enable_subset = false` in your `config.toml`.
+{% end %}
+
+Here's how you can create a custom font subset that only includes the characters used in your header, for maximum efficiency.
## Requirements
diff --git a/content/blog/customise-tabi/index.ca.md b/content/blog/customise-tabi/index.ca.md
index 1c91ff0..f17d30a 100644
--- a/content/blog/customise-tabi/index.ca.md
+++ b/content/blog/customise-tabi/index.ca.md
@@ -1,7 +1,7 @@
+++
title = "Personalitza el color de tabi i el tema per defecte"
date = 2023-08-09
-updated = 2023-11-24
+updated = 2024-09-12
description = "Aprèn a personalitzar tabi fent servir skins i establint un tema per defecte, aconseguint un aspecte únic."
[taxonomies]
@@ -19,6 +19,8 @@ tabi pot ser personalitzat de dues maneres: establint el tema per defecte (fosc
Utilitza `default_theme = "dark"` per establir el tema fosc com a predeterminat, o `default_theme = "light"` per establir el tema clar com a predeterminat.
+Establir `default_theme = ""` (o comentar la variable) seguirà la preferència del sistema de l'usuari (mode clar o fosc).
+
Per configurar permanentment el teu lloc en el tema fosc o clar, necessites desactivar el `theme_switcher` a `config.toml` i establir el teu tema preferit (`light` o `dark`) a `default_theme`.
Per exemple, per tenir un tema fosc permanent:
@@ -167,12 +169,33 @@ Pots guardar la teva nova skin en qualsevol d'aquests dos directoris:
Crea un nou arxiu `.scss` (per exemple, `la_teva_skin.scss`) a la ubicació que prefereixis. Aquest arxiu ha de contenir aquestes dues variables (aquesta és la skin predeterminada, "teal"):
```scss
+// This defines theme-specific variables.
+@mixin theme-variables($theme) {
+ @if $theme =='light' {
+ // Light theme colours.
+ --primary-color: #087e96; // Contrast ratio: 4.73:1
+ }
+ @else if $theme == 'dark' {
+ // Dark theme colours.
+ --primary-color: #91e0ee; // Contrast ratio: 11.06:1
+ }
+}
+
+// Apply light theme variables by default.
:root {
- --primary-color: #087e96;
+ @include theme-variables('light');
}
[data-theme='dark'] {
- --primary-color: #91e0ee;
+ @include theme-variables('dark');
+}
+
+// Apply dark theme variables when user's system prefers dark mode
+// and the theme is not explicitly set to light.
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme='light']) {
+ @include theme-variables('dark');
+ }
}
```
diff --git a/content/blog/customise-tabi/index.es.md b/content/blog/customise-tabi/index.es.md
index 8c3a752..8f5ff3a 100644
--- a/content/blog/customise-tabi/index.es.md
+++ b/content/blog/customise-tabi/index.es.md
@@ -1,7 +1,7 @@
+++
title = "Personaliza el color de tabi y el tema predeterminado"
date = 2023-08-09
-updated = 2023-11-24
+updated = 2024-09-12
description = "Aprende a personalizar tabi usando skins y estableciendo un tema predeterminado, haciendo que tu sitio sea único."
[taxonomies]
@@ -19,6 +19,8 @@ tabi puede ser personalizado de dos maneras: estableciendo el tema predeterminad
Usa `default_theme = "dark"` para establecer el tema oscuro como predeterminado, o `default_theme = "light"` para establecer el tema claro como predeterminado.
+Establecer `default_theme = ""` (o no especificar la variable) seguirá las preferencias del sistema del usuario (modo claro u oscuro).
+
Para configurar permanentemente tu sitio en el tema oscuro o claro, necesitas desactivar el `theme_switcher` en `config.toml` y establecer tu tema preferido (`light` o `dark`) como el `default_theme`.
Por ejemplo, para tener un tema oscuro permanente:
@@ -169,12 +171,34 @@ Puedes guardar tu nueva skin en cualquiera de estos dos directorios:
Crea un nuevo archivo `.scss` (por ejemplo, `tu_skin.scss`) en la ubicación que prefieras. Este archivo debe contener estas dos variables (esta es la skin predeterminada, "teal"):
```scss
-:root {
- --primary-color: #087e96;
+// This defines theme-specific variables.
+@mixin theme-variables($theme) {
+ @if $theme =='light' {
+ // Light theme colours.
+ --primary-color: #087e96; // Contrast ratio: 4.73:1
+ }
+ @else if $theme == 'dark' {
+ // Dark theme colours.
+ --primary-color: #91e0ee; // Contrast ratio: 11.06:1
+ }
}
+// Apply light theme variables by default.
+:root {
+ @include theme-variables('light');
+}
+
+// Apply dark theme variables when dark theme is explicitly set.
[data-theme='dark'] {
- --primary-color: #91e0ee;
+ @include theme-variables('dark');
+}
+
+// Apply dark theme variables when user's system prefers dark mode
+// and the theme is not explicitly set to light.
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme='light']) {
+ @include theme-variables('dark');
+ }
}
```
diff --git a/content/blog/customise-tabi/index.md b/content/blog/customise-tabi/index.md
index db7c24c..488e658 100644
--- a/content/blog/customise-tabi/index.md
+++ b/content/blog/customise-tabi/index.md
@@ -1,7 +1,7 @@
+++
title = "Customise tabi with skins and a default theme"
date = 2023-08-09
-updated = 2023-11-24
+updated = 2024-09-12
description = "Learn how to customise tabi using skins and setting a default theme, making your site uniquely yours."
[taxonomies]
@@ -19,6 +19,8 @@ tabi can be customised in two ways: by setting the default theme (dark or light)
Use `default_theme = "dark"` to set the dark theme as the default, or `default_theme = "light"` to set the light theme as the default.
+Setting `default_theme = ""` (or commenting out the variable) will follow the user's system preference (light or dark mode).
+
To permanently set your site to either the dark or light theme, you need to disable the theme switcher in `config.toml` and set your preferred theme as the `default_theme`.
For example, to have a permanent dark theme:
@@ -178,12 +180,34 @@ You can save your new skin it in either of these two directories:
Create a new `.scss` file (for example, `your_skin.scss`) in your preferred location. This file needs to have these two variables (this is the default skin, "teal"):
```scss
-:root {
- --primary-color: #087e96;
+// This defines theme-specific variables.
+@mixin theme-variables($theme) {
+ @if $theme =='light' {
+ // Light theme colours.
+ --primary-color: #087e96; // Contrast ratio: 4.73:1
+ }
+ @else if $theme == 'dark' {
+ // Dark theme colours.
+ --primary-color: #91e0ee; // Contrast ratio: 11.06:1
+ }
}
+// Apply light theme variables by default.
+:root {
+ @include theme-variables('light');
+}
+
+// Apply dark theme variables when dark theme is explicitly set.
[data-theme='dark'] {
- --primary-color: #91e0ee;
+ @include theme-variables('dark');
+}
+
+// Apply dark theme variables when user's system prefers dark mode
+// and the theme is not explicitly set to light.
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme='light']) {
+ @include theme-variables('dark');
+ }
}
```
diff --git a/content/blog/social_cards/es_blog.jpg b/content/blog/es_blog.jpg
similarity index 100%
rename from content/blog/social_cards/es_blog.jpg
rename to content/blog/es_blog.jpg
diff --git a/content/blog/faq-languages/index.ca.md b/content/blog/faq-languages/index.ca.md
index 6a015fb..c4be47f 100644
--- a/content/blog/faq-languages/index.ca.md
+++ b/content/blog/faq-languages/index.ca.md
@@ -1,7 +1,7 @@
+++
title = "Lost in Translation? Explora les capacitats multilingües de tabi"
date = 2023-09-12
-updated = 2024-03-01
+updated = 2025-09-14
description = "Descobreix com tabi t'ajuda a connectar amb una audiència global gràcies a les seves funcions multilingües. Aprèn a canviar la llengua per defecte, afegir més llengües i aportar les teves pròpies traduccions."
[taxonomies]
@@ -29,10 +29,13 @@ tabi admet les següents llengües:
- Català
- Coreà
- Espanyol
+- Estonià
+- Finès
- Francès
- Hindi
- Italià
- Japonès
+- Odia
- Persa
- Portuguès (Europeu)
- Rus
@@ -104,6 +107,19 @@ Per tant, si crees `i18n/ca.toml` al teu directori base, tabi llegirà les caden
Assegura't de copiar tot el fitxer per a aquest idioma primer, o el tema utilitzarà l'anglès per les claus que faltin.
+## Com personalitzo els formats de data per a diferents idiomes?
+
+Pots establir formats de data específics per idioma al teu `config.toml` utilitzant la matriu `date_formats`:
+
+```toml
+date_formats = [
+ { lang = "es", long = "%d de %B de %Y", short = "%-d %b %Y", archive = "%d de %b" },
+ { lang = "de", long = "%d. %B %Y", short = "%d.%m.%Y", archive = "%d. %b" },
+]
+```
+
+Això permet que cada idioma mostri les dates segons les convencions locals. Per exemple, l'espanyol mostrarà «3 de febrero de 2024» mentre que l'alemany mostrarà «3. Februar 2024». Si no es defineix un format específic per a un idioma, tabi utilitzarà la configuració global `long_date_format`, `short_date_format` i `archive_date_format`.
+
## Què passa si falta una traducció o està incompleta?
Si una cadena no es troba en el fitxer d'idioma, tabi utilitzarà a la cadena predeterminada en anglès.
@@ -131,3 +147,7 @@ Si ho vas fer, hauràs d'actualitzar manualment les traduccions. Pots fer-ho cop
## tabi tradueix el meu contingut?
No. tabi només tradueix les cadenes de text del tema. Hauràs de traduir el teu contingut tu mateix.
+
+## Com puc mostrar el codi de l'idioma actual al commutador d'idioma?
+
+Afegeix `show_selected_language_code_in_language_switcher = true` a la secció `[extra]` del teu `config.toml`.
diff --git a/content/blog/faq-languages/index.es.md b/content/blog/faq-languages/index.es.md
index 08f293c..b9fe08f 100644
--- a/content/blog/faq-languages/index.es.md
+++ b/content/blog/faq-languages/index.es.md
@@ -1,7 +1,7 @@
+++
title = "¿Lost in Translation? Explora las capacidades multilingües de tabi"
date = 2023-09-12
-updated = 2024-03-01
+updated = 2025-09-14
description = "Descubre cómo tabi te ayuda a conectar con una audiencia global gracias a sus funciones multilingües. Aprende a cambiar el idioma por defecto, añadir más idiomas y aportar tus propias traducciones."
[taxonomies]
@@ -29,11 +29,14 @@ tabi admite los siguientes idiomas:
- Chino (Simplificado)
- Coreano
- Español
+- Estonio
+- Finlandés
- Francés
- Hindi
- Inglés
- Italiano
- Japonés
+- Odia
- Persa
- Portugués (Europeo)
- Ruso
@@ -104,6 +107,19 @@ Por lo tanto, si creas `i18n/en.toml` en tu directorio base, tabi leerá las cad
Asegúrate de copiar todo el archivo para ese idioma primero, o el tema usará el inglés para las claves faltantes.
+## ¿Cómo personalizo los formatos de fecha para diferentes idiomas?
+
+Puedes establecer formatos de fecha específicos por idioma en tu `config.toml` usando la matriz `date_formats`:
+
+```toml
+date_formats = [
+ { lang = "es", long = "%d de %B de %Y", short = "%-d %b %Y", archive = "%d de %b" },
+ { lang = "de", long = "%d. %B %Y", short = "%d.%m.%Y", archive = "%d. %b" },
+]
+```
+
+Esto permite que cada idioma muestre las fechas según las convenciones locales. Por ejemplo, el español mostrará «3 de febrero de 2024» mientras que el alemán mostrará «3. Februar 2024». Si no se define un formato específico para un idioma, tabi usará la configuración global `long_date_format`, `short_date_format` y `archive_date_format`.
+
## ¿Qué pasa si falta una traducción o está incompleta?
Si una cadena no se encuentra en el archivo de idioma, tabi recurrirá a la cadena predeterminada en inglés.
@@ -131,3 +147,7 @@ Si lo hiciste, tendrás que actualizar manualmente las traducciones. Puedes hace
## ¿tabi traduce el contenido de mi sitio?
No. tabi sólo traduce el tema. Los posts deberás traducirlos tú mismo.
+
+## ¿Cómo puedo mostrar el código del idioma actual en el conmutador de idioma?
+
+Añade `show_selected_language_code_in_language_switcher = true` en la sección `[extra]` de tu `config.toml`.
diff --git a/content/blog/faq-languages/index.md b/content/blog/faq-languages/index.md
index ea3432c..229a5a0 100644
--- a/content/blog/faq-languages/index.md
+++ b/content/blog/faq-languages/index.md
@@ -1,7 +1,7 @@
+++
title = "Lost in Translation? Not with tabi's Multilingual Capabilities"
date = 2023-09-12
-updated = 2024-03-01
+updated = 2025-09-14
description = "Master the art of serving a global audience through tabi's built-in multilingual features. Learn how to change the default language, add multilingual support, and contribute your own translations."
[taxonomies]
@@ -28,12 +28,15 @@ tabi supports the following languages:
- Chinese (Simplified)
- Chinese (Traditional)
- English
+- Estonian
+- Finnish
- French
- German
- Hindi
- Italian
- Japanese
- Korean
+- Odia
- Persian
- Portuguese (European)
- Russian
@@ -105,6 +108,19 @@ So if you create `i18n/en.toml` in your base directory, tabi will read the stri
Make sure to copy the entire file for that language first, or the theme will fall back to the default English strings.
+## How do I customize date formats for different languages?
+
+You can set language-specific date formats in your `config.toml` using the `date_formats` array:
+
+```toml
+date_formats = [
+ { lang = "es", long = "%d de %B de %Y", short = "%-d %b %Y", archive = "%d de %b" },
+ { lang = "de", long = "%d. %B %Y", short = "%d.%m.%Y", archive = "%d. %b" },
+]
+```
+
+This allows each language to display dates according to local conventions. For example, Spanish will show "3 de febrero de 2024" while German will show "3. Februar 2024". If no language-specific format is defined, tabi will use the global `long_date_format`, `short_date_format` and `archive_date_format` settings.
+
## What happens if a translation is missing or incomplete?
If a string is not found in the language file, tabi will fall back to the default English string.
@@ -132,3 +148,7 @@ If you did, you will need to manually update the translations. You can do this b
## Does tabi translate my content?
No. tabi only translates the theme's text strings. You will need to translate your content yourself.
+
+# How to show current language code on the language switcher?
+
+Add `show_selected_language_code_in_language_switcher = true` in your config extras.
diff --git a/content/blog/javascript/index.ca.md b/content/blog/javascript/index.ca.md
index 9f6f459..d9e461f 100644
--- a/content/blog/javascript/index.ca.md
+++ b/content/blog/javascript/index.ca.md
@@ -1,14 +1,13 @@
+++
title = "Sense JavaScript obligatori"
date = 2023-01-06
-updated = 2024-05-03
+updated = 2025-02-21
description = "JavaScript només s'utilitza quan HTML i CSS no són suficients."
[taxonomies]
tags = ["funcionalitat", "tutorial"]
[extra]
-footnote_backlinks = true
social_media_card = "social_cards/ca_blog_javascript.jpg"
+++
@@ -26,10 +25,11 @@ Aquest tema no requereix JavaScript obligatori. Opcionalment, pot carregar una q
Les següents opcions es poden especificar per a publicacions, seccions i globalment, seguint la jerarquia de `pàgina > secció > config.toml`:
-- [**Suport de KaTeX**](@/blog/markdown/index.ca.md#katex). Habilitat configurant `katex = true` (274 KB).
+- [**Suport de KaTeX**](@/blog/markdown/index.ca.md#katex). Habilitat configurant `katex = true` (274 KB). Per renderitzar fórmules sense JS, prova [MathML](https://developer.mozilla.org/docs/Web/MathML/).
+- [**Diagrames de Mermaid**](@/blog/shortcodes/index.ca.md#diagrames-de-mermaid). Habilitat configurant `mermaid = true` (~2.5 MB).
- [**Còpia de blocs de codi amb un sol clic**](@/blog/markdown/index.ca.md#bloc-de-codi). Habilitada configurant `copy_button = true`. (~700 bytes)
-- [**Mostrar ruta/URL a blocs de codi**](@/blog/shortcodes/index.ca.md#mostrar-ruta-o-url). S'activa configurant `add_src_to_code_block = true`. (~400 bytes)
-- [**Enllaços de retorn per a notes a peu de pàgina**](@/blog/markdown/index.ca.md#1). Habilitats configurant `footnote_backlinks = true` (~500 bytes).
+- [**Noms de blocs de codi clicables**](@/blog/shortcodes/index.ca.md#mostrar-ruta-o-url). S'activa configurant `code_block_name_links = true`. (~400 bytes)
+- [**Filtratge per etiquetes** per a graelles de targetes](@/blog/mastering-tabi-settings/index.ca.md#filtrar-projectes) (p. ex. [projectes](@/projects/_index.ca.md)) (~2KB). S'habilita configurant `enable_cards_tag_filtering = true`.
Per especificar aquestes opcions:
diff --git a/content/blog/javascript/index.es.md b/content/blog/javascript/index.es.md
index d574717..36e550e 100644
--- a/content/blog/javascript/index.es.md
+++ b/content/blog/javascript/index.es.md
@@ -1,14 +1,13 @@
+++
title = "Sin JavaScript obligatorio"
date = 2023-01-06
-updated = 2024-05-03
+updated = 2025-02-21
description = "JavaScript solo se utiliza cuando HTML y CSS no son suficientes."
[taxonomies]
tags = ["funcionalidad", "tutorial"]
[extra]
-footnote_backlinks = true
social_media_card = "social_cards/es_blog_javascript.jpg"
+++
@@ -26,10 +25,11 @@ Este tema no requiere JavaScript de manera obligatoria. Opcionalmente, puede car
Las siguientes opciones pueden especificarse para publicaciones, secciones y a nivel global, siguiendo la jerarquía de `página > sección > config.toml`:
-- [**Soporte de KaTeX**](@/blog/markdown/index.es.md#katex). Habilitado al configurar `katex = true` (274 KB).
+- [**Soporte de KaTeX**](@/blog/markdown/index.es.md#katex). Habilitado al configurar `katex = true` (274 KB). Para renderizar fórmulas sin JS, prueba [MathML](https://developer.mozilla.org/docs/Web/MathML/).
+- [**Diagramas de Mermaid**](@/blog/shortcodes/index.es.md#diagramas-de-mermaid). Habilitado al configurar `mermaid = true` (~2.5 MB).
- [**Copia de bloques de código con un solo clic**](@/blog/markdown/index.es.md#bloque-de-codigo). Habilitado al configurar `copy_button = true` (~700 bytes).
-- [**Mostrar ruta/URL en bloques de código**](@/blog/shortcodes/index.es.md#mostrar-ruta-o-url). Se activa configurando `add_src_to_code_block = true`. (~400 bytes)
-- [**Enlaces de retorno de notas al pie**](@/blog/markdown/index.es.md#1). Habilitado al configurar `footnote_backlinks = true` (~500 bytes).
+- [**Nombres de bloques de código clicables**](@/blog/shortcodes/index.es.md#mostrar-ruta-o-url). Se activa configurando `code_block_name_links = true`. (~400 bytes)
+- [**Filtraje por etiquetas** para cuadrículas de tarjetas](@/blog/mastering-tabi-settings/index.es.md#filtrar-proyectos) (p. ej. [proyectos](@/projects/_index.es.md)) (~2KB). Habilitado al configurar `enable_cards_tag_filtering = true`.
Para especificar estas opciones:
diff --git a/content/blog/javascript/index.md b/content/blog/javascript/index.md
index 9217a55..57864b0 100644
--- a/content/blog/javascript/index.md
+++ b/content/blog/javascript/index.md
@@ -1,14 +1,13 @@
+++
title = "No mandatory JavaScript"
date = 2023-01-06
-updated = 2024-05-03
+updated = 2025-02-21
description = "JavaScript is only used when HTML and CSS aren't enough."
[taxonomies]
tags = ["showcase", "tutorial"]
[extra]
-footnote_backlinks = true
social_media_card = "social_cards/blog_javascript.jpg"
+++
@@ -26,10 +25,11 @@ This theme has no mandatory JavaScript. Optionally, it can load a minimal amount
The following settings can be specified for posts, sections and globally, following the hierarchy of `page > section > config.toml`:
-- [**KaTeX support**](@/blog/markdown/index.md#katex). Enabled by setting `katex = true` (274 KB).
+- [**KaTeX support**](@/blog/markdown/index.md#katex). Enabled by setting `katex = true` (274 KB). To render math without JS, check out [MathML](https://developer.mozilla.org/docs/Web/MathML/).
+- [**Mermaid diagrams**](@/blog/shortcodes/index.md#mermaid-diagrams). Enabled by setting `mermaid = true` (~2.5 MB).
- [**One-click copy of code blocks**](@/blog/markdown/index.md#code-block). Enabled by setting `copy_button = true`. (~700 bytes)
-- [**Showing source (path or URL) in code blocks**](@/blog/shortcodes/index.md#show-source-or-path). Enabled by setting `add_src_to_code_block = true`. (~300 bytes)
-- [**Footnote backlinks**](@/blog/markdown/index.md#1). Enabled by setting `footnote_backlinks = true` (~500 bytes).
+- [**Clickable code block names**](@/blog/shortcodes/index.md#show-source-or-path). Enabled by setting `code_block_name_links = true`. (~300 bytes)
+- [**Tag filtering** for card grids](@/blog/mastering-tabi-settings/index.md#filtering-projects) (e.g. [projects](@/projects/_index.md)) (~2KB). Enabled by setting `enable_cards_tag_filtering = true`.
To specify these settings:
diff --git a/content/blog/markdown/index.ar.md b/content/blog/markdown/index.ar.md
new file mode 100644
index 0000000..9322dc4
--- /dev/null
+++ b/content/blog/markdown/index.ar.md
@@ -0,0 +1,93 @@
++++
+title = "أمثلة على ماركداون"
+date = 2023-01-31
+updated = 2023-09-01
+description = "تعرض هذه التدوينة بعض الأمثلة على تنسيق ماركداون، بما في ذلك الجداول، والشِفرات البرمجية والوسوم، والاقتباسات، والهوامش."
+
+[taxonomies]
+tags = ["ماركداون", "توضيحي"]
+
+[extra]
+katex = true
++++
+
+{% admonition(type="note", title="ملاحظة عن الاتجاه", icon="info") %}
+يدعم تابي الكتابة من اليمين إلى اليسار (RTL) بشكل كامل، مما يجعله مثالياً للغة العربية.
+
+الشفرات البرمجية والمعادلات الرياضية تبقى من اليسار إلى اليمين كما هو متوقع.
+{% end %}
+
+## الرياضيات مع $\KaTeX$
+
+{{ aside(text="تأتي كلمة *ماركداون* من الإنجليزية *Markdown*، وهي لغة ترميز بسيطة صممها جون غروبر وآرون سوارتز في عام 2004.") }}
+
+[$\KaTeX$](https://katex.org/) هي مكتبة سريعة وسهلة الاستخدام تمكن من عرض الرموز الرياضية باستخدام صيغة LaTeX.
+
+يمكنك استخدام $\KaTeX$ **ضمن السطر** عن طريق وضع التعبير بين `$` أو بين `\\(` و `\\)`.
+
+على سبيل المثال، `$ \sin(x) = \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n + 1)!} x^{2n + 1} $` سيظهر هكذا: $ \sin(x) = \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n + 1)!} x^{2n + 1} $
+
+لعرض التعبير **في سطر منفصل ومتوسط**، ضعه بين `$$` أو بين `\\[` و `\\]`.
+
+على سبيل المثال، `\\[ r = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i - \bar{x})^2}\sqrt{\sum_{i=1}^{n}(y_i - \bar{y})^2}} \\]` سيظهر هكذا: \\[ r = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i - \bar{x})^2}\sqrt{\sum_{i=1}^{n}(y_i - \bar{y})^2}} \\]
+
+لتفعيل $\KaTeX$ لتدوينة أو قسم كامل، أضف `katex = true` داخل قسم `[extra]` في المقدمة. على سبيل المثال:
+
+```toml,hl_lines=5-6
+title = "تجربة KaTeX"
+date = 2002-11-30
+
+[extra]
+katex = true
+```
+
+يمكنك أيضاً تفعيله بشكل عام عن طريق تعيين `katex = true` في قسم `[extra]` في ملف `config.toml` الخاص بك.
+
+لتحسين الأداء والأمان، يتم استضافة ملفات جافا سكريبت و CSS والخطوط الخاصة بـ $\KaTeX$ محلياً.
+
+**ملاحظة**: بعد تفعيل $\KaTeX$، إذا أردت استخدام \$ بدون عرض تعبير رياضي، استخدم شرطة مائلة للخلف قبلها: `\$`.
+
+## جدول
+
+هذا مثال على جدول[^1]. تتغير ألوانه حسب سمة التدوينة.
+
+| الرمز | العنصر | العدد الذري |
+|--------|----------|--------------|
+| H | هيدروجين| 1 |
+| C | كربون | 6 |
+| Fe | حديد | 26 |
+| Au | ذهب | 79 |
+
+## الشِفرات البرمجية
+
+```rust
+fn main() {
+ println!("مرحباً يا عالم") -> ();
+}
+```
+
+### من اليمين إلى اليسار
+{% force_text_direction(direction="rtl") %}
+
+```
+نص قل_مرحباً(نص الاسم) {
+ أرجع تنسيق("مرحباً {الاسم}")؛
+}
+```
+
+{% end %}
+
+## سطر برمجي
+
+في Rust، تعلن عن متغير متغير باستخدام `let mut x = 5`، بينما في Python، تستخدم ببساطة `x = 5`. وبالمثل، لطباعة قيمة في Rust، تستخدم `println!("القيمة: {}", x)`، ولكن في Python، الأمر بسيط مثل `print(f"القيمة: {x}")`
+وفي لغة البرمجة العربية هو `مهنة = "صائد فئران"`
+
+## اقتباس
+
+> وابِطُكَ قابِضِ الأَرواحِ يَرمي ... بِسَهمِ المَوتِ مِن تَحتِ الثِيابِ
+>
+> شَرابُكَ في السَرابِ إِذا عَطِشنا ... وَخُبزُكَ عِندَ مُنقَطِعِ التُرابِ
+>
+> — أبو الشمقمق، العصر العباسي
+
+[^1]: وهذا مثال على الهامش!
diff --git a/content/blog/markdown/index.ca.md b/content/blog/markdown/index.ca.md
index 7e4990e..16cf165 100644
--- a/content/blog/markdown/index.ca.md
+++ b/content/blog/markdown/index.ca.md
@@ -1,7 +1,7 @@
+++
title = "Exemples de Markdown"
date = 2023-01-31
-updated = 2023-09-01
+updated = 2025-02-21
description = "Aquesta publicació mostra alguns exemples de format en Markdown, incloent-hi una taula, blocs de codi i etiquetes, citacions, taules i notes a peu de pàgina."
[taxonomies]
@@ -9,7 +9,6 @@ tags = ["markdown", "funcionalitat"]
[extra]
katex = true
-footnote_backlinks = true
social_media_card = "social_cards/ca_blog_markdown.jpg"
+++
@@ -60,6 +59,42 @@ fn main() {
}
```
+### Amb numeració de línies
+
+```rust,linenos
+use std::collections::HashMap;
+
+#[derive(Debug)]
+struct TwinPeaksCharacter {
+ name: String,
+ coffee_rating: f32,
+ pie_preference: String,
+}
+
+fn main() {
+ let mut black_lodge = HashMap::new();
+
+ black_lodge.insert("agent", TwinPeaksCharacter {
+ name: String::from("Dale Cooper"),
+ coffee_rating: 9999.99,
+ pie_preference: String::from("Damn Fine Cherry"),
+ });
+
+ black_lodge.insert("giant", TwinPeaksCharacter {
+ name: String::from("The Fireman"),
+ coffee_rating: 42.424242,
+ pie_preference: String::from("Garmonbozia"),
+ });
+
+ // Calculate total appreciation of damn fine coffee
+ let total_coffee: f32 = black_lodge.values()
+ .map(|character| character.coffee_rating)
+ .sum();
+
+ println!("☕ Total coffee appreciation: {:.2} cups", total_coffee);
+}
+```
+
## Etiquetes de codi
A Rust, declares una variable mutable amb `let mut x = 5;`, mentre que a Python, simplement fas `x = 5`. De manera similar, per imprimir un valor a Rust, utilitzaries `println!("Valor: {}", x);`, però a Python, és tan senzill com `print(f"Valor: {x}")`.
@@ -70,6 +105,6 @@ A Rust, declares una variable mutable amb `let mut x = 5;`, mentre que a Python,
>
> — Mercè Rodoreda, La plaça del Diamant
-
+---
[^1]: I aquí tens un exemple de nota a peu de pàgina!
diff --git a/content/blog/markdown/index.es.md b/content/blog/markdown/index.es.md
index 653e37a..af38f47 100644
--- a/content/blog/markdown/index.es.md
+++ b/content/blog/markdown/index.es.md
@@ -1,7 +1,7 @@
+++
title = "Ejemplos de Markdown"
date = 2023-01-31
-updated = 2023-09-01
+updated = 2025-02-21
description = "Esta publicación muestra algunos ejemplos de formato Markdown, incluyendo una tabla, bloques de código y etiquetas, citas, tablas y notas al pie de página."
[taxonomies]
@@ -9,7 +9,6 @@ tags = ["markdown", "funcionalidad"]
[extra]
katex = true
-footnote_backlinks = true
social_media_card = "social_cards/es_blog_markdown.jpg"
+++
@@ -60,6 +59,42 @@ fn main() {
}
```
+### Con números de línea
+
+```rust,linenos
+use std::collections::HashMap;
+
+#[derive(Debug)]
+struct TwinPeaksCharacter {
+ name: String,
+ coffee_rating: f32,
+ pie_preference: String,
+}
+
+fn main() {
+ let mut black_lodge = HashMap::new();
+
+ black_lodge.insert("agent", TwinPeaksCharacter {
+ name: String::from("Dale Cooper"),
+ coffee_rating: 9999.99,
+ pie_preference: String::from("Damn Fine Cherry"),
+ });
+
+ black_lodge.insert("giant", TwinPeaksCharacter {
+ name: String::from("The Fireman"),
+ coffee_rating: 42.424242,
+ pie_preference: String::from("Garmonbozia"),
+ });
+
+ // Calculate total appreciation of damn fine coffee
+ let total_coffee: f32 = black_lodge.values()
+ .map(|character| character.coffee_rating)
+ .sum();
+
+ println!("☕ Total coffee appreciation: {:.2} cups", total_coffee);
+}
+```
+
## Etiquetas de código
En Rust, declaras una variable mutable con `let mut x = 5;`, mientras que en Python, simplemente usas `x = 5`. De manera similar, para imprimir un valor en Rust, utilizarías `println!("Valor: {}", x);`, pero en Python, es tan sencillo como `print(f"Valor: {x}")`.
@@ -70,6 +105,6 @@ En Rust, declaras una variable mutable con `let mut x = 5;`, mientras que en Pyt
>
> — Miguel de Unamuno, Niebla
-
+---
[^1]: ¡Y aquí tienes un ejemplo de una nota al pie de página!
diff --git a/content/blog/markdown/index.md b/content/blog/markdown/index.md
index 5d417c1..ca2f4cf 100644
--- a/content/blog/markdown/index.md
+++ b/content/blog/markdown/index.md
@@ -1,7 +1,7 @@
+++
title = "Markdown examples"
date = 2023-01-31
-updated = 2023-09-01
+updated = 2025-02-21
description = "This post showcases some examples of Markdown formatting, including a table, code blocks and tags, quotes, tables, and footnotes."
[taxonomies]
@@ -9,7 +9,6 @@ tags = ["markdown", "showcase"]
[extra]
katex = true
-footnote_backlinks = true
social_media_card = "social_cards/blog_markdown.jpg"
+++
@@ -60,6 +59,42 @@ fn main() {
}
```
+### With line numbers
+
+```rust,linenos
+use std::collections::HashMap;
+
+#[derive(Debug)]
+struct TwinPeaksCharacter {
+ name: String,
+ coffee_rating: f32,
+ pie_preference: String,
+}
+
+fn main() {
+ let mut black_lodge = HashMap::new();
+
+ black_lodge.insert("agent", TwinPeaksCharacter {
+ name: String::from("Dale Cooper"),
+ coffee_rating: 9999.99,
+ pie_preference: String::from("Damn Fine Cherry"),
+ });
+
+ black_lodge.insert("giant", TwinPeaksCharacter {
+ name: String::from("The Fireman"),
+ coffee_rating: 42.424242,
+ pie_preference: String::from("Garmonbozia"),
+ });
+
+ // Calculate total appreciation of damn fine coffee
+ let total_coffee: f32 = black_lodge.values()
+ .map(|character| character.coffee_rating)
+ .sum();
+
+ println!("☕ Total coffee appreciation: {:.2} cups", total_coffee);
+}
+```
+
## Code tags
In Rust, you declare a mutable variable with `let mut x = 5;`, whereas in Python, you simply use `x = 5`. Similarly, to print a value in Rust, you would use `println!("Value: {}", x);`, but in Python, it's as straightforward as `print(f"Value: {x}")`.
@@ -70,6 +105,6 @@ In Rust, you declare a mutable variable with `let mut x = 5;`, whereas in Python
>
> — Charlie Kaufman, Synecdoche, New York
-
+---
[^1]: And here's an example of a footnote!
diff --git a/content/blog/mastering-tabi-settings/img/external_link_dark.webp b/content/blog/mastering-tabi-settings/img/external_link_dark.webp
new file mode 100644
index 0000000..61a6641
Binary files /dev/null and b/content/blog/mastering-tabi-settings/img/external_link_dark.webp differ
diff --git a/content/blog/mastering-tabi-settings/img/external_link_light.webp b/content/blog/mastering-tabi-settings/img/external_link_light.webp
new file mode 100644
index 0000000..16d03a1
Binary files /dev/null and b/content/blog/mastering-tabi-settings/img/external_link_light.webp differ
diff --git a/content/blog/mastering-tabi-settings/img/jump_to_series_posts_dark.webp b/content/blog/mastering-tabi-settings/img/jump_to_series_posts_dark.webp
new file mode 100644
index 0000000..4790470
Binary files /dev/null and b/content/blog/mastering-tabi-settings/img/jump_to_series_posts_dark.webp differ
diff --git a/content/blog/mastering-tabi-settings/img/jump_to_series_posts_light.webp b/content/blog/mastering-tabi-settings/img/jump_to_series_posts_light.webp
new file mode 100644
index 0000000..4fee0d6
Binary files /dev/null and b/content/blog/mastering-tabi-settings/img/jump_to_series_posts_light.webp differ
diff --git a/content/blog/mastering-tabi-settings/img/pinned_post_dark.webp b/content/blog/mastering-tabi-settings/img/pinned_post_dark.webp
new file mode 100644
index 0000000..6111f62
Binary files /dev/null and b/content/blog/mastering-tabi-settings/img/pinned_post_dark.webp differ
diff --git a/content/blog/mastering-tabi-settings/img/pinned_post_light.webp b/content/blog/mastering-tabi-settings/img/pinned_post_light.webp
new file mode 100644
index 0000000..ddddc44
Binary files /dev/null and b/content/blog/mastering-tabi-settings/img/pinned_post_light.webp differ
diff --git a/content/blog/mastering-tabi-settings/img/projects_tag_filter_dark.webp b/content/blog/mastering-tabi-settings/img/projects_tag_filter_dark.webp
new file mode 100644
index 0000000..a7c9fd4
Binary files /dev/null and b/content/blog/mastering-tabi-settings/img/projects_tag_filter_dark.webp differ
diff --git a/content/blog/mastering-tabi-settings/img/projects_tag_filter_light.webp b/content/blog/mastering-tabi-settings/img/projects_tag_filter_light.webp
new file mode 100644
index 0000000..42c9c36
Binary files /dev/null and b/content/blog/mastering-tabi-settings/img/projects_tag_filter_light.webp differ
diff --git a/content/blog/mastering-tabi-settings/img/sans-serif.webp b/content/blog/mastering-tabi-settings/img/sans-serif.webp
new file mode 100644
index 0000000..9688a79
Binary files /dev/null and b/content/blog/mastering-tabi-settings/img/sans-serif.webp differ
diff --git a/content/blog/mastering-tabi-settings/img/serif.webp b/content/blog/mastering-tabi-settings/img/serif.webp
new file mode 100644
index 0000000..93a276c
Binary files /dev/null and b/content/blog/mastering-tabi-settings/img/serif.webp differ
diff --git a/content/blog/mastering-tabi-settings/img/webmention_dark.webp b/content/blog/mastering-tabi-settings/img/webmention_dark.webp
new file mode 100644
index 0000000..2d4290f
Binary files /dev/null and b/content/blog/mastering-tabi-settings/img/webmention_dark.webp differ
diff --git a/content/blog/mastering-tabi-settings/img/webmention_light.webp b/content/blog/mastering-tabi-settings/img/webmention_light.webp
new file mode 100644
index 0000000..f555252
Binary files /dev/null and b/content/blog/mastering-tabi-settings/img/webmention_light.webp differ
diff --git a/content/blog/mastering-tabi-settings/index.ca.md b/content/blog/mastering-tabi-settings/index.ca.md
index b0aa5a4..b866951 100644
--- a/content/blog/mastering-tabi-settings/index.ca.md
+++ b/content/blog/mastering-tabi-settings/index.ca.md
@@ -1,14 +1,14 @@
+++
title = "Domina la configuració de tabi: guia completa"
date = 2023-09-18
-updated = 2024-06-22
+updated = 2025-08-07
description = "Descobreix les múltiples maneres en què pots personalitzar tabi."
[taxonomies]
tags = ["funcionalitat", "tutorial", "preguntes freqüents"]
[extra]
-footnote_backlinks = true
+pinned = true
quick_navigation_buttons = true
social_media_card = "social_cards/ca_blog_mastering_tabi_settings.jpg"
+++
@@ -26,11 +26,12 @@ tabi té una jerarquia que permet personalitzar el teu lloc a diferents nivells.
1. **Configuracions globals**: Aquestes són les configuracions que s'apliquen a tot el teu lloc. Es configuren a `config.toml`.
2. **Configuracions de secció**: Aquestes són les configuracions que s'apliquen a una secció del teu lloc (per exemple, `/blog` o `/projects`). Es configuren a la metainformació de l'arxiu `_index.md` de la secció.
-3. **Configuracions de pàgina**: Aquestes són les configuracions que s'apliquen a una sola pàgina. Es configuren a la metainformació de la pàgina.
+3. **Configuració de la pàgina «pare»**: Per a pàgines anidades (pàgines dins de pàgines), aquestes són les configuracions de la pàgina que les conté.
+4. **Configuracions de pàgina**: Aquestes són les configuracions que s'apliquen a una sola pàgina. Es configuren a la metainformació de la pàgina.
En tots els casos, les opcions de tabi es configuren a la secció `[extra]`.
-Per a les configuracions que segueixen aquesta jerarquia, el valor establert a una pàgina reemplaça el valor d'una secció, que al seu torn reemplaça el valor global. En resum: com més específica sigui la configuració, més prioritat tindrà, o `pàgina > secció > config.toml`.
+Per a les configuracions que segueixen aquesta jerarquia, el valor establert a una pàgina reemplaça el valor d'una secció, que al seu torn reemplaça el valor global. En resum: com més específica sigui la configuració, més prioritat tindrà, o `pàgina > pàgina pare/secció > config.toml`.
---
@@ -87,7 +88,7 @@ Per a detalls tècnics sobre la implementació de la cerca, incloent quan es car
## Suport multilingüe
-tabi ofereix suport multilingüe complet per al teu lloc Zola, des de configurar un idioma predeterminat fins a afegir tots els que vulguis. Consulta les [preguntes freqüents sobre idiomes](/ca/blog/faq-languages/) per a més informació.
+tabi ofereix suport multilingüe complet per al teu lloc Zola, des de configurar un idioma predeterminat fins a afegir tots els que vulguis. Consulta les [preguntes freqüents sobre idiomes](@/blog/faq-languages/index.ca.md) per a més informació.
---
@@ -110,37 +111,76 @@ header = {title = "Hola! Soc tabi~", img = "img/main.webp", img_alt = "Óscar Fe
La descripció és contingut Markdown normal, escrit fora del front matter.
-#### Mostrant publicacions recents
+#### Llistant publicacions recents
-Si vols mostrar publicacions a la pàgina principal, primer necessites decidir si la seva ruta serà `/` o quelcom diferent, com ara `/blog/`.
+Per mostrar publicacions a la pàgina principal, primer has de decidir d'on es serviran: de la ruta arrel (`/`) o d'un subdirectori (per exemple, `/blog`).
-Si vols servir les publicacions des de `/`, necessites configurar `paginate_by = 5` al front matter del teu arxiu `_index.md`. **Nota**: això no es configura a l'apartat `[extra]`, sinó al front matter principal. Exemple:
+**Opció A: Servir publicacions des de la ruta arrel (`/`)**
+
+Configura `paginate_by` al front matter del teu arxiu `content/_index.md`:
```toml
+title = "Últimes publicacions"
sort_by = "date"
-template = "section.html"
-paginate_by = 5
+paginate_by = 5 # Mostra 5 publicacions per pàgina.
[extra]
-header = {title = "Hola! Sóc tabi~", img = "img/main.webp", img_alt = "Óscar Fernández, l'autor del tema" }
+header = {title = "Hola! Soc tabi~", img = "img/main.webp", img_alt = "El teu nom" }
```
-Si prefereixes servir les publicacions des de `/blog`, pots configurar `section_path = "/blog"` a la secció `[extra]`. Aquesta és la configuració d'aquesta demo:
+{{ admonition(type="note", text="La configuració `paginate_by` va al front matter principal, no a la secció `[extra]`.") }}
+
+**Opció B: Servir publicacions des d'un subdirectori (per exemple, `/blog`)**
+
+Utilitza `section_path` a la secció `[extra]` del teu arxiu `content/_index.md`:
```toml
-title = "Publicacions recents"
+title = "Últimes publicacions"
sort_by = "date"
-template = "section.html"
+# No configuris `paginate_by` aquí.
[extra]
-header = {title = "Hola! Sóc tabi~", img = "img/main.webp", img_alt = "Óscar Fernández, l'autor del tema" }
-section_path = "blog/_index.es.md"
-max_posts = 4
+header = {title = "Hola! Soc tabi~", img = "img/main.webp", img_alt = "El teu nom" }
+section_path = "blog/_index.md" # On trobar les teves publicacions.
+max_posts = 5 # Mostra fins a 5 publicacions a la pàgina principal.
```
-Fixa't que si configures `section_path`, no cal que configuris `paginate_by`. Pots establir `max_posts` per determinar el nombre de publicacions que vols mostrar a la pàgina principal.
+{{ admonition(type="warning", title="ALERTA", text="No configuris `paginate_by` i `section_path` alhora. Aquestes configuracions són mútuament excloents i usar ambdues pot fer que no es mostrin publicacions.") }}
-El `title` és el títol que apareix a sobre de les publicacions.
+Notes addicionals:
+
+- El `title` al front matter estableix el títol que apareix sobre les publicacions.
+- Utilitza la ruta completa a l'arxiu `_index.md` de la secció per a `section_path`. Usar `section_path = "blog/"` no funcionarà.
+
+##### Fixar entrades
+
+Pots fixar entrades per mantenir-les a la part superior de la pàgina principal. En aquesta demo, aquesta entrada està fixada, així que apareix primera amb una icona i etiqueta de "fixada":
+
+{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/pinned_post_light.webp", dark_src="blog/mastering-tabi-settings/img/pinned_post_dark.webp", alt="Entrada fixada", full_width=true) }}
+
+Les entrades fixades es mostren primer, mantenint el seu ordre relatiu segons el `sort_by` de la secció, seguides per les entrades regulars.
+
+Per fixar una entrada, afegeix el següent al seu front matter:
+
+```toml
+[extra]
+pinned = true
+```
+
+{{ admonition(type="info", text="Aquesta configuració només afecta les pàgines principals del lloc (com `/`, `/es/`, `/fr/`). Altres seccions com `blog/`, `tags/` o `archive/` mostren les publicacions en el seu ordre habitual.") }}
+
+{{ admonition(type="warning", text='Quan s'utilitza la paginació (`paginate_by`), les entrades fixades poden aparèixer dues vegades: una vegada a la part superior de la primera pàgina, i una altra en la seva posició cronològica normal en pàgines posteriors.') }}
+
+##### Mostrar la data dels articles al llistat
+Per defecte, quan es llisten els articles, es mostra la data de creació. Pots configurar quina(es) data(es) mostrar utilitzant l'opció `post_listing_date`. Configuracions disponibles:
+
+- `date`: Mostra només la data de publicació original de l'article (opció per defecte).
+- `updated`: Mostra només la data de l'última actualització de l'article. Si no hi ha data d'actualització, es mostra la data de publicació original.
+- `both`: Mostra tant la data de publicació original com la data de l'última actualització.
+
+{% admonition(type="tip") %}
+Aquesta configuració segueix la jerarquia: pots establir un valor global a `config.toml` o canviar-lo per a seccions específiques al seu arxiu `_index.md`. En ambdós casos, afegeix-lo a la secció `[extra]`.
+{% end %}
#### Llistat de Projectes
@@ -183,7 +223,38 @@ Les skins («pells») de tabi canvien el color principal del lloc web. Pots conf
{{ image_toggler(default_src="blog/customise-tabi/skins/lavender_light.webp", toggled_src="blog/customise-tabi/skins/lavender_dark.webp", default_alt="pell lavender en mode clar", toggled_alt="pell lavender en mode fosc", full_width=true) }}
-Explora les skins disponibles i aprèn com crear la teva pròpia consultant [la documentació](/ca/blog/customise-tabi/#skins).
+Explora les skins disponibles i aprèn com crear la teva pròpia consultant [la documentació](@/blog/customise-tabi/index.ca.md#skins).
+
+### Font sans serif (pal sec)
+
+| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
+|:------:|:------:|:-------------:|:---------------:|:-------------------:|
+| ❌ | ❌ | ✅ | ❌ | ❌ |
+
+tabi utilitza una font serif per als paràgrafs dels articles (la que estàs veient ara). Pots canviar a una font sans-serif (la que veus als encapçalaments/menú) a tot el teu lloc configurant `override_serif_with_sans = true` a `config.toml`.
+
+Fes clic a la imatge a continuació per comparar les fonts:
+
+{{ image_toggler(default_src="blog/mastering-tabi-settings/img/serif.webp", toggled_src="blog/mastering-tabi-settings/img/sans-serif.webp", default_alt="Font serif", toggled_alt="Font sans-serif", full_width=true) }}
+
+### Indicador d'enllaços externs
+
+| Pàgina | Secció | `config.toml` | Segueix Jerarquia | Requereix JavaScript |
+|:------:|:------:|:-------------:|:-----------------:|:-------------------:|
+| ❌ | ❌ | ✅ | ❌ | ❌ |
+
+{{ admonition(type="info", text="Requereix Zola 0.20.0 o posterior.") }}
+
+Si vols afegir una icona als enllaços externs, configura la secció `[markdown]` (no `[extra]`) al teu `config.toml`:
+
+```toml
+[markdown]
+external_links_class = "external"
+```
+
+Això afegirà una petita icona al costat dels enllaços externs:
+
+{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/external_link_light.webp", dark_src="blog/mastering-tabi-settings/img/external_link_dark.webp", alt="Icona d'enllaç extern", full_width=true) }}
### Estils CSS personalitzats
@@ -217,7 +288,7 @@ Aquesta variable accepta qualsevol color CSS vàlid, així que pots utilitzar pa
|:------:|:------:|:-------------:|:-----------------:|:--------------------:|
| ❌ | ❌ | ✅ | ❌ | ❌ |
-Per defecte, la [pàgina d'etiquetes](/tags) mostra les etiquetes com:
+Per defecte, la [pàgina d'etiquetes](/ca/tags) mostra les etiquetes com:
[NomEtiqueta](#) — n entrada[es]
@@ -225,6 +296,43 @@ Establir `compact_tags = true` les mostrarà com:
[NomEtiqueta](#) n
+### Ordre de les etiquetes
+
+| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
+|:------:|:------:|:-------------:|:-----------------:|:--------------------:|
+| ❌ | ❌ | ✅ | ❌ | ❌ |
+
+Per defecte, la [pàgina d'etiquetes](/ca/tags) ordena les etiquetes alfabèticament, donada la configuració predeterminada de `tag_sorting = "name"`.
+Si configures `tag_sorting = "frequency"`, s'ordenaran segons el nombre de publicacions (de més a menys).
+
+---
+
+## Sèries
+
+Per a una explicació detallada, consulta la [documentació de sèries](@/blog/series/index.ca.md).
+
+### Enllaç per saltar a les publicacions
+
+| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
+|:------:|:-------:|:-------------:|:------------------:|:-------------------:|
+| ❌ | ✅ | ✅ | ✅ | ❌ |
+
+Per defecte, apareix automàticament un enllaç "Salta a les publicacions" al costat del títol de la sèrie quan una sèrie té un contingut de més de 2000 caràcters:
+
+{{ dual_theme_image(light_src="blog/series/img/jump_to_series_posts_light.webp", dark_src="blog/series/img/jump_to_series_posts_dark.webp" alt="enllaç per saltar a les publicacions de la sèrie", full_width=true) }}
+
+Estableix `show_jump_to_posts = true` per forçar l'activació de la funció i `show_jump_to_posts = false` per desactivar-la.
+
+### Indexació de pàgines de sèries
+
+| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
+|:------:|:-------:|:-------------:|:------------------:|:-------------------:|
+| ❌ | ✅ | ✅ | ✅ | ❌ |
+
+Per defecte, les pàgines de sèries s'indexen (usant una indexació basada en 1) segons el `sort_by` de la secció de sèries.
+
+Estableix `post_listing_index_reversed = true` per invertir aquest índex.
+
---
## Integració amb repositoris Git
@@ -285,7 +393,7 @@ quick_navigation_buttons = true
- `show_reading_time = false` amaga el temps estimat de lectura.
- `quick_navigation_buttons = true` mostra els botons de navegació ràpida.
-Al costat del fitxer `_index.md`, pots crear un fitxer per a cada projecte. Per exemple, aquest és el bloc de metadades per a la pàgina del projecte [tabi](/ca/projects/tabi/):
+Al costat del fitxer `_index.md`, pots crear un fitxer per a cada projecte. Per exemple, aquest és el bloc de metadades per a la pàgina del projecte [tabi](@/projects/tabi/index.ca.md):
```toml
title = "tabi"
@@ -305,6 +413,33 @@ Quan un usuari faci clic a la imatge o al títol d'un projecte, serà portat a l
La pàgina del projecte individual es renderitza amb la plantilla predeterminada, tret que estableixis una altra, per exemple, `template = "info-page.html"`.
+#### Filtrar projectes
+
+Si afegeixes etiquetes als teus projectes, veuràs un filtre d'etiquetes:
+
+{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/projects_tag_filter_light.webp", dark_src="blog/mastering-tabi-settings/img/projects_tag_filter_dark.webp", alt="Pàgina de projectes amb filtre d'etiquetes", full_width=true) }}
+
+El sistema de filtratge d'etiquetes utilitza millora progressiva:
+
+- Sense JavaScript: Les etiquetes enllacen directament a pàgines d'etiquetes dedicades (per exemple, `/tags/nom-de-l-etiqueta`).
+- Amb JavaScript: Filtratge instantani, sincronització d'URL (#nom-etiqueta) i navegació amb el teclat.
+
+Per desactivar aquesta funció, estableix `enable_cards_tag_filtering = false` a la secció `[extra]` del fitxer `projects/_index.md` o a `config.toml`.
+
+{% admonition(type="tip") %}
+
+Per filtrar projectes per etiquetes, necessites establir etiquetes a la front matter de cada projecte. Per exemple:
+
+```toml
+title = "nom del projecte"
+weight = 40
+
+[taxonomies]
+tags = ["etiqueta", "etiqueta 2", "tercera etiqueta"]
+```
+
+{% end %}
+
### Arxiu
Afegir una pàgina d'arxiu és similar a afegir una pàgina de projectes. Pots crear un directori a `content/archive/`. Allà, pots crear un fitxer `_index.md` amb el següent encapçalament:
@@ -325,7 +460,14 @@ Per defecte, l'arxiu llistarà les publicacions situades a `blog/`. Per personal
section_path = ["blog/", "notes/", "camí-tres/"]
```
-**Nota**: la pàgina d'arxiu només llistarà publicacions que tinguin una data al seu encapçalament.
+L'arxiu mostra les publicacions en ordre cronològic invers (les més recents primer). Pots invertir aquest ordre establint `archive_reverse = true` a la secció `[extra]`:
+
+```toml
+[extra]
+archive_reverse = true # mostra les publicacions més antigues primer
+```
+
+{{ admonition(type="note", title="nota" text="La pàgina d'arxiu només llistarà publicacions que tinguin data al seu encapçalament.") }}
### Etiquetes
@@ -374,6 +516,17 @@ path = "about"
Fixa't com s'estableix `path = "about"`. Zola situarà la pàgina a `$base_url/about/`. Si vols que la pàgina estigui disponible a `/contacte/`, hauries d'establir `path = "contacte"`.
+La plantilla `info-page.html` també es pot utilitzar per crear landing pages a la ruta arrel (`"/"`). Per fer-ho, l'arxiu `content/_index.md` hauria de ser així:
+
+```markdown
++++
+title = "Títol de la pàgina"
+template = "info-page.html"
++++
+
+Contingut amb Markdown.
+```
+
---
## SEO
@@ -422,7 +575,7 @@ Per exemple, si configures `base_canonical_url = "https://example.com"`, l'URL c
Les targetes per a xarxes socials són les imatges que es mostren quan comparteixes un enllaç a les xarxes socials:
-
+{{ dimmable_image(src="img/with_social_media_card.webp", alt="Una captura de pantalla de WhatsApp mostrant un enllaç amb una targeta per a xarxes socials") }}
Pots establir la imatge per a xarxes socials amb `social_media_card = "img/social_media_card.png"`.
@@ -436,7 +589,19 @@ Si ambdues rutes, relativa i absoluta, són vàlides, la ruta relativa tindrà p
Ja que segueix la [jerarquia](#jerarquia-de-configuracio), si no està configurat en una pàgina, però sí ho està en una secció, s'utilitzarà la imatge de la secció. Si no està configurat en una pàgina o secció, però sí en `config.toml`, s'utilitzarà la imatge global.
-**Consell**: automatitza la seva creació amb un [script](https://github.com/welpo/osc.garden/blob/main/static/code/social-cards-zola): [De reservat a rei de les xarxes: automatitzant les vistes prèvies dels enllaços amb Zola](https://osc.garden/ca/blog/automating-social-media-cards-zola/).
+{{ admonition(type="tip", title="CONSELL", text="Automatitza la seva creació amb un [script](https://github.com/welpo/osc.garden/blob/main/static/code/social-cards-zola): [Automatitzant les vistes prèvies dels enllaços amb Zola](https://osc.garden/ca/blog/automating-social-media-cards-zola/).") }}
+
+### Creador del fedivers
+
+| Pàgina | Secció | `config.toml` | Segueix jerarquia | Requereix JavaScript |
+|:------:|:------:|:-------------:|:-----------------:|:--------------------:|
+| ❌ | ❌ | ✅ | ❌ | ❌ |
+
+Pots mostrar el perfil del fedivers de l'autor en les previsualitzacions d'enllaços de Mastodon configurant la variable `fediverse_creator` al teu `config.toml`. Per exemple, per a @username@example.com, fes servir:
+
+```toml
+fediverse_creator = { handle = "username", domain = "example.com" }
+```
---
@@ -448,7 +613,9 @@ Ja que segueix la [jerarquia](#jerarquia-de-configuracio), si no està configura
|:------:|:------:|:-------------:|:---------------:|:-------------------:|
| ❌ | ❌ | ✅ | ❌ | ❌ |
-La barra de navegació és la franja a la part superior de la pàgina que conté el títol del lloc i el menú de navegació. Pots personalitzar els elements que apareixen configurant `menu` en `config.toml`. Per exemple:
+La barra de navegació és la franja a la part superior de la pàgina que conté el títol del lloc i el menú de navegació. Pots personalitzar els elements que apareixen configurant `menu` en `config.toml`.
+
+Soporta links relatius per a pàgines internes i links absoluts per a enllaços externs. Per exemple:
```toml
menu = [
@@ -457,6 +624,7 @@ menu = [
{ name = "etiquetes", url = "tags", trailing_slash = true },
{ name = "projectes", url = "projects", trailing_slash = true },
{ name = "sobre nosaltres", url = "about", trailing_slash = true },
+ { name = "github", url = "https://github.com/welpo/tabi", trailing_slash = false },
]
```
@@ -480,7 +648,7 @@ Per activar-los, estableix `quick_navigation_buttons = true`.
Activa l'índex de continguts just sota del títol i metadades de l'article amb `toc = true`.
-Per saber més sobre com personalitzar-ho, consulta [la documentació sobre la Taula de continguts](/ca/blog/toc/).
+Per saber més sobre com personalitzar-ho, consulta [la documentació sobre la Taula de continguts](@/blog/toc/index.ca.md).
### Enllaços als articles anterior i següent
@@ -492,7 +660,7 @@ Mostra enllaços als articles anterior i següent a la part inferior dels posts.
{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/show_previous_next_article_links_light.webp", dark_src="blog/mastering-tabi-settings/img/show_previous_next_article_links_dark.webp", alt="Enllaços als articles anterior i següent", full_width=true) }}
-Per activar aquesta funció, estableix `show_previous_next_article_links = true`.
+Per activar aquesta funció, estableix `show_previous_next_article_links = true` i assegura't que la secció té un valor `sort_by` (per exemple `sort_by = "date"`).
Per defecte, els articles següents estaran al costat esquerre de la pàgina i els articles anteriors al costat dret.
Per invertir l'ordre (articles següents al costat dret i articles anteriors al costat esquerre), configura `invert_previous_next_article_links = true`.
@@ -503,6 +671,8 @@ Totes aquestes configuracions segueixen la jerarquia.
### Enllaços de retorn a les notes a peu de pàgina
+{{ admonition(type="warning", title="ADVERTÈNCIA DE DEPRECACIÓ", text="Zola v0.19.0 i posterior pot fer això de forma nativa. Estableix `bottom_footnotes = true` a la secció `[markdown]` de la teva configuració.") }}
+
| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
|:------:|:------:|:-------------:|:------------------:|:--------------------:|
| ✅ | ✅ | ✅ | ✅ | ✅ |
@@ -527,13 +697,21 @@ Establir `copy_button = true` afegirà un petit botó de copiar a la part superi
{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/copy_button_on_code_blocks_light.webp", dark_src="blog/mastering-tabi-settings/img/copy_button_on_code_blocks_dark.webp", alt="Botó de copiar en blocs de codi", full_width=true) }}
-### Mostrar ruta/URL en blocs de codi
+### Nom del bloc de codi clicable
| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
|:------:|:-------:|:-------------:|:---------------:|:-------------------:|
| ✅ | ✅ | ✅ | ✅ | ✅ |
-Estableix `add_src_to_code_block = true` per habilitar l'ús del [shortcode `add_src_to_code_block`](@/blog/shortcodes/index.ca.md#mostrar-ruta-o-url).
+En establir `code_block_name_links = true` s'habiliten els enllaços clicables als noms dels blocs de codi. Consulta la [documentació](@/blog/shortcodes/index.ca.md#mostrar-ruta-o-url) per veure exemples i ús.
+
+### Forçar blocs de codi d'esquerra a dreta
+
+| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
+|:------:|:------:|:-------------:|:-----------------:|:--------------------:|
+| ✅ | ✅ | ✅ | ✅ | ❌ |
+
+Per defecte, els blocs de codi es renderitzen d'esquerra a dreta, independentment de la direcció general del text. Estableix `force_codeblock_ltr = false` per permetre que els blocs de codi segueixin la direcció del document. Útil per a idiomes de dreta a esquerra que necessiten blocs de codi de dreta a esquerra.
### Suport per a KaTeX
@@ -543,17 +721,31 @@ Estableix `add_src_to_code_block = true` per habilitar l'ús del [shortcode `add
KaTeX és una biblioteca JavaScript ràpida i fàcil d'usar per a la representació de matemàtiques TeX a la web. Pots habilitar-ho amb `katex = true`. Mira com es veu en tabi [aquí](/ca/blog/markdown/#katex).
+### Suport per a Mermaid
+
+| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
+|:------:|:------:|:-------------:|:-----------------:|:--------------------:|
+| ✅ | ✅ | ✅ | ✅ | ✅ |
+
+[Mermaid](https://github.com/mermaid-js/mermaid) és una eina de diagramació i gràfics basada en JavaScript. Pots activar-la amb `mermaid = true`.
+
+Per defecte, la biblioteca Mermaid es serveix localment. Si prefereixes utilitzar un CDN, estableix `serve_local_mermaid = false` a `config.toml`. L'ús d'un CDN servirà la versió més recent de Mermaid; l'opció local servirà la versió inclosa amb tabi.
+
+Consulta la [documentació de Mermaid](@/blog/shortcodes/index.ca.md#diagrames-de-mermaid) per a instruccions d'ús i exemples.
+
### Subconjunt de tipus de lletra personalitzat
| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
|:------:|:------:|:-------------:|:------------------:|:--------------------:|
| ❌ | ❌ | ✅ | ❌ | ❌ |
-Les tipus de lletra personalitzades causen parpalleig del text en Firefox. Per resoldre això, tabi carrega un subconjunt de glifs per a la capçalera. Donat que això (lleugerament) augmenta el temps de càrrega inicial, és una bona idea intentar minimitzar la mida d'aquest subconjunt.
+Les tipus de lletra personalitzades causen parpalleig del text en Firefox. Per resoldre això, tabi carrega un subconjunt de glifs per a la capçalera. Donat que això (lleugerament) augmenta el temps de càrrega inicial, és una bona idea intentar minimitzar la mida d'aquest subconjunt, o desactivar-lo completament si no estàs fent servir un tipus de lletra personalitzat al teu tema.
Pots crear un subconjunt personalitzat adaptat al teu lloc, guardar-lo com a `static/custom_subset.css`, i fer que es carregui amb `custom_subset = true`.
-Per obtenir més informació, incloent instruccions sobre com crear un subconjunt personalitzat, consulta la [documentació](/ca/blog/custom-font-subset/).
+Per desactivar el subconjunt, utilitza `enable_subset = false`.
+
+Per obtenir més informació, incloent instruccions sobre com crear un subconjunt personalitzat, consulta la [documentació](@/blog/custom-font-subset/index.ca.md).
### Contingut complet al feed
@@ -569,7 +761,10 @@ Per defecte, el feed Atom només conté el resum o descripció de les teves publ
|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
| ✅ | ✅ | ✅ | ✅ | ❌ |
-Pots amagar pàgines específiques o seccions senceres del feed amb `hide_from_feed = true`.
+Pots controlar com apareix el contingut als feeds utilitzant dues configuracions:
+
+- `hide_from_feed = true`: Amaga el contingut de tots els feeds (feed principal, feeds de secció i feeds d'etiquetes)
+- `hide_from_main_feed = true`: Amaga el contingut només del feed principal mentre el manté visible als feeds de secció i d'etiquetes
### Comentaris {#afegir-comentaris}
@@ -583,7 +778,36 @@ Si vols activar els comentaris de forma global, pots fer-ho establint `enabled_f
Si has activat un sistema de forma global i vols desactivar-lo per a una pàgina específica, pots fer-ho establint el nom del sistema com a `false` al front matter. Per exemple, `utterances = false`.
-Llegeix la [documentació](/ca/blog/comments/) per a més informació sobre els sistemes disponibles i la seva configuració.
+Llegeix la [documentació](@/blog/comments/index.ca.md) per a més informació sobre els sistemes disponibles i la seva configuració.
+
+### Botons d'iine {#iine}
+
+| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
+|:------:|:------:|:-------------:|:--------------------:|:--------------------:|
+| ✅ | ✅ | ✅ | ✅ | ❌ |
+
+tabi permet botons d'[iine](https://iine.to/) per mostrar apreciació anònima pel teu contingut. Aquests botons centrats en la privadesa funcionen sense JavaScript i no rastegen usuaris.
+
+Per activar els botons iine globalment:
+
+```toml
+[extra]
+iine = true
+```
+
+Pots personalitzar la icona usada als botons (segueix la jerarquia):
+
+```toml
+[extra]
+iine_icon = "thumbs_up" # Opcions: "heart", "thumbs_up", "upvote", o qualsevol emoji
+```
+
+Per a llocs multilingües, pots unificar els recomptes de likes entre versions en diferents idiomes del mateix contingut (configuració només de config; valor per defecte és `true`):
+
+```toml
+[extra]
+iine_unified_languages = true # Els likes a /ca/blog/hello/ compten cap a /blog/hello/
+```
### Anàlisi web
@@ -598,7 +822,7 @@ Pots configurar-los en la secció `[extra.analytics]` del teu arxiu `config.toml
- `service`: el servei a utilitzar. Les opcions disponibles són `"goatcounter"`, `"umami", i "plausible"`.
- `id`: l'identificador únic per al teu servei d'anàlisi. Això varia segons el servei:
- - Per a GoatCounter, és el codi triat durant el registre. Instàncies auto-allotjades no requereixen aquest camp.
+ - Per a GoatCounter, és el codi triat durant el registre. Instàncies auto-allotjades de GoatCounter no requereixen aquest camp.
- Per a Umami, és l'ID del lloc web.
- Per a Plausible, és el nom de domini.
@@ -607,6 +831,8 @@ Pots configurar-los en la secció `[extra.analytics]` del teu arxiu `config.toml
- Per a Umami: `"https://umami.example.com"`
- Per a Plausible: `"https://plausible.example.com"`
+- `do_not_track`: (només per a Umami) opcional. Quan s'estableix com a `true`, es desactiva el seguiment per als usuaris els navegadors dels quals envien una capçalera "Do Not Track".
+
Un exemple de configuració per a GoatCounter no auto-allotjada seria:
```toml
@@ -646,6 +872,8 @@ Per utilitzar una icona personalitzada, pots afegir-la al directori `static/soci
{ name = "custom", url = "https://example.com", icon = "custom" }
```
+{{ admonition(type="note", title="NOTA", text="Tots els enllaços a xarxes socials inclouen l'[atribut](https://developer.mozilla.org/docs/Web/HTML/Attributes/rel/me) `rel='me'`. Això ajuda els motors de cerca i serveis web a verificar que les comptes de xarxes socials et pertanyen.") }}
+
### Icona de feed
| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
@@ -740,12 +968,25 @@ Per defecte, la data es mostra sota el títol de la publicació. Pots amagar-la
|:------:|:-------:|:-------------:|:---------------------:|:-------------------:|
| ❌ | ❌ | ✅ | ❌ | ❌ |
-tabi té dos formats de data: `long_date_format` i `short_date_format`. El format curt s'utilitza a les metadades d'una publicació, mentre que el format llarg s'utilitza al llistar les publicacions (és a dir, a la [secció de blog](/ca/blog/) o a la [pàgina principal](/ca/)).
+tabi té tres formats de data: `long_date_format`, `short_date_format` i `archive_data_format`. El format curt s'utilitza a les metadades d'una publicació, mentre que el format llarg s'utilitza al llistar les publicacions (és a dir, a la [secció de blog](/ca/blog/) o a la [pàgina principal](/ca/)). El format d'arxiu s'utilitza per mostrar el dia i el mes a la pàgina d'arxiu.
-Per defecte és "6th July 2049" per a ambdós formats en anglès. Per a altres idiomes, el predeterminat és `"%d %B %Y"` per al format llarg i `"%-d %b %Y"` per al format curt.
+Per defecte és "6th July 2049" per als formats curt i llarg en anglès. Per a altres idiomes, el predeterminat és `"%d %B %Y"` per al format llarg i `"%-d %b %Y"` per al format curt. El format d'arxiu predeterminat universal és `"%d %b"`.
A Zola, la sintaxi per al format de temps està inspirada en strftime. Una referència completa està disponible a la [documentació de chrono](https://docs.rs/chrono/0.4.31/chrono/format/strftime/index.html).
+#### Formats de data per idioma
+
+Pots personalitzar els formats de data per idiomes específics utilitzant la matriu `date_formats` a `config.toml`:
+
+```toml
+date_formats = [
+ { lang = "es", long = "%d de %B de %Y", short = "%-d %b %Y", archive = "%d de %b" },
+ { lang = "de", long = "%d. %B %Y", short = "%d.%m.%Y", archive = "%d. %b" },
+]
+```
+
+Això permet que diferents idiomes utilitzin formats de data culturalment apropiats (per exemple, "6. Juli 2049" per a alemany VS "6 de julio de 2049" per a espanyol).
+
### Separador personalitzat
| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
@@ -806,7 +1047,67 @@ allowed_domains = [
Aquesta opció està habilitada per defecte. Per desactivar-la per una pàgina, secció o globalment, estableix `enable_csp = false`. La configuració de `enable_csp` segueix la jerarquia.
-Per a més informació, consulta la [pàgina de documentació de CSP](/ca/blog/security/).
+Per a més informació, consulta la [pàgina de documentació de CSP](@/blog/security/index.ca.md).
+
+---
+
+## Indieweb
+
+### Webmentions
+
+| Pàgina | Secció | `config.toml` | Segueix jerarquia | Requereix JavaScript |
+|:------:|:------:|:-------------:|:-----------------:|:--------------------:|
+| ❓ | ❓ | ✅ | ❓ | ✅ |
+
+Com es descriu en l'estàndard W3C recomanat, [Webmention](https://www.w3.org/TR/webmention/#abstract-p-1) és una manera senzilla de notificar qualsevol URL quan la menciones al teu lloc web. Des de la perspectiva del receptor, és una manera de sol·licitar notificacions quan altres llocs web la mencionen.
+
+Per a llocs web estàtics, [webmention.io](https://webmention.io/) allotja un punt final de webmention que es pot utilitzar per rebre webmentions. Aquesta funcionalitat recupera les webmentions emmagatzemades a webmention.io i les mostra per a una pàgina. Hauràs de configurar un compte per al teu lloc web a webmention.io. Quan habilitis la funcionalitat de webmention, anunciarà el teu punt final de webmention.io i mostrarà les webmentions per a qualsevol pàgina.
+
+Habilita les webmentions per al teu lloc web afegint el següent al teu fitxer `config.toml`.
+
+```toml
+[extra.webmentions]
+enable = true
+# Especifica el domini registrat amb webmention.io.
+domain = "www.example.com"
+```
+
+❓: Per desactivar les webmentions per a una secció o pàgina específica, estableix `webmentions = false` a la secció `[extra]` del front matter d'aquesta secció o pàgina.
+
+La secció de webmentions es veu així:
+
+{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/webmention_light.webp", dark_src="blog/mastering-tabi-settings/img/webmention_dark.webp" alt="Captura de pantalla de webmentions mostrant republications, m'agrada, marcadors i comentaris", full_width=true) }}
+
+### h-card representativa
+
+| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
+| :--: | :-----: | :-----------: | :---------------: | :-----------------: |
+| ❌ | ❌ | ✅ | ❌ | ❌ |
+
+Per defecte, tabi afegeix una h-card representativa [h-card](https://microformats.org/wiki/h-card) **oculta** a la pàgina d'inici. Tot i que és invisible per als visitants, està disponible per als analitzadors de microformats. Pots comprovar la validesa de la targeta amb l'eina [Indiewebify.me](https://indiewebify.me/validate-h-card/).
+
+Per desactivar l'h-card, estableix `enable = false` a la secció `[extra.hcard]` de `config.toml`.
+
+L'h-card predeterminada inclou el teu nom, l'URL del lloc web i els enllaços a les xarxes socials.
+
+Pots establir una imatge de perfil i una petita biografia amb els paràmetres `avatar` i `biography`.
+
+Totes les altres [propietats h-card](https://microformats.org/wiki/h-card#Properties) es poden afegir llistant-les a la secció `[extra.hcard]` del fitxer de configuració. Simplement substitueix tots els caràcters `-` per `_`.
+
+---
+
+## Estenent elements HTML a tabi
+
+Alguns elements HTML a tabi es poden estendre per admetre casos d'ús addicionals, com ara afegir JavaScript personalitzat per a comportaments a tot el lloc al final de l'etiqueta `` o incloure contingut addicional al final de l'element `` que no estigui suportat per altres configuracions de tabi.
+
+Consulta la taula a continuació per veure els elements que es poden estendre:
+
+| Element | Plantilla |
+| :------: | :-------------------------------: |
+| `` | `templates/tabi/extend_head.html` |
+| `` | `templates/tabi/extend_body.html` |
+
+No hi ha configuracions explícites que hagis d'establir per al teu lloc o pàgines. Simplement crea el fitxer de plantilla corresponent per al teu lloc, i tabi l'inclourà automàticament.
---
diff --git a/content/blog/mastering-tabi-settings/index.es.md b/content/blog/mastering-tabi-settings/index.es.md
index ba4b60b..ba259fe 100644
--- a/content/blog/mastering-tabi-settings/index.es.md
+++ b/content/blog/mastering-tabi-settings/index.es.md
@@ -1,14 +1,14 @@
+++
title = "Domina la configuración de tabi: guía completa"
date = 2023-09-18
-updated = 2024-06-22
+updated = 2025-08-07
description = "Descubre las múltiples maneras en que puedes personalizar tabi."
[taxonomies]
tags = ["funcionalidad", "tutorial", "preguntas frecuentes"]
[extra]
-footnote_backlinks = true
+pinned = true
quick_navigation_buttons = true
social_media_card = "social_cards/es_blog_mastering_tabi_settings.jpg"
+++
@@ -26,11 +26,12 @@ tabi tiene una jerarquía que te permite personalizar tu sitio en diferentes niv
1. **Configuraciones globales**: Estas son las configuraciones que se aplican a todo tu sitio. Se establecen en `config.toml`.
2. **Configuraciones de sección**: Estas son las configuraciones que se aplican a una sección de tu sitio (por ejemplo, `/blog` o `/projects`). Se establecen en la metainformación del archivo `_index.md` de la sección.
-3. **Configuraciones de página**: Estas son las configuraciones que se aplican a una sola página. Se establecen en la metainformación de la página.
+3. **Configuración de la página «padre»**: Para páginas anidadas (páginas dentro de páginas), estas son las configuraciones de la página que las contiene.
+4. **Configuraciones de página**: Estas son las configuraciones que se aplican a una sola página. Se establecen en la metainformación de la página.
En todos los casos, las opciones de tabi se establecen en la sección `[extra]`.
-Para las configuraciones que siguen esta jerarquía, el valor establecido en una página reemplaza el valor de una sección, que a su vez reemplaza el valor global. En resumen: cuanto más específica sea la configuración, mayor prioridad tendrá, o `página > sección > config.toml`.
+Para las configuraciones que siguen esta jerarquía, el valor establecido en una página reemplaza el valor de una sección, que a su vez reemplaza el valor global. En resumen: cuanto más específica sea la configuración, mayor prioridad tendrá, o `página > página padre/sección > config.toml`.
---
@@ -87,7 +88,7 @@ Para detalles técnicos sobre la implementación de la búsqueda en tabi, incluy
## Soporte multilingüe
-tabi ofrece soporte multilingüe completo para tu sitio Zola, desde configurar un idioma predeterminado hasta añadir todos los que desees. Consulta la [preguntas frecuentes sobre idiomas](/es/blog/faq-languages/) para más información.
+tabi ofrece soporte multilingüe completo para tu sitio Zola, desde configurar un idioma predeterminado hasta añadir todos los que desees. Consulta la [preguntas frecuentes sobre idiomas](@/blog/faq-languages/index.es.md) para más información.
---
@@ -110,37 +111,77 @@ header = {title = "¡Hola! Soy tabi~", img = "blog/mastering-tabi-settings/img/m
La descripción es contenido Markdown normal, escrito fuera del front matter.
-#### Mostrando publicaciones recientes
+#### Listando publicaciones recientes
-Si deseas mostrar publicaciones en la página principal, primero necesitas decidir si su ruta será `/` o algo como `/blog`.
+Para mostrar publicaciones en la página principal, primero debes decidir de dónde se servirán: de la ruta raíz (`/`) o de un subdirectorio (por ejemplo, `/blog`).
-Si quieres servir las publicaciones desde `/`, necesitas configurar `paginate_by = 5` en el front matter de tu archivo `_index.md`. **Nota**: esto no se configura en el apartado `[extra]`, sino en el front matter principal. Ejemplo:
+**Opción A: Servir publicaciones desde la ruta raíz (`/`)**
+
+Configura `paginate_by` en el front matter de tu archivo `content/_index.md`:
```toml
+title = "Últimas publicaciones"
sort_by = "date"
-template = "section.html"
-paginate_by = 5
+paginate_by = 5 # Muestra 5 publicaciones por página.
[extra]
-header = {title = "¡Hola! Soy tabi~", img = "img/main.webp", img_alt = "Óscar Fernández, el autor del tema" }
+header = {title = "¡Hola! Soy tabi~", img = "img/main.webp", img_alt = "Tu nombre" }
```
-Si prefieres servir las publicaciones desde `/blog`, puedes configurar `section_path = "/blog"` en la sección `[extra]`. Esta es la configuración de esta demo:
+{{ admonition(type="note", text="La configuración `paginate_by` va en el front matter principal, no en la sección `[extra]`.") }}
+
+**Opción B: Servir publicaciones desde un subdirectorio (por ejemplo, `/blog`)**
+
+Utiliza `section_path` en la sección `[extra]` de tu archivo `content/_index.md`:
```toml
-title = "Publicaciones recientes"
+title = "Últimas publicaciones"
sort_by = "date"
-template = "section.html"
+# No configures `paginate_by` aquí.
[extra]
-header = {title = "¡Hola! Soy tabi~", img = "img/main.webp", img_alt = "Óscar Fernández, el autor del tema" }
-section_path = "blog/_index.es.md"
-max_posts = 4
+header = {title = "¡Hola! Soy tabi~", img = "img/main.webp", img_alt = "Tu nombre" }
+section_path = "blog/_index.md" # Dónde encontrar tus publicaciones.
+max_posts = 5 # Muestra hasta 5 publicaciones en la página principal.
```
-Fíjate que si configuras `section_path`, no necesitas configurar `paginate_by`. Puedes establecer `max_posts` para determinar el número de publicaciones que deseas mostrar en la página principal.
+{{ admonition(type="warning", title="ALERTA", text="No configures `paginate_by` y `section_path` a la vez. Estas configuraciones son mutuamente excluyentes y usarlas juntas puede resultar en que no se muestren publicaciones.") }}
-El `title` es el encabezado que aparece sobre las publicaciones.
+Notas adicionales:
+
+- El `title` en el front matter establece el título que aparece sobre las publicaciones.
+- Usa la ruta completa al archivo `_index.md` de la sección para `section_path`. Usar `section_path = "blog/"` no funcionará.
+
+##### Fijar publicaciones
+
+Puedes fijar publicaciones para mantenerlas en la parte superior de la página principal. En esta demo, esta publicación está fijada, por lo que aparece primera con un icono y etiqueta de "fijada":
+
+{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/pinned_post_light.webp", dark_src="blog/mastering-tabi-settings/img/pinned_post_dark.webp", alt="Entrada fijada", full_width=true) }}
+
+Las publicaciones fijadas se muestran primero, manteniendo su orden relativo según el `sort_by` de la sección, seguidas por el resto de las publicaciones.
+
+Para fijar una publicación, añade lo siguiente a su front matter:
+
+```toml
+[extra]
+pinned = true
+```
+
+{{ admonition(type="info", text="Este ajuste solo afecta a las páginas principales del sitio (como `/`, `/es/`, `/fr/`). Otras secciones como `blog/`, `tags/` o `archive/` muestran las publicaciones en su orden habitual.") }}
+
+{{ admonition(type="warning", text='Cuando se utiliza la paginación (`paginate_by`), las publicaciones destacadas pueden aparecer dos veces: una vez en la parte superior de la primera página, y otra en su posición cronológica normal en páginas posteriores.') }}
+
+##### Mostrar la fecha de los artículos en el listado
+
+Por defecto, cuando se listan los artículos, se muestra la fecha de creación. Puedes configurar qué fecha(s) mostrar usando la opción `post_listing_date`. Configuraciones disponibles:
+
+- `date`: Muestra solo la fecha de publicación original del artículo (opción por defecto).
+- `updated`: Muestra solo la fecha de la última actualización del artículo. Si no hay fecha de actualización, muestra la fecha de publicación original.
+- `both`: Muestra tanto la fecha de publicación original como la fecha de la última actualización.
+
+{% admonition(type="tip") %}
+Esta configuración sigue la jerarquía: puedes establecer un valor global en `config.toml` o configurarlo para secciones específicas en su archivo `_index.md`. En ambos casos, añádelo a la sección `[extra]`.
+{% end %}
#### Listado de proyectos
@@ -183,7 +224,38 @@ Las pieles de tabi cambian el color principal del sitio. Puedes configurar la pi
{{ image_toggler(default_src="blog/customise-tabi/skins/lavender_light.webp", toggled_src="blog/customise-tabi/skins/lavender_dark.webp", default_alt="piel lavender en modo claro", toggled_alt="piel lavender en modo oscuro", full_width=true) }}
-Explora las pieles disponibles y aprende cómo crear la tuya propia consultando [la documentación](/es/blog/customise-tabi/#skins).
+Explora las pieles disponibles y aprende cómo crear la tuya propia consultando [la documentación](@/blog/customise-tabi/index.es.md#skins).
+
+### Fuente sans serif (paloseco)
+
+| Página | Sección | `config.toml` | Sigue la jerarquía | Requiere JavaScript |
+|:------:|:-------:|:-------------:|:---------------:|:-------------------:|
+| ❌ | ❌ | ✅ | ❌ | ❌ |
+
+tabi utiliza una fuente serif para los párrafos de los artículos (la que estás viendo ahora). Puedes cambiar a una fuente sans serif (la que ves en los encabezados/menú) en todo tu sitio configurando `override_serif_with_sans = true` en `config.toml`.
+
+Haz clic en la imagen para comparar las fuentes:
+
+{{ image_toggler(default_src="blog/mastering-tabi-settings/img/serif.webp", toggled_src="blog/mastering-tabi-settings/img/sans-serif.webp", default_alt="Fuente serif", toggled_alt="Fuente sans-serif", full_width=true) }}
+
+### Indicador de enlaces externos
+
+| Página | Sección | `config.toml` | Sigue Jerarquía | Requiere JavaScript |
+|:------:|:-------:|:-------------:|:----------------:|:------------------:|
+| ❌ | ❌ | ✅ | ❌ | ❌ |
+
+{{ admonition(type="info", text="Requiere Zola 0.20.0 o posterior.") }}
+
+Si deseas añadir un icono a los enlaces externos, configura la sección `[markdown]` (no `[extra]`) en tu `config.toml`:
+
+```toml
+[markdown]
+external_links_class = "external"
+```
+
+Esto añadirá un pequeño icono junto a los enlaces externos:
+
+{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/external_link_light.webp", dark_src="blog/mastering-tabi-settings/img/external_link_dark.webp", alt="Icono de enlace externo", full_width=true) }}
### Estilos CSS personalizados
@@ -225,6 +297,43 @@ Establecer `compact_tags = true` mostrará las mismas de este modo:
[NombreEtiqueta](#) n
+### Orden de las etiquetas
+
+| Página | Sección | `config.toml` | Sigue la jerarquía | Requiere JavaScript |
+|:------:|:-------:|:-------------:|:---------------:|:-------------------:|
+| ❌ | ❌ | ✅ | ❌ | ❌ |
+
+Por defecto, la [página de etiquetas](/es/tags) ordena las etiquetas alfabéticamente, dada la configuración predeterminada de `tag_sorting = "name"`.
+Si configuras `tag_sorting = "frequency"`, se ordenarán según el número de publicaciones (de mayor a menor).
+
+---
+
+## Series
+
+Para una explicación detallada, consulta la [documentación de series](@/blog/series/index.es.md).
+
+### Enlace para saltar a las publicaciones
+
+| Página | Sección | `config.toml` | Sigue jerarquía | Requiere JavaScript |
+|:------:|:-------:|:-------------:|:------------------:|:-------------------:|
+| ❌ | ✅ | ✅ | ✅ | ❌ |
+
+Por defecto, aparece automáticamente un enlace "Saltar a publicaciones" junto al título de la serie cuando una serie tiene un contenido de más de 2000 caracteres:
+
+{{ dual_theme_image(light_src="blog/series/img/jump_to_series_posts_light.webp", dark_src="blog/series/img/jump_to_series_posts_dark.webp" alt="enlace para saltar a las publicaciones de la serie", full_width=true) }}
+
+Establece `show_jump_to_posts = true` para forzar la activación de la función y `show_jump_to_posts = false` para desactivarla.
+
+### Indexación de páginas de series
+
+| Página | Sección | `config.toml` | Sigue la jerarquía | Requiere JavaScript |
+|:------:|:-------:|:-------------:|:------------------:|:-------------------:|
+| ❌ | ✅ | ✅ | ✅ | ❌ |
+
+Por defecto, las páginas de series se indexan (usando una indexación basada en 1) según el `sort_by` de la sección de series.
+
+Establece `post_listing_index_reversed = true` para invertir el índice.
+
---
## Integración con repositorios Git
@@ -285,7 +394,7 @@ quick_navigation_buttons = true
- `show_reading_time = false` oculta el tiempo estimado de lectura.
- `quick_navigation_buttons = true` muestra los botones de navegación rápida.
-Junto al archivo `_index.md`, puedes crear un archivo para cada proyecto. Por ejemplo, este es el bloque de metadatos para la página del proyecto [tabi](/es/projects/tabi/):
+Junto al archivo `_index.md`, puedes crear un archivo para cada proyecto. Por ejemplo, este es el bloque de metadatos para la página del proyecto [tabi](@/projects/tabi/index.es.md):
```toml
title = "tabi"
@@ -305,6 +414,33 @@ Cuando un usuario haga clic en la imagen o el título de un proyecto, será llev
La página del proyecto individual se renderiza con la plantilla predeterminada, a menos que establezcas otra, por ejemplo, `template = "info-page.html"`.
+#### Filtrar proyectos
+
+Si agregas etiquetas a tus proyectos, verás un filtro de etiquetas:
+
+{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/projects_tag_filter_light.webp", dark_src="blog/mastering-tabi-settings/img/projects_tag_filter_dark.webp", alt="Página de proyectos con filtro de etiquetas", full_width=true) }}
+
+El sistema de filtrado de etiquetas utiliza mejora progresiva:
+
+- Sin JavaScript: Las etiquetas enlazan directamente a páginas de etiquetas dedicadas (por ejemplo, `/tags/nombre-etiqueta`).
+- Con JavaScript: Filtrado instantáneo, sincronización de URL (#nombre-etiqueta) y navegación por teclado.
+
+Para desactivar esta función, establece `enable_cards_tag_filtering = false` en la sección `[extra]` del archivo `projects/_index.md` o en `config.toml`.
+
+{% admonition(type="tip") %}
+
+Para filtrar proyectos por etiquetas, necesitas establecer etiquetas en el front matter de cada proyecto. Por ejemplo:
+
+```toml
+title = "nombre del proyecto"
+weight = 40
+
+[taxonomies]
+tags = ["etiqueta uno", "etiqueta 2", "tercera etiqueta"]
+```
+
+{% end %}
+
### Archivo
Agregar una página de archivo es similar a agregar una página de proyectos. Puedes crear un directorio en `content/archive/`. Allí, puedes crear un archivo `_index.md` con el siguiente encabezado:
@@ -325,7 +461,14 @@ Por defecto, el archivo mostrará las publicaciones ubicadas en `blog/`. Para pe
section_path = ["blog/", "notas/", "ruta-tres/"]
```
-**Nota**: la página de Archivo sólo listará publicaciones con fecha.
+El archivo muestra las publicaciones en orden cronológico inverso (las más recientes primero). Puedes invertir este orden estableciendo `archive_reverse = true` en la sección `[extra]`:
+
+```toml
+[extra]
+archive_reverse = true # muestra las publicaciones más antiguas primero
+```
+
+{{ admonition(type="note", title="nota" text="La página de Archivo sólo listará publicaciones que tengan fecha en su encabezado.") }}
### Etiquetas
@@ -374,6 +517,17 @@ path = "about"
Fíjate cómo se establece `path = "about"`. Zola colocará la página en `$base_url/about/`. Si deseas que la página esté disponible en `/contacto/`, tendrías que establecer `path = "contacto"`.
+La plantilla `info-page.html` también se puede utilizar para crear lading pages en la ruta raíz (`"/"`). Para hacerlo, el archivo `content/_index.md` debería verse así:
+
+```markdown
++++
+title = "Título de la página"
+template = "info-page.html"
++++
+
+Contenido con Markdown.
+```
+
---
## SEO
@@ -422,7 +576,7 @@ Por ejemplo, si configuras `base_canonical_url = "https://example.com"`, la URL
Las tarjetas para redes sociales son las imágenes que se muestran cuando compartes un enlace en redes sociales:
-
+{{ dimmable_image(src="img/with_social_media_card.webp", alt="Una captura de pantalla de WhatsApp mostrando un enlace con una tarjeta para redes sociales") }}
Puedes establecer la imagen para redes sociales con `social_media_card = "img/social_media_card.png"`.
@@ -436,7 +590,19 @@ Si ambas rutas, relativa y absoluta, son válidas, la ruta relativa tendrá prio
Dado que sigue la [jerarquía](#jerarquia-de-configuracion), si no está configurado en una página, pero sí lo está en una sección, se utilizará la imagen de la sección. Si no está configurado en una página o sección, pero sí en `config.toml`, se usará la imagen global.
-**Consejo**: automatiza su creación con un [script](https://github.com/welpo/osc.garden/blob/main/static/code/social-cards-zola): [De reservado a rey de las redes: automatizando las vistas previas de los enlaces con Zola](https://osc.garden/es/blog/automating-social-media-cards-zola/).
+{{ admonition(type="tip", title="CONSEJO", text="Automatiza su creación con un [script](https://github.com/welpo/osc.garden/blob/main/static/code/social-cards-zola): [Automatizando las vistas previas de los enlaces con Zola](https://osc.garden/es/blog/automating-social-media-cards-zola/).") }}
+
+### Creador del fediverso
+
+| Página | Sección | `config.toml` | Sigue jerarquía | Requiere JavaScript |
+|:------:|:-------:|:-------------:|:----------------:|:-------------------:|
+| ❌ | ❌ | ✅ | ❌ | ❌ |
+
+Puedes mostrar tu perfil del fediverso en las vistas previas de enlaces de Mastodon configurando la variable `fediverse_creator` en tu `config.toml`. Por ejemplo, para @username@example.com, usa:
+
+```toml
+fediverse_creator = { handle = "username", domain = "example.com" }
+```
---
@@ -448,7 +614,9 @@ Dado que sigue la [jerarquía](#jerarquia-de-configuracion), si no está configu
|:------:|:-------:|:-------------:|:---------------:|:-------------------:|
| ❌ | ❌ | ✅ | ❌ | ❌ |
-La barra de navegación es la barra en la parte superior de la página que contiene el título del sitio y el menú de navegación. Puedes personalizar los elementos que aparecen configurando `menu` en `config.toml`. Por ejemplo:
+La barra de navegación es la barra en la parte superior de la página que contiene el título del sitio y el menú de navegación. Puedes personalizar los elementos que aparecen configurando `menu` en `config.toml`.
+
+Soporta links relativos para páginas internas y links absolutos para enlaces externos. Por ejemplo:
```toml
menu = [
@@ -457,6 +625,7 @@ menu = [
{ name = "etiquetas", url = "tags", trailing_slash = true },
{ name = "proyectos", url = "projects", trailing_slash = true },
{ name = "acerca de", url = "about", trailing_slash = true },
+ { name = "github", url = "https://github.com/welpo/tabi", trailing_slash = false },
]
```
@@ -480,7 +649,7 @@ Para activarlos, establece `quick_navigation_buttons = true`.
Habilita el índice de contenidos justo debajo del título y metadatos del artículo con `toc = true`.
-Para saber más sobre cómo personalizarlo, consulta [la documentación sobre la Tabla de contenido](/es/blog/toc/).
+Para saber más sobre cómo personalizarlo, consulta [la documentación sobre la Tabla de contenido](@/blog/toc/index.es.md).
### Enlace a los artículos anterior y siguiente
@@ -492,7 +661,7 @@ Muestra enlaces a los artículos anterior y siguiente en la parte inferior de lo
{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/show_previous_next_article_links_light.webp", dark_src="blog/mastering-tabi-settings/img/show_previous_next_article_links_dark.webp", alt="Enlaces a los artículos anterior y siguiente", full_width=true) }}
-Para activar esta función, configura `show_previous_next_article_links = true`.
+Para activar esta función, configura `show_previous_next_article_links = true` y asegúrate de que tu sección tiene `sort_by` (por ejemplo, `sort_by = "date"`).
Por defecto, los artículos siguientes estarán en el lado izquierdo de la página y los artículos anteriores en el lado derecho.
Para invertir el orden (artículos siguientes en el lado derecho y artículos anteriores en el lado izquierdo), establece `invert_previous_next_article_links = true`.
@@ -503,6 +672,8 @@ Todas estas configuraciones siguen la jerarquía.
### Enlaces de retorno en notas al pie
+{{ admonition(type="warning", title="ADVERTENCIA DE DEPRECACIÓN", text="Zola v0.19.0 y posterior puede hacer esto de forma nativa. Establece `bottom_footnotes = true` en la sección `[markdown]` de tu configuración.") }}
+
| Página | Sección | `config.toml` | Sigue la jerarquía | Requiere JavaScript |
|:------:|:-------:|:-------------:|:---------------:|:-------------------:|
| ✅ | ✅ | ✅ | ✅ | ✅ |
@@ -527,13 +698,21 @@ Establecer `copy_button = true` añadirá un pequeño botón de copiar en la par
{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/copy_button_on_code_blocks_light.webp", dark_src="blog/mastering-tabi-settings/img/copy_button_on_code_blocks_dark.webp", alt="Botón de copiar en bloques de código", full_width=true) }}
-### Mostrar ruta/URL en bloques de código
+### Nombres de bloques de código clicables
| Página | Sección | `config.toml` | Sigue la jerarquía | Requiere JavaScript |
|:------:|:-------:|:-------------:|:---------------:|:-------------------:|
| ✅ | ✅ | ✅ | ✅ | ✅ |
-Establece `add_src_to_code_block = true` para habilitar el uso del [shortcode `add_src_to_code_block`](@/blog/shortcodes/index.es.md#mostrar-ruta-o-url).
+Establece `code_block_name_links = true` para habilitan los enlaces clickables en los nombres de bloques de código. Consulta la [documentación](@/blog/shortcodes/index.es.md#mostrar-ruta-o-url) para ver ejemplos y uso.
+
+### Forzar bloques de código de izquierda a derecha
+
+| Página | Sección | `config.toml` | Sigue la jerarquía | Requiere JavaScript |
+|:------:|:-------:|:-------------:|:----------------:|:-------------------:|
+| ✅ | ✅ | ✅ | ✅ | ❌ |
+
+Por defecto, los bloques de código se renderizan de izquierda a derecha, independientemente de la dirección general del texto. Establece `force_codeblock_ltr = false` para permitir que los bloques de código sigan la dirección del documento. Útil para idiomas de derecha a izquierda que necesitan bloques de código de derecha a izquierda.
### Soporte para KaTeX
@@ -543,17 +722,31 @@ Establece `add_src_to_code_block = true` para habilitar el uso del [shortcode `a
KaTeX es una biblioteca JavaScript rápida y fácil de usar para la representación de matemáticas TeX en la web. Puedes habilitarlo con `katex = true`. Mira cómo se ve en tabi [aquí](/es/blog/markdown/#katex).
+### Soporte para Mermaid
+
+| Página | Sección | `config.toml` | Sigue la jerarquía | Requiere JavaScript |
+|:------:|:-------:|:-------------:|:----------------:|:-------------------:|
+| ✅ | ✅ | ✅ | ✅ | ✅ |
+
+[Mermaid](https://github.com/mermaid-js/mermaid) es una herramienta de diagramación y gráficos basada en JavaScript. Puedes activarla con `mermaid = true`.
+
+Por defecto, la biblioteca Mermaid se sirve localmente. Si prefieres usar un CDN, establece `serve_local_mermaid = false` en `config.toml`. El uso de un CDN servirá la versión más reciente de Mermaid; la opción local servirá la versión incluida con tabi.
+
+Consulta la [documentación de Mermaid](@/blog/shortcodes/index.es.md#diagramas-de-mermaid) para instrucciones de uso y ejemplos.
+
### Subconjunto de fuente personalizada
| Página | Sección | `config.toml` | Sigue la jerarquía | Requiere JavaScript |
|:------:|:-------:|:-------------:|:---------------:|:-------------------:|
| ❌ | ❌ | ✅ | ❌ | ❌ |
-Las fuentes personalizadas causan parpadeo del texto en Firefox. Para solucionar esto, tabi carga un subconjunto de glifos para el encabezado. Dado que esto (ligeramente) aumenta el tiempo de carga inicial, es una buena idea intentar minimizar el tamaño de este subconjunto.
+Las fuentes personalizadas causan parpadeo del texto en Firefox. Para solucionar esto, tabi carga un subconjunto de glifos para el encabezado. Dado que esto (ligeramente) aumenta el tiempo de carga inicial, es una buena idea intentar minimizar el tamaño de este subconjunto, o desactivarlo por completo si no estás usando una fuente personalizada en tu tema.
Puedes crear un subconjunto personalizado adaptado a tu sitio, guardarlo como `static/custom_subset.css`, y hacer que se cargue con `custom_subset = true`.
-Para obtener más información, incluyendo instrucciones sobre cómo crear un subconjunto personalizado, consulta la [documentación](/es/blog/custom-font-subset/).
+Para desactivar el subconjunto, puedes usar `enable_subset = false`.
+
+Para obtener más información, incluyendo instrucciones sobre cómo crear un subconjunto personalizado, consulta la [documentación](@/blog/custom-font-subset/index.es.md).
### Contenido completo en el feed
@@ -569,7 +762,10 @@ Por defecto, el feed Atom solo contiene el resumen/descripción de tus publicaci
|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
| ✅ | ✅ | ✅ | ✅ | ❌ |
-Puedes ocultar páginas específicas o secciones enteras del feed con `hide_from_feed = true`.
+Puedes controlar cómo aparece el contenido en los feeds usando dos configuraciones:
+
+- `hide_from_feed = true`: Oculta el contenido de todos los feeds (feed principal, feeds de sección y feeds de etiquetas)
+- `hide_from_main_feed = true`: Oculta el contenido solo del feed principal mientras lo mantiene visible en los feeds de sección y de etiquetas
### Comentarios {#añadir-comentarios}
@@ -583,7 +779,38 @@ Si quieres activar los comentarios de forma global, puedes hacerlo estableciendo
Si has activado un sistema globalmente, pero quieres desactivarlo en una página específica, puedes hacerlo estableciendo el nombre del sistema como `false` en el front matter. Por ejemplo, `utterances = false`.
-Lee la [documentación](/es/blog/comments/) para obtener más información sobre los sistemas disponibles y su configuración.
+Lee la [documentación](@/blog/comments/index.es.md) para obtener más información sobre los sistemas disponibles y su configuración.
+
+### Botones de iine {#iine}
+
+| Página | Sección | `config.toml` | Sigue la jerarquía | Requiere JavaScript |
+|:------:|:-------:|:-------------:|:-------------------:|:-------------------:|
+| ✅ | ✅ | ✅ | ✅ | ❌ |
+
+tabi soporta botones de [iine](https://iine.to/) para mostrar apreciación anónima por tu contenido. Estos botones centrados en la privacidad funcionan sin JavaScript y no rastrean usuarios.
+
+Para activar los botones iine globalmente:
+
+```toml
+[extra]
+iine = true
+```
+
+Puedes personalizar el icono usado en los botones (esta configuración sigue la jerarquía):
+
+```toml
+[extra]
+iine_icon = "thumbs_up" # Opciones: "heart", "thumbs_up", "upvote", o cualquier emoji
+```
+
+Para sitios multilingües, puedes unificar los conteos de likes entre versiones en diferentes idiomas del mismo contenido (configuración solo de config; valor predeterminado: `true`):
+
+```toml
+[extra]
+iine_unified_languages = true # Los likes en /es/blog/hello/ cuentan hacia /blog/hello/
+```
+
+También puedes activar los botones iine en páginas o secciones individuales estableciendo `iine = true` en su front matter, o personalizar el icono con `iine_icon = "🚀"`.
### Análisis web
@@ -598,7 +825,7 @@ Puedes configurarlos en la sección `[extra.analytics]` de tu archivo `config.to
- `service`: el servicio a utilizar. Las opciones disponibles son `"goatcounter"`, `"umami"`, y `"plausible"`.
- `id`: el identificador único para tu servicio de análisis. Esto varía según el servicio:
- - Para GoatCounter, es el código elegido durante el registro. Instancias auto-alojadas no requieren este campo.
+ - Para GoatCounter, es el código elegido durante el registro. Instancias auto-alojadas de GoatCounter no requieren este campo.
- Para Umami, es la ID del sitio web.
- Para Plausible, es el nombre de dominio.
@@ -607,6 +834,8 @@ Puedes configurarlos en la sección `[extra.analytics]` de tu archivo `config.to
- Para Umami: `"https://umami.example.com"`
- Para Plausible: `"https://plausible.example.com"`
+- `do_not_track`: (sólo para Umami) opcional. Cuando se establece en `true`, se desactiva el seguimiento para los usuarios cuyos navegadores envían un encabezado "Do Not Track".
+
Un ejemplo de configuración para GoatCounter no auto-alojada sería:
```toml
@@ -648,6 +877,8 @@ Para usar un icono personalizado, puedes añadirlo al directorio `static/social_
{ name = "custom", url = "https://example.com", icon = "custom" }
```
+{{ admonition(type="note", title="NOTA", text="Todos los enlaces sociales incluyen el [atributo](https://developer.mozilla.org/docs/Web/HTML/Attributes/rel/me) `rel='me'`. Esto ayuda a los motores de búsqueda y servicios web a verificar que las cuentas de redes sociales te pertenecen.") }}
+
### Icono de feed
| Página | Sección | `config.toml` | Respeta jerarquía | Requiere JavaScript |
@@ -742,12 +973,25 @@ Por defecto, la fecha se muestra debajo del título de la publicación. Puedes o
|:------:|:-------:|:-------------:|:------------------:|:-------------------:|
| ❌ | ❌ | ✅ | ❌ | ❌ |
-tabi tiene dos formatos de fecha: `long_date_format` y `short_date_format`. El formato corto se utiliza en los metadatos de una publicación, mientras que el formato largo se utiliza al listar las publicaciones (es decir, en la [sección de blog](/es/blog/) o en la [página principal](/es/)).
+tabi tiene tres formatos de fecha: `long_date_format`, `short_date_format` y `archive_date_format`. El formato corto se utiliza en los metadatos de una publicación, mientras que el formato largo se utiliza al listar las publicaciones (es decir, en la [sección de blog](/es/blog/) o en la [página principal](/es/)). El formato de archivo se usa para mostrar el día y el mes en la página de archivo.
-Por defecto es "6th July 2049" para ambos formatos en inglés. Para otros idiomas, el predeterminado es `"%d %B %Y"` para el formato largo y `"%-d %b %Y"` para el formato corto.
+Por defecto es "6th July 2049" para los formatos corto y largo en inglés. Para otros idiomas, el predeterminado es `"%d %B %Y"` para el formato largo y `"%-d %b %Y"` para el formato corto. El formato de archivo predeterminado universal es `"%d %b"`.
En Zola, la sintaxis para el formateo de tiempo está inspirada en strftime. Una referencia completa está disponible en la [documentación de chrono](https://docs.rs/chrono/0.4.31/chrono/format/strftime/index.html).
+#### Formatos de fecha por idioma
+
+Puedes personalizar los formatos de fecha para idiomas específicos usando la matriz `date_formats` en `config.toml`:
+
+```toml
+date_formats = [
+ { lang = "es", long = "%d de %B de %Y", short = "%-d %b %Y", archive = "%d de %b" },
+ { lang = "de", long = "%d. %B %Y", short = "%d.%m.%Y", archive = "%d. %b" },
+]
+```
+
+Esto permite que diferentes idiomas usen formatos de fecha culturalmente apropiados (por ejemplo, "6 de julio de 2049" en español o "6. Juli 2049" en alemán).
+
### Separador personalizado
| Página | Sección | `config.toml` | Sigue la jerarquía | Requiere JavaScript |
@@ -806,7 +1050,67 @@ allowed_domains = [
Esta función está habilitada por defecto. Para deshabilitarla (y permitir todo), configura `enable_csp = false` en una página, sección o globalmente. La opción `enable_csp` sigue [la jerarquía](#jerarquia-de-configuracion).
-Para obtener más información, consulta la [página de documentación de CSP](/es/blog/security/).
+Para obtener más información, consulta la [página de documentación de CSP](@/blog/security/index.es.md).
+
+---
+
+## Indieweb
+
+### Webmentions
+
+| Página | Sección | `config.toml` | Sigue la jerarquía | Requiere JavaScript |
+|:------:|:-------:|:-------------:|:---------------:|:-------------------:|
+| ❓ | ❓ | ✅ | ❓ | ✅ |
+
+Como se describe en el estándar W3C recomendado, [Webmention](https://www.w3.org/TR/webmention/#abstract-p-1) es una manera sencilla de notificar cualquier URL cuando la mencionas en tu sitio web. Desde la perspectiva del receptor, es una forma de solicitar notificaciones cuando otros sitios web la mencionan.
+
+Para sitios web estáticos, [webmention.io](https://webmention.io/) aloja un punto final de webmention que se puede utilizar para recibir webmentions. Esta función recupera las webmentions almacenadas en webmention.io y las muestra para una página. Necesitarás configurar una cuenta para tu sitio web en webmention.io. Cuando habilites la función, anunciará tu punto final de webmention.io y mostrará las webmentions para cualquier página.
+
+Habilita las webmentions para tu sitio web agregando lo siguiente a tu archivo `config.toml`.
+
+```toml
+[extra.webmentions]
+enable = true
+# Especifica el dominio registrado con webmention.io.
+domain = "www.example.com"
+```
+
+❓: Para desactivar las webmentions para una sección o página específica, establece `webmentions = false` en la sección `[extra]` del front matter de esa sección o página.
+
+La sección de webmentions se ve así:
+
+{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/webmention_light.webp", dark_src="blog/mastering-tabi-settings/img/webmention_dark.webp" alt="Captura de pantalla de webmentions mostrando reposts, me gusta, marcadores y comentarios", full_width=true) }}
+
+### h-card representativa
+
+| Página | Sección | `config.toml` | Sigue Jerarquía | Requiere JavaScript |
+| :--: | :-----: | :-----------: | :---------------: | :-----------------: |
+| ❌ | ❌ | ✅ | ❌ | ❌ |
+
+Por defecto, tabi añade una [h-card](https://microformats.org/wiki/h-card) representativa **oculta** a la página de inicio. Aunque es invisible para los visitantes, está disponible para los analizadores de microformatos. Puedes comprobar la validez de la tarjeta con la herramienta [Indiewebify.me](https://indiewebify.me/validate-h-card/).
+
+Para desactivar la h-card, establece `enable = false` en la sección `[extra.hcard]` de `config.toml`.
+
+La h-card predeterminada incluye tu nombre, la URL del sitio web y los enlaces a redes sociales.
+
+Puedes establecer una imagen de perfil y una pequeña biografía con los ajustes `avatar` y `biography`.
+
+Todas las demás [propiedades de h-card](https://microformats.org/wiki/h-card#Properties) se pueden añadir listándolas en la sección `[extra.hcard]` del archivo de configuración. Simplemente reemplaza todos los caracteres `-` por `_`.
+
+---
+
+## Extendiendo elementos HTML en tabi
+
+Algunos elementos HTML en tabi pueden extenderse para admitir casos de uso adicionales, como agregar JavaScript personalizado para comportamientos en todo el sitio al final de la etiqueta `` o incluir contenido adicional al final del elemento `` que no esté soportado por otras configuraciones de tabi.
+
+Consulta la tabla a continuación para ver los elementos que pueden extenderse:
+
+| Elemento | Plantilla |
+| :------: | :-------------------------------: |
+| `` | `templates/tabi/extend_head.html` |
+| `` | `templates/tabi/extend_body.html` |
+
+No hay configuraciones explícitas que debas establecer para tu sitio o páginas. Simplemente crea el archivo de plantilla correspondiente para tu sitio, y tabi lo incluirá automáticamente.
---
diff --git a/content/blog/mastering-tabi-settings/index.md b/content/blog/mastering-tabi-settings/index.md
index a3ba80e..68e399a 100644
--- a/content/blog/mastering-tabi-settings/index.md
+++ b/content/blog/mastering-tabi-settings/index.md
@@ -1,14 +1,14 @@
+++
title = "Mastering tabi Settings: A Comprehensive Guide"
date = 2023-09-18
-updated = 2024-06-22
+updated = 2025-08-07
description = "Discover the many ways you can customise your tabi site."
[taxonomies]
tags = ["showcase", "tutorial", "FAQ"]
[extra]
-footnote_backlinks = true
+pinned = true
quick_navigation_buttons = true
social_media_card = "social_cards/blog_mastering_tabi_settings.jpg"
+++
@@ -26,11 +26,12 @@ tabi has a hierarchy that allows you to customise your site at different levels.
1. **Global settings**: These are the settings that apply to your entire site. They are set in `config.toml`.
2. **Section settings**: These are the settings that apply to a section of your site (e.g.`/blog` or `/projects`). They are set in the front matter of the `_index.md` file of the section.
-3. **Page settings**: These are the settings that apply to a single page. They are set in the front matter of the page.
+3. **Parent page settings**: For nested pages (pages within pages), these are the settings from the parent page.
+4. **Page settings**: These are the settings that apply to a single page. They are set in the front matter of the page.
In all cases, tabi's settings are set in the `[extra]` section.
-For settings which follow this hierarchy, the value set on a page overrides the value for a section, which overrides the global value. In short: the more specific the setting, the higher priority it has, or `page > section > config.toml`.
+For settings which follow this hierarchy, the value set on a page overrides the value for a section, which overrides the global value. In short: the more specific the setting, the higher priority it has, or `page > parent page/section > config.toml`.
---
@@ -87,7 +88,7 @@ For technical details about the search implementation in tabi, including when th
## Multilingual Support
-tabi offers comprehensive multilingual support for your Zola site, from setting a default language to adding as many as you wish. Refer to the [multilingual FAQ](blog/faq-languages/) for more information.
+tabi offers comprehensive multilingual support for your Zola site, from setting a default language to adding as many as you wish. Refer to the [multilingual FAQ](@/blog/faq-languages/index.md) for more information.
---
@@ -112,35 +113,79 @@ The description is regular Markdown content, set outside the front matter.
#### Listing Recent Posts
-If you'd like to show posts on the main page, you first need to decide whether their path will be `/` or something like `/blog`.
+To show posts on your main page, you first need to decide where these posts will be served from: the root path (`/`) or a subdirectory (e.g., `/blog`).
-If you want to serve the posts from `/`, you need to set `paginate_by = 5` in the front matter of your `_index.md` file. **Note**: this is not in the `[extra]` section, but in the main front matter. Example:
+**Option A: Serve posts from the root path (`/`)**
-```toml
-sort_by = "date"
-template = "section.html"
-paginate_by = 5
-
-[extra]
-header = {title = "Hello! I'm tabi~", img = "img/main.webp", img_alt = "Óscar Fernández, the theme's author" }
-```
-
-If you'd rather serve the posts from `/blog`, you can set `section_path = "/blog"` in the `[extra]` section. This is the setup of this demo:
+Set `paginate_by` in the front matter of your `content/_index.md` file:
```toml
title = "Latest posts"
sort_by = "date"
-template = "section.html"
+paginate_by = 5 # Show 5 posts per page.
[extra]
-header = {title = "Hello! I'm tabi~", img = "img/main.webp", img_alt = "Óscar Fernández, the theme's author" }
-section_path = "blog/_index.md"
-max_posts = 4
+header = {title = "Hello! I'm tabi~", img = "img/main.webp", img_alt = "Your Name" }
```
-Notice how if you set `section_path`, you don't need to set `paginate_by`. You can set `max_posts` to the determine the number of posts you want to show on the main page.
+{{ admonition(type="note", text="The `paginate_by` setting goes in the main front matter, not in the `[extra]` section.") }}
-The `title` is the header that appears above the posts.
+**Option B: Serve posts from a subdirectory (e.g., `/blog`)**
+
+Use `section_path` in the `[extra]` section of your `content/_index.md` file:
+
+```toml
+title = "Latest posts"
+sort_by = "date"
+# Do not set `paginate_by` here.
+
+[extra]
+header = {title = "Hello! I'm tabi~", img = "img/main.webp", img_alt = "Your Name" }
+section_path = "blog/_index.md" # Where to find your posts.
+max_posts = 5 # Show up to 5 posts on the main page.
+```
+
+{{ admonition(type="warning", text="Do not set both `paginate_by` and `section_path`. These settings are mutually exclusive and using both may result in no posts being displayed.") }}
+
+Additional notes:
+
+- The `title` in the front matter sets the header that appears above the posts.
+- Use the full path to the section's `_index.md` file for `section_path`. Using `section_path = "blog/"` will not work.
+
+##### Pinning Posts
+
+You can pin posts to keep them at the top of the main page listing. In this demo, this post is pinned, so it appears first with a "pinned" icon and label:
+
+{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/pinned_post_light.webp", dark_src="blog/mastering-tabi-settings/img/pinned_post_dark.webp", alt="Pinned post", full_width=true) }}
+
+Pinned posts are shown first, maintaining their relative order of the section's `sort_by`, followed by regular posts.
+
+To pin a post, add the following to its front matter:
+
+```toml
+[extra]
+pinned = true
+```
+
+{{ admonition(type="info", text="This setting only affects your site's main pages (like `/`, `/es/`, `/fr/`). Other sections like `blog/`, `tags/`, or `archive/` show posts in their normal order.") }}
+
+{{ admonition(type="warning", text='When using pagination (`paginate_by`), pinned posts may appear twice: once on top of page 1, and again in their normal chronological position on subsequent pages.') }}
+
+##### Display the Date of Posts in Listing
+
+By default, when listing posts, the date of post creation is shown. You can configure which date(s) to display using the `post_listing_date` option. Available settings:
+
+- `date`: Show only the original date of the post (default).
+- `updated`: Show only the last updated date of the post. If there is no last updated date, it shows the original date.
+- `both`: Show both the original date and the last updated date.
+
+```toml
+post_listing_date = "date"
+```
+
+{% admonition(type="tip") %}
+This setting follows the hierarchy: you can set a global value in `config.toml` or override it for specific sections in their `_index.md` file. In both cases, add it to the `[extra]` section.
+{% end %}
#### Listing Projects
@@ -183,7 +228,38 @@ tabi's skins change the main colour of the site. You can set the skin in `config
{{ image_toggler(default_src="blog/customise-tabi/skins/lavender_light.webp", toggled_src="blog/customise-tabi/skins/lavender_dark.webp", default_alt="lavender skin in light mode", toggled_alt="lavender skin in dark mode", full_width=true) }}
-Explore the available skins and learn how to create your own reading [the documentation](/blog/customise-tabi/#skins).
+Explore the available skins and learn how to create your own reading [the documentation](@/blog/customise-tabi/index.md#skins).
+
+### Sans-serif Font
+
+| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
+|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
+| ❌ | ❌ | ✅ | ❌ | ❌ |
+
+tabi uses a serif font for article paragraphs (the one you're seeing now). You can switch to using a sans-serif font (the one on the headers/menu) throughout your entire site by setting `override_serif_with_sans = true` in your `config.toml`.
+
+Click on the image below to compare the two looks:
+
+{{ image_toggler(default_src="blog/mastering-tabi-settings/img/serif.webp", toggled_src="blog/mastering-tabi-settings/img/sans-serif.webp", default_alt="Serif font", toggled_alt="Sans-serif font", full_width=true) }}
+
+### External Link Indicator
+
+| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
+|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
+| ❌ | ❌ | ✅ | ❌ | ❌ |
+
+{{ admonition(type="info", text="Requires Zola 0.20.0 or later.") }}
+
+If you'd like to add an icon to external links, configure the `[markdown]` (not `[extra]`) section in your `config.toml`:
+
+```toml
+[markdown]
+external_links_class = "external"
+```
+
+This will add a small icon next to external links:
+
+{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/external_link_light.webp", dark_src="blog/mastering-tabi-settings/img/external_link_dark.webp", alt="External link icon", full_width=true) }}
### Custom CSS
@@ -225,6 +301,44 @@ Setting `compact_tags = true` will display them as:
[TagName](#) n
+### Tags Sorting
+
+| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
+|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
+| ❌ | ❌ | ✅ | ❌ | ❌ |
+
+By default, the [tags page](/tags) sorts tags alphabetically, given the default setting of `tag_sorting = "name"`.
+
+Setting `tag_sorting = "frequency"` will sort them by number-of-posts (descending).
+
+---
+
+## Series
+
+For a detailed explanation of the series feature, see the [series documentation](@/blog/series/index.md).
+
+### Jump to posts link
+
+| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
+|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
+| ❌ | ✅ | ✅ | ✅ | ❌ |
+
+By default, a "Jump to posts" link automatically appears next to the series title when a series has a content over 2000 characters:
+
+{{ dual_theme_image(light_src="blog/series/img/jump_to_series_posts_light.webp", dark_src="blog/series/img/jump_to_series_posts_dark.webp" alt="jump to series posts link", full_width=true) }}
+
+Set `show_jump_to_posts = true` to force the feature on and `show_jump_to_posts = false` to force it off.
+
+### Series pages indexation
+
+| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
+|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
+| ❌ | ✅ | ✅ | ✅ | ❌ |
+
+By default, series page are indexed (using a 1-based indexing) as per the series section `sort_by`.
+
+Set `post_listing_index_reversed = true` to reverse this index.
+
---
## Git Repository Integration
@@ -265,7 +379,7 @@ Clicking on this link will take you to the commit history of the post, where you
### Projects
-tabi has a built-in projects template. To enable it, you can create a directory in `content/projects/`. There, you can create a `_index.md` file with the following front matter:
+tabi has a built-in projects (cards) template. To enable it, you can create a directory in `content/projects/`. There, you can create a `_index.md` file with the following front matter:
```toml
title = "Projects"
@@ -285,11 +399,11 @@ quick_navigation_buttons = true
- `show_reading_time = false` hides the [reading time](#reading-time).
- `quick_navigation_buttons = true` shows the [quick navigation buttons](#quick-navigation-buttons) are shown.
-Alongside the `_index.md` file, you can create a file for each project. For example, this is the front matter for the [tabi project page](/projects/tabi/):
+Alongside the `_index.md` file, you can create a file for each project. For example, this is the front matter for the [tabi project page](@/projects/tabi/index.md):
```toml
title = "tabi"
-description = "A fast, lightweight, and modern Zola theme with multi-language support."
+description = "A feature-rich modern Zola theme with first-class multi-language support."
weight = 1
[extra]
@@ -305,6 +419,33 @@ When a user clicks on the image or title of a project, they will be taken to the
The individual project's page is rendered with the default template, unless you set another one, e.g. `template = "info-page.html"`.
+#### Filtering Projects
+
+If you add tags to your projects, you will see a tag filter:
+
+{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/projects_tag_filter_light.webp", dark_src="blog/mastering-tabi-settings/img/projects_tag_filter_dark.webp", alt="Projects page with tag filter", full_width=true) }}
+
+The tag filtering system uses progressive enhancement:
+
+- Without JavaScript: Tags link directly to dedicated tag pages (e.g. `/tags/tag-name`)
+- With JavaScript: Instant filtering, URL syncing (#tag-name), and keyboard navigation
+
+To disable this feature, set `enable_cards_tag_filtering = false` in the `[extra]` section of the `projects/_index.md` file or in `config.toml`.
+
+{% admonition(type="tip") %}
+
+To filter projects by tags, you need to set tags in the front matter of each project. For example:
+
+```toml
+title = "project name"
+weight = 40
+
+[taxonomies]
+tags = ["tag one", "tag 2", "third tag"]
+```
+
+{% end %}
+
### Archive
Adding an archive page is similar to adding a projects page. You can create a directory in `content/archive/`. There, you can create a `_index.md` file with the following front matter:
@@ -325,7 +466,14 @@ By default, the archive will list posts located in `blog/`. To customise this, y
section_path = ["blog/", "notes/", "path-three/"]
```
-**Note**: the Archive page will only list posts that have a date in their front matter.
+The archive displays posts in reverse chronological order (newest first). You can reverse this order by setting `archive_reverse = true` in the `[extra]` section:
+
+```toml
+[extra]
+archive_reverse = true # displays oldest posts first.
+```
+
+{{ admonition(type="note", text="The Archive page will only list posts that have a date in their front matter.") }}
### Tags
@@ -374,6 +522,17 @@ path = "about"
Notice how the `path` is set to `about`. Zola will place the page at `$base_url/about/`. If you'd like to have the page available at `/contact/`, you'd set `path = "contact"`.
+The `info-page.html` template can also be used to create landing pages at the path root (`"/"`). To do that, the `content/_index.md` file should look like this:
+
+```markdown
++++
+title = "Landing Page Title"
+template = "info-page.html"
++++
+
+Place your landing page Markdown content here.
+```
+
---
## SEO
@@ -422,7 +581,7 @@ For example, if you set `base_canonical_url = "https://example.com"`, the canoni
Social media cards are the images that are displayed when you share a link on social media:
-
+{{ dimmable_image(src="img/with_social_media_card.webp", alt="A screenshot of WhatsApp showing a link with a social media card") }}
You can set the social media image with `social_media_card = "img/social_media_card.png"`.
@@ -436,7 +595,21 @@ If both relative and absolute paths are valid, the relative path will take prece
Since it follows the [hierarchy](#settings-hierarchy), if it's not set on a page, but is set on a section, the section's image will be used. If it's not set on a page or section, but is set in `config.toml`, the global image will be used.
-**Protip**: automate their creation with a [script](https://github.com/welpo/osc.garden/blob/main/static/code/social-cards-zola): [From Bashful to Social Butterfly: Automating Link Previews for Zola Sites](https://osc.garden/blog/automating-social-media-cards-zola/).
+{{ admonition(type="tip", title="PROTIP", text="Automate their creation with a [script](https://github.com/welpo/osc.garden/blob/main/static/code/social-cards-zola): [Automating Link Previews for Zola Sites](https://osc.garden/blog/automating-social-media-cards-zola/).") }}
+
+### Fediverse Creator
+
+| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
+|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
+| ❌ | ❌ | ✅ | ❌ | ❌ |
+
+You can highlight your fediverse profile in Mastodon link previews by setting the `fediverse_creator` variable in your `config.toml`. For example, for @username@example.com, use:
+
+```toml
+fediverse_creator = { handle = "username", domain = "example.com" }
+```
+
+This adds metadata to your HTML, allowing Mastodon to display the author's fediverse profile when your content is shared.
---
@@ -448,7 +621,9 @@ Since it follows the [hierarchy](#settings-hierarchy), if it's not set on a page
|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
| ❌ | ❌ | ✅ | ❌ | ❌ |
-The navigation bar is the bar at the top of the page that contains the site title and the navigation menu. You can customise which items appear by setting `menu` in `config.toml`. For example:
+The navigation bar is the bar at the top of the page that contains the site title and the navigation menu. You can customise which items appear by setting `menu` in `config.toml`.
+
+The menu supports both relative URLs for internal pages and absolute URLs for external links. For example:
```toml
menu = [
@@ -457,6 +632,7 @@ menu = [
{ name = "tags", url = "tags", trailing_slash = true },
{ name = "projects", url = "projects", trailing_slash = true },
{ name = "about", url = "about", trailing_slash = true },
+ { name = "github", url = "https://github.com/welpo/tabi", trailing_slash = false },
]
```
@@ -482,7 +658,7 @@ To enable them, set `quick_navigation_buttons = true`.
Enable the table of contents right below the post's title and metadata with `toc = true`.
-Read more about the table of contents and how to customise it by reading [the docs](/blog/toc/).
+Read more about the table of contents and how to customise it by reading [the docs](@/blog/toc/index.md).
### Previous and Next Article Links
@@ -494,7 +670,7 @@ Displays links to the previous and next articles at the bottom of posts. It look
{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/show_previous_next_article_links_light.webp", dark_src="blog/mastering-tabi-settings/img/show_previous_next_article_links_dark.webp" alt="Previous and next article links", full_width=true) }}
-To activate this feature, set `show_previous_next_article_links = true`.
+To activate this feature, set `show_previous_next_article_links = true` and ensure your section has a `sort_by` value (e.g. `sort_by = "date"`).
By default, next articles will be on the left side of the page and previous articles will be on the right side.
To reverse the order (next articles on the right and previous articles on the left), set `invert_previous_next_article_links = true`.
@@ -506,6 +682,8 @@ All of these settings follow the hierarchy.
### Footnote Backlinks
+{{ admonition(type="warning", title="DEPRECATION WARNING", text="Zola v0.19.0 and later can do this natively. Set `bottom_footnotes = true` in your config's `[markdown]` section.") }}
+
| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
| ✅ | ✅ | ✅ | ✅ | ✅ |
@@ -530,13 +708,21 @@ Setting `copy_button = true` will add a small copy button to the top right of co
{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/copy_button_on_code_blocks_light.webp", dark_src="blog/mastering-tabi-settings/img/copy_button_on_code_blocks_dark.webp" alt="Copy button on code blocks", full_width=true) }}
-### Source/Path on Code Blocks
+### Clickable Code Block Names
| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
| ✅ | ✅ | ✅ | ✅ | ✅ |
-Setting `add_src_to_code_block = true` enables the use of the [`add_src_to_code_block` shortcode](@/blog/shortcodes/index.md#show-source-or-path).
+Setting `code_block_name_links = true` enables URLs in code block names to become clickable links. Check out the [documentation](@/blog/shortcodes/index.md#show-source-or-path) for examples and usage.
+
+### Force Code Blocks LTR
+
+| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
+|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
+| ✅ | ✅ | ✅ | ✅ | ❌ |
+
+By default, code blocks are rendered left-to-right, regardless of the overall text direction. Set `force_codeblock_ltr = false` to allow code blocks to follow the document's text direction. Useful for RTL languages needing RTL code blocks.
### KaTeX Support
@@ -546,17 +732,29 @@ Setting `add_src_to_code_block = true` enables the use of the [`add_src_to_code_
KaTeX is a fast, easy-to-use JavaScript library for TeX math rendering on the web. You can enable it with `katex = true`. See what it looks like in tabi [here](/blog/markdown/#katex).
+### Mermaid Support
+
+| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
+|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
+| ✅ | ✅ | ✅ | ✅ | ✅ |
+
+[Mermaid](https://github.com/mermaid-js/mermaid) is a JavaScript-based diagramming and charting tool. You can enable it with `mermaid = true`.
+
+By default, the Mermaid library is served locally. If you prefer to use a CDN, set `serve_local_mermaid = false` in `config.toml`. Using a CDN will serve the latest version of Mermaid; the local option will serve the version bundled with tabi.
+
+See the [Mermaid documentation](@/blog/shortcodes/index.md#mermaid-diagrams) for usage instructions and examples.
+
### Custom Font Subset
| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
| ❌ | ❌ | ✅ | ❌ | ❌ |
-Custom fonts cause flashing text in Firefox. To amend this, tabi loads a subset of glyphs for the header. Since this (slightly) increases the initial load time, it's a good idea to try and minimise the size of this subset.
+Custom fonts cause flashing text in Firefox. To amend this, tabi loads a subset of glyphs for the header. Since this (slightly) increases the initial load time, it's a good idea to try and minimise the size of this subset, or disable it completely if you're not using a custom font in your skin.
-You can create a custom subset tailored to your site, save it as `static/custom_subset.css`, and have it load with `custom_subset = true`.
+You can create a custom subset tailored to your site, save it as `static/custom_subset.css`, and have it load with `custom_subset = true`. Disabling the subset can be done with `enable_subset = false`.
-For more information, including instructions on how to create a custom subset, see the [docs](/blog/custom-font-subset/).
+For more information, including instructions on how to create a custom subset, see the [docs](@/blog/custom-font-subset/index.md).
### Full Content in Feed
@@ -572,7 +770,10 @@ By default, the Atom feed only contains the summary/description of your posts. Y
|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
| ✅ | ✅ | ✅ | ✅ | ❌ |
-You can hide specific pages or entire sections from your feed by setting `hide_from_feed = true`.
+You can control how content appears in your feeds using two settings:
+
+1. `hide_from_feed = true`: Hides content from all feeds (main, section, and tag feeds)
+2. `hide_from_main_feed = true`: Hides content only from the main feed while keeping it visible in section and tag feeds
### Comments {#adding-comments}
@@ -586,7 +787,38 @@ To enable a system globally (on all pages), set `enabled_for_all_posts = true` i
If you have enabled a system globally, but want to disable it on a specific page, set the name of the system to `false` in the front matter of that page. For example, `utterances = false`.
-Read [the docs](/blog/comments/) for more information on the available systems and their setup.
+Read [the docs](@/blog/comments/index.md) for more information on the available systems and their setup.
+
+### iine Like Buttons {#iine}
+
+| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
+|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
+| ✅ | ✅ | ✅ | ✅ | ❌ |
+
+tabi supports [iine](https://iine.to/) like buttons for anonymous appreciation of your content. These privacy-focused buttons work without JavaScript and don't track users.
+
+To enable iine buttons globally:
+
+```toml
+[extra]
+iine = true
+```
+
+You can customise the icon used for the buttons (follows the hierarchy):
+
+```toml
+[extra]
+iine_icon = "thumbs_up" # Options: "heart", "thumbs_up", "upvote", or any emoji
+```
+
+For multilingual sites, you can unify like counts across language versions of the same content (config-only setting; true by default):
+
+```toml
+[extra]
+iine_unified_languages = true # Likes on /es/blog/hello/ count towards /blog/hello/
+```
+
+You can also enable iine buttons on individual pages or sections by setting `iine = true` in their front matter, or override the icon with `iine_icon = "🚀"`.
### Analytics
@@ -601,7 +833,7 @@ You can set them up in the `[extra.analytics]` section of your `config.toml`.
- `service`: Specifies which analytics service to use. Supported options are `"goatcounter"`, `"umami"`, and `"plausible"`.
- `id`: The unique identifier for your analytics service. This varies based on the service:
- - For GoatCounter, it's the code chosen during signup. Self-hosted instances don't require this field.
+ - For GoatCounter, it's the code chosen during signup. Self-hosted instances of GoatCounter don't require this field.
- For Umami, it's the website ID.
- For Plausible, it's the domain name.
@@ -610,6 +842,8 @@ You can set them up in the `[extra.analytics]` section of your `config.toml`.
- For Umami: `"https://umami.example.com"`
- For Plausible: `"https://plausible.example.com"`
+- `do_not_track`: (Umami only) Optional. When set to `true`, the generated tracking script will include the `data-do-not-track="true"` attribute, which disables tracking for users whose browsers send a "Do Not Track" header.
+
An example configuration for non-self-hosted GoatCounter would look like this:
```toml
@@ -651,6 +885,8 @@ To use a custom icon, you can add it to your site's `static/social_icons` direct
{ name = "custom", url = "https://example.com", icon = "custom" }
```
+{{ admonition(type="note", text="All social links include the `rel='me'` [attribute](https://developer.mozilla.org/docs/Web/HTML/Attributes/rel/me). This helps search engines and web services verify that the social media accounts are owned by you.") }}
+
### Feed Icon
| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
@@ -747,12 +983,25 @@ By default, the date is shown below the post title. You can hide it with `show_d
|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
| ❌ | ❌ | ✅ | ❌ | ❌ |
-tabi has two date formats: `long_date_format` and `short_date_format`. The short format is used in a post's metadata, while the long format is used when listing posts (i.e. on the [blog section](/blog/) or the [main page](/)).
+tabi has three date formats: `long_date_format`, `short_date_format` and `archive_date_format`. The short format is used in a post's metadata, while the long format is used when listing posts (i.e. on the [blog section](@/blog/_index.md) or the [main page](@/_index.md)). The archive format is used to display day and month on the archive page.
-The default is "6th July 2049" for both formats in English. For other languages, the defaut is `"%d %B %Y"` for the long format and `"%-d %b %Y"` for the short format.
+The default is "6th July 2049" for `long_date_format` and `short_date_format` in English. For other languages, the defaut is `"%d %B %Y"` for the long format and `"%-d %b %Y"` for the short format. The universal default for the archive format is `"%d %b"`.
In Zola, time formatting syntax is inspired fom strftime. A full reference is available in the [chrono docs](https://docs.rs/chrono/0.4.31/chrono/format/strftime/index.html).
+#### Per-language date formats
+
+You can customise date formats for specific languages using the `date_formats` array in `config.toml`:
+
+```toml
+date_formats = [
+ { lang = "es", long = "%d de %B de %Y", short = "%-d %b %Y", archive = "%d de %b" },
+ { lang = "de", long = "%d. %B %Y", short = "%d.%m.%Y", archive = "%d. %b" },
+]
+```
+
+This allows different languages to use culturally appropriate date formatting (e.g. Spanish "3 de febrero de 2024" vs German "3. Februar 2024").
+
### Custom Separator
| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
@@ -811,7 +1060,67 @@ allowed_domains = [
This feature is enabled by default. To disable it (and allow all connections), set `enable_csp = false` on a page, section or globally. The `enable_csp` setting follows the [hierarchy](#settings-hierarchy).
-See the [CSP documentation page](/blog/security/) for more information.
+See the [CSP documentation page](@/blog/security/index.md) for more information.
+
+---
+
+## Indieweb
+
+### Webmentions
+
+| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
+|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
+| ❓ | ❓ | ✅ | ❓ | ✅ |
+
+As described by the recommended W3C standard [Webmention](https://www.w3.org/TR/webmention/#abstract-p-1) is a simple way to notify any URL when you mention it on your site. From the receiver's perspective, it's a way to request notifications when other sites mention it.
+
+For static sites [webmention.io](https://webmention.io/) hosts a webmention endpoint that can be used to receive webmentions. This feature fetches the webmentions stored at webmention.io and displays them for a page. You will need to have setup an account for your website at webmention.io. When you enable the webmention feature it will advertise your webmention.io endpoint and display the webmentions for all posts.
+
+Enable webmentions for your site by adding the following to your `config.toml` file.
+
+```toml
+[extra.webmentions]
+enable = true
+# Specify the domain registered with webmention.io.
+domain = "www.example.com"
+```
+
+❓: To disable webmentions for a specific section or page, set `webmentions = false` in the `[extra]` section of that section or page's front matter.
+
+The webmentions section looks like this:
+
+{{ dual_theme_image(light_src="blog/mastering-tabi-settings/img/webmention_light.webp", dark_src="blog/mastering-tabi-settings/img/webmention_dark.webp" alt="Webmentions screenshot showing reposts, likes, bookmarks, and comments", full_width=true) }}
+
+### Representative h-card
+
+| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
+| :--: | :-----: | :-----------: | :---------------: | :-----------------: |
+| ❌ | ❌ | ✅ | ❌ | ❌ |
+
+By default, tabi adds a **hidden** representative [h-card](https://microformats.org/wiki/h-card) to the homepage. While invisible to visitors, it's available to microformat parsers. You can check the validity of the card with the [Indiewebify.me](https://indiewebify.me/validate-h-card/) tool.
+
+To disable the h-card, set `enable = false` in the `[extra.hcard]` section of `config.toml`.
+
+The default h-card includes your name, website url and social media links.
+
+You can set a profile picture and a small bio with the `avatar` and `biography` settings.
+
+All other [h-card properties](https://microformats.org/wiki/h-card#Properties) can be added by listing them under the `[extra.hcard]`section of the config file. Simply replace all `-` characters by `_`.
+
+---
+
+## Extending HTML Elements in tabi
+
+Some HTML elements in tabi can be extended to support additional use cases such as adding custom JavaScript for site-wide behavior at the end of the `` tag or including additional content at the end of the `` element that is not otherwise supported by other tabi settings.
+
+See the table below for elements that can be extended:
+
+| Element | Template |
+| :------: | :-------------------------------: |
+| `` | `templates/tabi/extend_head.html` |
+| `` | `templates/tabi/extend_body.html` |
+
+There are no explicit settings to configure for your site or pages. Simply create the relevant template file for your site, and tabi will automatically include it.
---
diff --git a/content/blog/security/index.ca.md b/content/blog/security/index.ca.md
index 1b8bffe..6d3ebfe 100644
--- a/content/blog/security/index.ca.md
+++ b/content/blog/security/index.ca.md
@@ -1,7 +1,7 @@
+++
title = "Seguretat per defecte"
date = 2023-02-22
-updated = 2024-05-30
+updated = 2025-02-21
description = "tabi té una Política de Seguretat de Contingut (CSP) fàcilment personalitzable amb valors segurs per defecte. Obtingues tranquil·litat i un A+ en l'Observatori de Mozilla."
[taxonomies]
@@ -34,11 +34,13 @@ Pots desactivar les capçaleres (permitint-ho tot) en una pàgina, secció, o gl
**Notas**:
-- [Habilitar els comentaris](@/blog/comments/index.ca.md) o [les analítiques](@/blog/mastering-tabi-settings/index.ca.md#analisi-web) automàticament permet scripts/frames/estils/connexions en funció del servei habilitat.
+- [Habilitar els comentaris](@/blog/comments/index.ca.md), [les analítiques](@/blog/mastering-tabi-settings/index.ca.md#analisi-web), o [els diagrames de mermaid](@/blog/shortcodes/index.ca.md#diagrames-de-mermaid) permet automàticament els scripts/frames/estils/conexions pertinents.
- Per utilitzar un [tema de resaltat de sintaxis integrat a Zola](https://www.getzola.org/documentation/getting-started/configuration/#syntax-highlighting), has de permetre `unsafe-inline` a la directiva `style-src`:
```
{ directive = "style-src", domains = ["'self'", "'unsafe-inline'"] },
```
+---
+
[^1]: Requereix una configuració adequada del servidor web (p. ex., redirigir el trànsit HTTP a HTTPS).
diff --git a/content/blog/security/index.es.md b/content/blog/security/index.es.md
index ec46cdb..0a6f663 100644
--- a/content/blog/security/index.es.md
+++ b/content/blog/security/index.es.md
@@ -1,7 +1,7 @@
+++
title = "Seguro por defecto"
date = 2023-02-22
-updated = 2024-05-30
+updated = 2025-02-21
description = "tabi tiene una Política de Seguridad de Contenido (CSP) fácilmente personalizable con configuraciones seguras. Obtén tranquilidad y una calificación de A+ en Mozilla Observatory."
[taxonomies]
@@ -34,11 +34,13 @@ Puedes desactivar las cabeceras (permitiendo todo) en una página, sección, o g
**Notas**:
-- [Habilitar los comentarios](@/blog/comments/index.es.md) o [las analíticas](@/blog/mastering-tabi-settings/index.es.md#analisis-web) automáticamente permite scripts/frames/estilos/conexiones en función del servicio habilitado.
+- [Habilitar los comentarios](@/blog/comments/index.es.md), [las analíticas](@/blog/mastering-tabi-settings/index.es.md#analisis-web), o [los diagramas mermaid](@/blog/shortcodes/index.es.md#diagramas-de-mermaid) permite automáticamente los scripts/frames/estilos/conexiones pertinentes.
- Para usar un [tema de resaltado de sintaxis integrado en Zola](https://www.getzola.org/documentation/getting-started/configuration/#syntax-highlighting), has de permitir `unsafe-inline` en la directiva `style-src`:
```
{ directive = "style-src", domains = ["'self'", "'unsafe-inline'"] },
```
+---
+
[^1]: Requiere una configuración adecuada del servidor web (por ejemplo, redirigir el tráfico HTTP a HTTPS).
diff --git a/content/blog/security/index.md b/content/blog/security/index.md
index a1c99cb..7765287 100644
--- a/content/blog/security/index.md
+++ b/content/blog/security/index.md
@@ -1,7 +1,7 @@
+++
title = "Secure by default"
date = 2023-02-22
-updated = 2024-05-30
+updated = 2025-02-21
description = "tabi has an easily customizable Content Security Policy (CSP) with safe defaults. Get peace of mind and an A+ on Mozilla Observatory."
[taxonomies]
@@ -34,11 +34,13 @@ You can disable the CSP (allowing all connections) on a page, section, or global
**Notes**:
-- [Enabling comments](@/blog/comments/index.md) or [analytics](@/blog/mastering-tabi-settings/index.md#analytics) automatically allows scripts/frames/styles/connections as needed from the respective services.
+- [Enabling comments](@/blog/comments/index.md), [analytics](@/blog/mastering-tabi-settings/index.md#analytics), or [mermaid diagrams](@/blog/shortcodes/index.md#mermaid-diagrams) automatically allows scripts/frames/styles/connections as needed.
- To use a [Zola built-in syntax highlighting theme](https://www.getzola.org/documentation/getting-started/configuration/#syntax-highlighting), you need to allow `unsafe-inline` in the `style-src` directive:
```
{ directive = "style-src", domains = ["'self'", "'unsafe-inline'"] },
```
+---
+
[^1]: Requires proper webserver configuration (e.g. redirecting HTTP traffic to HTTPS).
diff --git a/content/blog/series/img/jump_to_series_posts_dark.webp b/content/blog/series/img/jump_to_series_posts_dark.webp
new file mode 100644
index 0000000..d88a292
Binary files /dev/null and b/content/blog/series/img/jump_to_series_posts_dark.webp differ
diff --git a/content/blog/series/img/jump_to_series_posts_light.webp b/content/blog/series/img/jump_to_series_posts_light.webp
new file mode 100644
index 0000000..22f5e78
Binary files /dev/null and b/content/blog/series/img/jump_to_series_posts_light.webp differ
diff --git a/content/blog/series/img/series_dark.webp b/content/blog/series/img/series_dark.webp
new file mode 100644
index 0000000..89223d0
Binary files /dev/null and b/content/blog/series/img/series_dark.webp differ
diff --git a/content/blog/series/img/series_light.webp b/content/blog/series/img/series_light.webp
new file mode 100644
index 0000000..780e2f2
Binary files /dev/null and b/content/blog/series/img/series_light.webp differ
diff --git a/content/blog/series/img/series_reversed_dark.webp b/content/blog/series/img/series_reversed_dark.webp
new file mode 100644
index 0000000..112a853
Binary files /dev/null and b/content/blog/series/img/series_reversed_dark.webp differ
diff --git a/content/blog/series/img/series_reversed_light.webp b/content/blog/series/img/series_reversed_light.webp
new file mode 100644
index 0000000..2a1dd0e
Binary files /dev/null and b/content/blog/series/img/series_reversed_light.webp differ
diff --git a/content/blog/series/index.ca.md b/content/blog/series/index.ca.md
new file mode 100644
index 0000000..adb3998
--- /dev/null
+++ b/content/blog/series/index.ca.md
@@ -0,0 +1,409 @@
++++
+title = "Guia completa sobre sèries"
+date = 2024-11-08
+updated = 2025-02-21
+description = "Aprèn a organitzar les teves publicacions en sèries seqüencials, perfectes per a tutorials, cursos i històries de diverses parts."
+
+[taxonomies]
+tags = ["funcionalitat", "tutorial", "preguntes freqüents", "sèries"]
+
+[extra]
+quick_navigation_buttons = true
+toc = true
+mermaid = true
+social_media_card = "social_cards/ca_blog_series.jpg"
++++
+
+Una sèrie organitza publicacions relacionades en ordre seqüencial, similar als capítols d'un llibre. A diferència de les etiquetes, que simplement agrupen contingut relacionat, les sèries suggereixen un ordre específic de lectura de principi a fi.
+
+Les publicacions dins d'una sèrie no necessiten publicar-se de forma consecutiva; la funció de sèries reuneix publicacions temàticament vinculades en una seqüència coherent.
+
+El següent diagrama il·lustra com les publicacions de la sèrie (3, 5 i 8) existeixen dins del flux principal del blog mentre mantenen la seva pròpia seqüència ordenada dins de Sèrie 1.
+
+{% mermaid(full_width=true) %}
+flowchart
+ subgraph main[BLOG]
+ P1[Post 1]
+ P2[P2]
+ P3[P3]
+ P4[P4]
+ P5[P5]
+ P6[P6]
+ P7[P7]
+ P8[P8]
+ P9[P9]
+ end
+ subgraph series1[SÈRIE 1]
+ PS1["Post Sèrie 1 (=P3)"]
+ PS2["Post Sèrie 2 (=P5)"]
+ PS3["Post Sèrie 3 (=P8)"]
+ end
+ P3 o-.-o PS1
+ P5 o-.-o PS2
+ P8 o-.-o PS3
+{% end %}
+
+## Inici ràpid
+
+1. Crea un directori per a la teva sèrie
+2. Crea `_index.md` al directori de la sèrie
+3. Configura el front matter de `_index.md`:
+
+ ```toml,name=series/_index.md
+ title = "Aprenent Rust"
+ template = "series.html"
+ sort_by = "slug"
+ transparent = true
+
+ [extra]
+ series = true
+ ```
+
+4. Crea els teus articles de la sèrie en aquest directori
+
+Vols saber-ne més? Continua llegint!
+
+## Com funcionen les sèries?
+
+Una sèrie és simplement una secció que tabi gestiona de manera especial. Per a més detalls sobre seccions, consulta la [documentació de Zola](https://www.getzola.org/documentation/content/section/).
+
+Prenent l'exemple del diagrama anterior, l'estructura de directoris seria així:
+
+```txt
+content/
+ _index.md
+ blog/
+ _index.md
+ post1/
+ index.md
+ post2/
+ index.md
+ post4/
+ index.md
+ post6/
+ index.md
+ post7/
+ index.md
+ post9/
+ index.md
+ serie1/
+ _index.md
+ post3/
+ index.md
+ post5/
+ index.md
+ post8/
+ index.md
+```
+
+Per crear una sèrie, necessites:
+
+1. Utilitzar la plantilla `series.html`
+2. Establir `series = true` a la configuració `[extra]` de la secció
+3. Activar `transparent = true` per integrar les publicacions de la sèrie amb la secció del blog principal
+
+La pàgina principal de la sèrie mostra un resum seguit d'una llista de totes les publicacions a la sèrie:
+
+{{ dual_theme_image(light_src="blog/series/img/series_light.webp", dark_src="blog/series/img/series_dark.webp" alt="una sèrie", full_width=true) }}
+
+## Saltar a les publicacions
+
+Si el contingut d'una sèrie (el Markdown després del frontmatter a `_index.md`) supera els 2000 caràcters, apareix un enllaç "Salta a les publicacions" al costat del títol de la sèrie.
+
+{{ dual_theme_image(light_src="blog/series/img/jump_to_series_posts_light.webp", dark_src="blog/series/img/jump_to_series_posts_dark.webp" alt="enllaç per saltar a les publicacions de la sèrie", full_width=true) }}
+
+Per forçar l'activació o desactivació d'aquesta funció, configura `show_jump_to_posts` a la secció `[extra]` de la teva secció de sèries o a `config.toml`. Aquesta configuració segueix [la jerarquia](@/blog/mastering-tabi-settings/index.ca.md#jerarquia-de-configuracio).
+
+## Pàgines de sèries i ordre
+
+Totes les pàgines a la secció de sèries seran pàgines de sèrie. Les pàgines s'ordenaran segons el `sort_by` de la secció.
+
+Tot i que les sèries mantenen el seu propi ordre intern, romanen independents del flux cronològic de la secció principal (per exemple, `blog/`) gràcies a la configuració `transparent`.
+
+### Opcions d'ordre
+
+Tria entre aquests mètodes d'ordre, cadascun amb els seus avantatges:
+
+{% wide_container() %}
+
+`sort_by` | avantatges | desavantatges
+---------|------------|---------------
+`slug` | L'ordre de les pàgines és explícit a la ruta (per exemple, `example.com/blog/series1/01-series-post-un`). | Cada pàgina de la sèrie ha de tenir el prefix corresponent.
+`weight` | L'ordre de les pàgines és fàcil de configurar de forma transparent. La primera publicació té pes `1`, la segona pes `2` i així successivament. | Cada pàgina de la sèrie ha de tenir el seu pes configurat.
+`date` | L'ordre de les pàgines es pot configurar una sola vegada a la configuració de la secció. No cal fer res a cada pàgina. | L'ordre de les pàgines s'ha d'invertir perquè la primera pàgina sol ser la més antiga. Això només es pot aconseguir paginant la secció (`paginate_by = 9999`) i invertint el seu ordre (`paginate_reversed = true`).
+
+{% end %}
+
+{{ admonition(type="danger", title="Versió de Zola per ordenar per data", text="Per invertir correctament les dates, es requereix Zola v0.19.3+ (no publicada) perquè la informació de paginació estigui disponible a través de la funció `get_section`. En cas contrari, qualsevol cosa que depengui de l'ordre de les pàgines de la sèrie no serà correcta (per exemple, pàgina anterior/següent, llistes ordenades i no ordenades...) Vegeu [Zola PR #2653](https://github.com/getzola/zola/pull/2653).") }}
+
+### Indexació de pàgines
+
+Les pàgines en una sèrie s'indexen començant des d'1, seguint el seu ordre `sort_by`. Per invertir la indexació (fent que la primera pàgina tingui l'índex més alt), afegeix aquesta configuració a `_index.md` o `config.toml`:
+
+```toml
+[extra]
+post_listing_index_reversed = true # Per defecte és false si no es configura
+```
+
+{{ dual_theme_image(light_src="blog/series/img/series_reversed_light.webp", dark_src="blog/series/img/series_reversed_dark.webp" alt="una sèrie amb índexs invertits", full_width=true) }}
+
+Aquesta configuració segueix [la jerarquia](@/blog/mastering-tabi-settings/index.ca.md#jerarquia-de-configuracio).
+
+## Plantilles d'introducció i conclusió
+
+Els articles d'una sèrie poden tenir seccions automàtiques d'introducció i conclusió. Aquestes es configuren al `_index.md` de la teva sèrie. Un exemple bàsic:
+
+```toml,name=series/_index.md
+[extra.series_intro_templates]
+default = "Aquest article és part de la sèrie $SERIES_HTML_LINK."
+
+[extra.series_outro_templates]
+default = "Gràcies per llegir la part $SERIES_PAGE_INDEX de $SERIES_HTML_LINK!"
+```
+
+Les seccions d'introducció i conclusió tenen les seves pròpies classes CSS (`series-page-intro` i `series-page-outro`), que et permeten personalitzar la seva aparença mitjançant [CSS personalitzat](@/blog/mastering-tabi-settings/index.ca.md#estils-css-personalitzats).
+
+### Tipus de plantilles
+
+El sistema de sèries utilitza diferents plantilles segons la posició de l'article a la sèrie:
+
+- `next_only` - Utilitzat per al primer article (té article següent però no anterior)
+- `middle` - Utilitzat per a articles amb articles anterior i següent
+- `prev_only` - Utilitzat per a l'últim article (té article anterior però no següent)
+- `default` - Plantilla per defecte utilitzada quan no existeix una plantilla específica per a la posició
+
+El sistema determina automàticament quina plantilla utilitzar segons la posició de l'article. Les plantilles es defineixen a la configuració de la sèrie (`_index.md`), com `extra.series_intro_templates` i `extra.series_outro_templates`:
+
+```toml,name=series/_index.md
+[extra.series_intro_templates]
+next_only = "Benvingut a la part 1! Següent: $NEXT_HTML_LINK"
+middle = "Anterior: $PREV_HTML_LINK | Següent: $NEXT_HTML_LINK"
+prev_only = "El capítol final! Anteriorment: $PREV_HTML_LINK"
+default = "Part $SERIES_PAGE_INDEX de $SERIES_PAGES_NUMBER"
+```
+
+Totes les plantilles són opcionals. La selecció de plantilles segueix un sistema de prioritat:
+
+1. Si existeix una plantilla específica per a la posició (`next_only`, `middle`, o `prev_only`), s'utilitzarà aquesta
+2. Si no, s'utilitza la plantilla `default`
+3. Si no es defineix cap plantilla, no es mostrarà informació de la sèrie
+
+Mira l'[exemple de plantilla](#exemple-de-plantilla) per veure un exemple més elaborat.
+
+### Ubicació al contingut
+
+Per defecte:
+
+- Les introduccions de sèrie apareixen a l'inici del teu article
+- La conclusió apareix al final (abans de les notes al peu, si n'hi ha)
+
+Pots controlar exactament on apareixen utilitzant `` i `` al teu Markdown:
+
+```markdown
+Aquest paràgraf apareix abans de la introducció de la sèrie.
+
+
+
+Contingut principal de l'article.
+
+
+
+## Recursos d'aprenentatge
+
+Contingut addicional...
+
+[^1]: Les notes al peu sempre apareixeran al final.
+```
+
+## Variables
+
+Les plantilles de sèries utilitzen un sistema flexible de variables que et permet:
+
+1. Fer referència a informació de la sèrie (títol, enllaços)
+2. Afegir navegació entre articles
+3. Mostrar indicadors de progrés
+4. Incloure informació personalitzada utilitzant les teves pròpies variables
+
+Les variables són marcadors que comencen amb `$` i es reemplacen amb contingut real quan es construeix el teu lloc. Per exemple, `$SERIES_HTML_LINK` es converteix en un enllaç clicable a la pàgina índex de la teva sèrie.
+
+Hi ha tres tipus de variables:
+
+- [Variables bàsiques de sèrie](#variables-basiques-de-serie): Informació general sobre la sèrie
+- [Variables de navegació](#variables-de-navegacio): Enllaços a articles anterior/següent
+- [Variables personalitzades](#variables-personalitzades): Els teus propis marcadors per a informació addicional
+
+### Variables bàsiques de sèrie
+
+{% wide_container() %}
+
+| Variable | Disponibilitat | Retorna | Descripció | Exemple d'ús | Exemple de sortida |
+|----------|---------------|----------|------------|--------------|-------------------|
+| `$SERIES_TITLE` | Sempre | Text | Títol de la sèrie en text pla | `Part de $SERIES_TITLE` | Part d'Aprenent Rust |
+| `$SERIES_PERMALINK` | Sempre | Text | URL a l'índex de la sèrie | `[Veure totes les publicacions]($SERIES_PERMALINK)` | [Veure totes les publicacions](/series/learn-rust) |
+| `$SERIES_HTML_LINK` | Sempre | HTML | Enllaç llest per usar a la sèrie | `Benvingut a $SERIES_HTML_LINK!` | Benvingut a Aprenent Rust ! |
+| `$SERIES_PAGES_NUMBER` | Sempre | Nombre | Total d'articles a la sèrie | `Una sèrie de $SERIES_PAGES_NUMBER parts` | Una sèrie de 5 parts |
+| `$SERIES_PAGE_INDEX` | Sempre | Nombre | Posició de l'article actual | `Part $SERIES_PAGE_INDEX de $SERIES_PAGES_NUMBER` | Part 3 de 5 |
+| `$SERIES_PAGES_OLIST` | Sempre | HTML | Llista ordenada de tots els articles | `Articles a la sèrie: $SERIES_PAGES_OLIST` | Articles a la sèrie: Article actual Altres articles |
+| `$SERIES_PAGES_ULIST` | Sempre | HTML | Llista desordenada de tots els articles | `Articles a la sèrie: $SERIES_PAGES_ULIST` | Articles a la sèrie: |
+
+{% end %}
+
+{{ admonition(type="tip", title="CONSELL: Text personalitzat amb permalinks", text='Els enllaços markdown com `[text]($SERIES_PERMALINK)` seran marcats (i [estilitzats](@/blog/mastering-tabi-settings/index.ca.md#indicador-d-enllacos-externs)) com externs. Si necessites text personalitzat i vols evitar l\'estil extern, utilitza HTML: `el teu text `.') }}
+
+### Variables de navegació
+
+{% wide_container() %}
+
+| Variable | Disponibilitat | Retorna | Descripció | Exemple d'ús | Exemple de sortida |
+|----------|---------------|----------|------------|--------------|-------------------|
+| `$PREV_TITLE` | Existeix anterior | Text | Títol de l'article anterior | `Anteriorment: $PREV_TITLE` | Anteriorment: Configurant el teu entorn |
+| `$PREV_PERMALINK` | Existeix anterior | Text | URL a l'article anterior | `[← Enrere]($PREV_PERMALINK)` | [← Enrere](/series/learn-rust/setup) |
+| `$PREV_HTML_LINK` | Existeix anterior | HTML | Enllaç llest per usar a l'anterior | `Llegeix primer $PREV_HTML_LINK` | Llegeix primer Configurant el teu entorn |
+| `$PREV_DESCRIPTION` | Existeix anterior | Text | Descripció de l'article anterior | `Resum: $PREV_DESCRIPTION` | Resum: Configurant Rust |
+| `$NEXT_TITLE` | Existeix següent | Text | Títol del següent article | `Següent: $NEXT_TITLE` | Següent: Patrons avançats |
+| `$NEXT_PERMALINK` | Existeix següent | Text | URL al següent article | `[Continuar →]($NEXT_PERMALINK)` | [Continuar →](/series/learn-rust/patterns) |
+| `$NEXT_HTML_LINK` | Existeix següent | HTML | Enllaç llest per usar al següent | `Continua amb $NEXT_HTML_LINK` | Continua amb Patrons avançats |
+| `$NEXT_DESCRIPTION` | Existeix següent | Text | Descripció del següent article | `Properament: $NEXT_DESCRIPTION` | Properament: Aprèn sobre les característiques avançades de pattern matching en Rust |
+
+{% end %}
+
+### Referència al primer article
+
+{% wide_container() %}
+
+| Variable | Disponibilitat | Retorna | Descripció | Exemple d'ús | Exemple de sortida |
+|----------|---------------|----------|------------|--------------|-------------------|
+| `$FIRST_TITLE` | Sempre | Text | Títol del primer article | `Comença amb $FIRST_TITLE` | Comença amb Introducció a Rust |
+| `$FIRST_HTML_LINK` | Sempre | HTML | Enllaç llest per usar al primer article | `Comença a $FIRST_HTML_LINK` | Comença a Introducció a Rust |
+
+{% end %}
+
+### Exemple de plantilla
+
+{{ admonition(type="tip", title="Variables HTML vs text", text="Utilitza variables HTML (que acaben en `_HTML_LINK`) quan vulguis enllaços preparats per usar. Utilitza variables de text (que acaben en `_TITLE` o `_PERMALINK`) quan vulguis més control sobre el format.") }}
+
+```toml,name=series/_index.md
+# Introducció
+[extra.series_intro_templates]
+next_only = """
+Benvingut a $SERIES_HTML_LINK! Aquesta sèrie de $SERIES_PAGES_NUMBER parts t'ensenyarà Rust des de zero.
+
+Següent: $NEXT_HTML_LINK - $NEXT_DESCRIPTION
+"""
+
+middle = """
+📚 Part $SERIES_PAGE_INDEX de $SERIES_PAGES_NUMBER a $SERIES_HTML_LINK
+
+Anterior: $PREV_HTML_LINK
+Següent: $NEXT_HTML_LINK
+"""
+
+prev_only = """
+Benvingut a l'última part de $SERIES_HTML_LINK!
+Ets nou? Comença amb $FIRST_HTML_LINK per construir una base sòlida.
+
+Anterior: $PREV_HTML_LINK
+"""
+
+# Plantilla de respatller
+default = "Aquest article és part de la sèrie $SERIES_HTML_LINK."
+
+# Conclusió
+[extra.series_outro_templates]
+next_only = """
+Gràcies per llegir! 🙌
+
+Continua el teu viatge amb $NEXT_HTML_LINK, on $NEXT_DESCRIPTION
+O revisa l'esquema complet de la sèrie [$SERIES_TITLE]($SERIES_PERMALINK).
+"""
+
+middle = """
+---
+📝 Navegació de la sèrie
+
+- Anterior: $PREV_HTML_LINK
+- Següent: $NEXT_HTML_LINK
+- [Resum de la sèrie]($SERIES_PERMALINK)
+"""
+
+prev_only = """
+🎉 Felicitats! Has completat $SERIES_HTML_LINK.
+
+Vols repassar? Aquí vam començar: $FIRST_HTML_LINK
+O revisa el que acabem de veure a $PREV_HTML_LINK.
+"""
+
+# Respatller.
+default = """
+---
+Aquest article és la part $SERIES_PAGE_INDEX de $SERIES_PAGES_NUMBER a $SERIES_HTML_LINK.
+"""
+```
+
+### Variables personalitzades
+
+Les plantilles de sèries admeten variables personalitzades per incloure informació addicional a tota la teva sèrie. El procés té dos passos:
+
+1. Primer, defineix els teus **marcadors** a la configuració de la teva sèrie (`_index.md`):
+
+```toml,name=series/_index.md
+[extra]
+series = true
+series_template_placeholders = ["$POSITION", "$TOPIC", "$DIFFICULTY"]
+```
+
+2. Després, a cada article de la sèrie, proporciona els valors per a aquests marcadors a `series_template_variables`:
+
+```toml,name=series/article.md
+[extra.series_template_variables]
+position = "primer"
+topic = "Variables i tipus"
+difficulty = "Principiant"
+```
+
+### Ús de variables personalitzades
+
+Pots usar les teves variables personalitzades a qualsevol plantilla, juntament amb les variables integrades:
+
+```toml,name=series/_index.md
+[extra.series_intro_templates]
+default = """
+Aquest és l'article $POSITION a $SERIES_HTML_LINK.
+Tema d'avui: $TOPIC
+Nivell de dificultat: $DIFFICULTY
+"""
+```
+
+{{ admonition(type="warning", text="Encara que els marcadors es defineixen en majúscules (`$POSITION`), els noms de variables a `series_template_variables` han d'estar en minúscules (`position`).") }}
+
+### Exemple amb variables personalitzades
+
+```toml,name=series/_index.md
+# A la configuració de la sèrie.
+[extra]
+series = true
+series_template_placeholders = ["$LEARNING_TIME", "$KEY_CONCEPTS"]
+
+series_intro_templates.default = """
+📚 Part $SERIES_PAGE_INDEX de $SERIES_PAGES_NUMBER
+⏱️ Temps estimat: $LEARNING_TIME
+🔑 Conceptes clau: $KEY_CONCEPTS
+"""
+```
+
+```toml,name=series/02-learning-rust/index.md
+# En un article de la sèrie.
+[extra.series_template_variables]
+learning_time = "30 minuts"
+key_concepts = "Funcions, gestió d'errors, coincidència de patrons"
+```
+
+Això generarà:
+
+```txt
+📚 Part 2 de 5
+⏱️ Temps estimat: 30 minuts
+🔑 Conceptes clau: Funcions, gestió d'errors, coincidència de patrons
+```
+
+{{ admonition(type="warning", title="Variables que falten", text="Si uses un marcador a les teves plantilles però no proporciones el seu valor a `series_template_variables`, la compilació fallarà amb un error que llista les variables que falten.") }}
diff --git a/content/blog/series/index.es.md b/content/blog/series/index.es.md
new file mode 100644
index 0000000..9c6d673
--- /dev/null
+++ b/content/blog/series/index.es.md
@@ -0,0 +1,409 @@
++++
+title = "Guía completa sobre series"
+date = 2024-11-08
+updated = 2025-02-21
+description = "Aprende a organizar tus publicaciones en series secuenciales, perfectas para tutoriales, cursos e historias de varias partes."
+
+[taxonomies]
+tags = ["funcionalidad", "tutorial", "preguntas frecuentes", "series"]
+
+[extra]
+quick_navigation_buttons = true
+toc = true
+mermaid = true
+social_media_card = "social_cards/es_blog_series.jpg"
++++
+
+Una serie organiza publicaciones relacionadas en orden secuencial, similar a los capítulos de un libro. A diferencia de las etiquetas, que simplemente agrupan contenido relacionado, las series sugieren un orden específico de lectura de principio a fin.
+
+Las publicaciones dentro de una serie no necesitan publicarse de forma consecutiva; la función de series reúne publicaciones temáticamente vinculadas en una secuencia coherente.
+
+El siguiente diagrama ilustra cómo las publicaciones de la serie (3, 5 y 8) existen dentro del flujo principal del blog mientras mantienen su propia secuencia ordenada dentro de Serie 1.
+
+{% mermaid(full_width=true) %}
+flowchart
+ subgraph main[BLOG]
+ P1[Post 1]
+ P2[P2]
+ P3[P3]
+ P4[P4]
+ P5[P5]
+ P6[P6]
+ P7[P7]
+ P8[P8]
+ P9[P9]
+ end
+ subgraph series1[SERIE 1]
+ PS1["Post Serie 1 (=P3)"]
+ PS2["Post Serie 2 (=P5)"]
+ PS3["Post Serie 3 (=P8)"]
+ end
+ P3 o-.-o PS1
+ P5 o-.-o PS2
+ P8 o-.-o PS3
+{% end %}
+
+## Inicio rápido
+
+1. Crea un directorio para tu serie
+2. Crea `_index.md` en el directorio de la serie
+3. Configura el front matter de `_index.md`:
+
+ ```toml,name=series/_index.md
+ title = "Aprendiendo Rust"
+ template = "series.html"
+ sort_by = "slug"
+ transparent = true
+
+ [extra]
+ series = true
+ ```
+
+4. Crea tus artículos de la serie en este directorio
+
+¿Quieres saber más? ¡Sigue leyendo!
+
+## ¿Cómo funcionan las series?
+
+Una serie es simplemente una sección que tabi maneja de manera especial. Para más detalles sobre secciones, consulta la [documentación de Zola](https://www.getzola.org/documentation/content/section/).
+
+Tomando el ejemplo del diagrama anterior, la estructura de directorios sería así:
+
+```txt
+content/
+ _index.md
+ blog/
+ _index.md
+ post1/
+ index.md
+ post2/
+ index.md
+ post4/
+ index.md
+ post6/
+ index.md
+ post7/
+ index.md
+ post9/
+ index.md
+ serie1/
+ _index.md
+ post3/
+ index.md
+ post5/
+ index.md
+ post8/
+ index.md
+```
+
+Para crear una serie, necesitas:
+
+1. Usar la plantilla `series.html`
+2. Establecer `series = true` en la configuración `[extra]` de la sección
+3. Activar `transparent = true` para integrar las publicaciones de la serie con la sección del blog principal
+
+La página principal de la serie muestra un resumen seguido de una lista de todas las publicaciones en la serie:
+
+{{ dual_theme_image(light_src="blog/series/img/series_light.webp", dark_src="blog/series/img/series_dark.webp" alt="una serie", full_width=true) }}
+
+## Saltar a las publicaciones
+
+Si el contenido de una serie (el Markdown después del frontmatter en `_index.md`) supera los 2000 caracteres, aparece un enlace "Saltar a publicaciones" junto al título de la serie.
+
+{{ dual_theme_image(light_src="blog/series/img/jump_to_series_posts_light.webp", dark_src="blog/series/img/jump_to_series_posts_dark.webp" alt="enlace para saltar a las publicaciones de la serie", full_width=true) }}
+
+Para forzar la activación o desactivación de esta función, configura `show_jump_to_posts` en la sección `[extra]` de tu sección de series o en `config.toml`. Esta configuración sigue [la jerarquía](@/blog/mastering-tabi-settings/index.es.md#jerarquia-de-configuracion).
+
+## Páginas de series y orden
+
+Todas las páginas en la sección de series serán páginas de serie. Las páginas se ordenarán según el `sort_by` de la sección.
+
+Aunque las series mantienen su propio orden interno, permanecen independientes del flujo cronológico de la sección principal (por ejemplo, `blog/`) gracias a la configuración `transparent`.
+
+### Opciones de orden
+
+Elige entre estos métodos de orden, cada uno con sus ventajas:
+
+{% wide_container() %}
+
+`sort_by` | ventajas | desventajas
+---------|-------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+`slug` | El orden de las páginas es explícito en la ruta (por ejemplo, `example.com/blog/series1/01-series-post-uno`). | Cada página de la serie debe tener el prefijo correspondiente.
+`weight` | El orden de las páginas es fácil de configurar de forma transparente. La primera publicación tiene peso `1`, la segunda peso `2` y así sucesivamente. | Cada página de la serie debe tener su peso configurado.
+`date` | El orden de las páginas se puede configurar una sola vez en la configuración de la sección. No hay que hacer nada en cada página. | El orden de las páginas debe invertirse porque la primera página suele ser la más antigua. Esto solo se puede lograr paginando la sección (`paginate_by = 9999`) e invirtiendo su orden (`paginate_reversed = true`).
+
+{% end %}
+
+{{ admonition(type="danger", title="Versión de Zola para ordenar por fecha", text="Para invertir correctamente las fechas, se requiere Zola v0.19.3+ (no publicada) para que la información de paginación esté disponible a través de la función `get_section`. De lo contrario, cualquier cosa que dependa del orden de las páginas de la serie no será correcta (por ejemplo, página anterior/siguiente, listas ordenadas y no ordenadas...) Ver [Zola PR #2653](https://github.com/getzola/zola/pull/2653).") }}
+
+### Indexación de páginas
+
+Las páginas en una serie se indexan empezando desde 1, siguiendo su orden `sort_by`. Para invertir la indexación (haciendo que la primera página tenga el índice más alto), añade esta configuración a `_index.md` o `config.toml`:
+
+```toml
+[extra]
+post_listing_index_reversed = true # Por defecto es false si no se configura
+```
+
+{{ dual_theme_image(light_src="blog/series/img/series_reversed_light.webp", dark_src="blog/series/img/series_reversed_dark.webp" alt="una serie con índices invertidos", full_width=true) }}
+
+Esta configuración sigue [la jerarquía](@/blog/mastering-tabi-settings/index.es.md#jerarquia-de-configuracion).
+
+## Plantillas de introducción y conclusión
+
+Los artículos de una serie pueden tener secciones automáticas de introducción y conclusión. Estas se configuran en el `_index.md` de tu serie. Un ejemplo básico:
+
+```toml,name=series/_index.md
+[extra.series_intro_templates]
+default = "Este artículo es parte de la serie $SERIES_HTML_LINK."
+
+[extra.series_outro_templates]
+default = "¡Gracias por leer la parte $SERIES_PAGE_INDEX de $SERIES_HTML_LINK!"
+```
+
+Las secciones de introducción y conclusión tienen sus propias clases CSS (`series-page-intro` y `series-page-outro`), lo que te permite personalizar su apariencia mediante [CSS personalizado](@/blog/mastering-tabi-settings/index.es.md#estilos-css-personalizados).
+
+### Tipos de plantillas
+
+El sistema de series usa diferentes plantillas según la posición del artículo en la serie:
+
+- `next_only` - Usado para el primer artículo (tiene artículo siguiente pero no anterior)
+- `middle` - Usado para artículos con artículos anterior y siguiente
+- `prev_only` - Usado para el último artículo (tiene artículo anterior pero no siguiente)
+- `default` - Plantilla por defecto usada cuando no existe una plantilla específica para la posición
+
+El sistema determina automáticamente qué plantilla usar según la posición del artículo. Las plantillas se definen en la configuración de la serie (`_index.md`), como `extra.series_intro_templates` y `extra.series_outro_templates`:
+
+```toml,name=series/_index.md
+[extra.series_intro_templates]
+next_only = "¡Bienvenido a la parte 1! Siguiente: $NEXT_HTML_LINK"
+middle = "Anterior: $PREV_HTML_LINK | Siguiente: $NEXT_HTML_LINK"
+prev_only = "¡El capítulo final! Anteriormente: $PREV_HTML_LINK"
+default = "Parte $SERIES_PAGE_INDEX de $SERIES_PAGES_NUMBER"
+```
+
+Todas las plantillas son opcionales. La selección de plantillas sigue un sistema de prioridad:
+
+1. Si existe una plantilla específica para la posición (`next_only`, `middle`, o `prev_only`), se usará esa
+2. Si no, se usa la plantilla `default`
+3. Si no se define ninguna plantilla, no se mostrará información de la serie
+
+Mira el [ejemplo de plantilla](#ejemplo-de-plantilla) para ver un ejemplo más elaborado.
+
+### Ubicación en el contenido
+
+Por defecto:
+
+- Las introducciones de serie aparecen al inicio de tu artículo
+- La conclusión aparece al final (antes de las notas al pie, si las hay)
+
+Puedes controlar exactamente dónde aparecen usando `` y `` en tu Markdown:
+
+```markdown
+Este párrafo aparece antes de la introducción de la serie.
+
+
+
+Contenido principal del artículo.
+
+
+
+## Recursos de aprendizaje
+
+Contenido adicional...
+
+[^1]: Las notas al pie siempre aparecerán al final.
+```
+
+## Variables
+
+Las plantillas de series usan un sistema flexible de variables que te permite:
+
+1. Hacer referencia a información de la serie (título, enlaces)
+2. Añadir navegación entre artículos
+3. Mostrar indicadores de progreso
+4. Incluir información personalizada usando tus propias variables
+
+Las variables son marcadores que comienzan con `$` y se reemplazan con contenido real cuando se construye tu sitio. Por ejemplo, `$SERIES_HTML_LINK` se convierte en un enlace clicable a la página índice de tu serie.
+
+Hay tres tipos de variables:
+
+- [Variables básicas de serie](#variables-basicas-de-serie): Información general sobre la serie
+- [Variables de navegación](#variables-de-navegacion): Enlaces a artículos anterior/siguiente
+- [Variables personalizadas](#variables-personalizadas): Tus propios marcadores para información adicional
+
+### Variables básicas de serie
+
+{% wide_container() %}
+
+| Variable | Disponibilidad | Devuelve | Descripción | Ejemplo de uso | Ejemplo de salida |
+|----------|---------------|-----------|-------------|----------------|-------------------|
+| `$SERIES_TITLE` | Siempre | Texto | Título de la serie en texto plano | `Parte de $SERIES_TITLE` | Parte de Aprendiendo Rust |
+| `$SERIES_PERMALINK` | Siempre | Texto | URL al índice de la serie | `[Ver todas las publicaciones]($SERIES_PERMALINK)` | [Ver todas las publicaciones](/series/learn-rust) |
+| `$SERIES_HTML_LINK` | Siempre | HTML | Enlace listo para usar a la serie | `¡Bienvenido a $SERIES_HTML_LINK!` | ¡Bienvenido a Aprendiendo Rust ! |
+| `$SERIES_PAGES_NUMBER` | Siempre | Número | Total de artículos en la serie | `Una serie de $SERIES_PAGES_NUMBER partes` | Una serie de 5 partes |
+| `$SERIES_PAGE_INDEX` | Siempre | Número | Posición del artículo actual | `Parte $SERIES_PAGE_INDEX de $SERIES_PAGES_NUMBER` | Parte 3 de 5 |
+| `$SERIES_PAGES_OLIST` | Siempre | HTML | Lista ordenada de todos los artículos | `Artículos en la serie: $SERIES_PAGES_OLIST` | Artículos en la serie: Artículo actual Otros artículos |
+| `$SERIES_PAGES_ULIST` | Siempre | HTML | Lista desordenada de todos los artículos | `Artículos en la serie: $SERIES_PAGES_ULIST` | Artículos en la serie: |
+
+{% end %}
+
+{{ admonition(type="tip", title="CONSEJO: Texto personalizado con permalinks", text='Los enlaces markdown como `[texto]($SERIES_PERMALINK)` serán marcados (y [estilizados](@/blog/mastering-tabi-settings/index.es.md#indicador-enlaces-externos)) como externos. Si necesitas texto personalizado y quieres evitar el estilo externo, usa HTML: `tu texto `.') }}
+
+### Variables de navegación
+
+{% wide_container() %}
+
+| Variable | Disponibilidad | Devuelve | Descripción | Ejemplo de uso | Ejemplo de salida |
+|----------|---------------|-----------|-------------|----------------|-------------------|
+| `$PREV_TITLE` | Existe anterior | Texto | Título del artículo anterior | `Anteriormente: $PREV_TITLE` | Anteriormente: Configurando tu entorno |
+| `$PREV_PERMALINK` | Existe anterior | Texto | URL al artículo anterior | `[← Atrás]($PREV_PERMALINK)` | [← Atrás](/series/learn-rust/setup) |
+| `$PREV_HTML_LINK` | Existe anterior | HTML | Enlace listo para usar al anterior | `Lee primero $PREV_HTML_LINK` | Lee primero Configurando tu entorno |
+| `$PREV_DESCRIPTION` | Existe anterior | Texto | Descripción del artículo anterior | `Resumen: $PREV_DESCRIPTION` | Resumen: Configurando Rust |
+| `$NEXT_TITLE` | Existe siguiente | Texto | Título del siguiente artículo | `Siguiente: $NEXT_TITLE` | Siguiente: Patrones avanzados |
+| `$NEXT_PERMALINK` | Existe siguiente | Texto | URL al siguiente artículo | `[Continuar →]($NEXT_PERMALINK)` | [Continuar →](/series/learn-rust/patterns) |
+| `$NEXT_HTML_LINK` | Existe siguiente | HTML | Enlace listo para usar al siguiente | `Continúa con $NEXT_HTML_LINK` | Continúa con Patrones avanzados |
+| `$NEXT_DESCRIPTION` | Existe siguiente | Texto | Descripción del siguiente artículo | `Próximamente: $NEXT_DESCRIPTION` | Próximamente: Aprende sobre las características avanzadas de pattern matching en Rust |
+
+{% end %}
+
+### Referencia al primer artículo
+
+{% wide_container() %}
+
+| Variable | Disponibilidad | Devuelve | Descripción | Ejemplo de uso | Ejemplo de salida |
+|----------|---------------|-----------|-------------|----------------|-------------------|
+| `$FIRST_TITLE` | Siempre | Texto | Título del primer artículo | `Comienza con $FIRST_TITLE` | Comienza con Introducción a Rust |
+| `$FIRST_HTML_LINK` | Siempre | HTML | Enlace listo para usar al primer artículo | `Empieza en $FIRST_HTML_LINK` | Empieza en Introducción a Rust |
+
+{% end %}
+
+### Ejemplo de plantilla
+
+{{ admonition(type="tip", title="Variables HTML vs texto", text="Usa variables HTML (que terminan en `_HTML_LINK`) cuando quieras enlaces listos para usar. Usa variables de texto (que terminan en `_TITLE` o `_PERMALINK`) cuando quieras más control sobre el formato.") }}
+
+```toml,name=series/_index.md
+# Introducción.
+[extra.series_intro_templates]
+next_only = """
+¡Bienvenido a $SERIES_HTML_LINK! Esta serie de $SERIES_PAGES_NUMBER partes te enseñará Rust desde cero.
+
+Siguiente: $NEXT_HTML_LINK - $NEXT_DESCRIPTION
+"""
+
+middle = """
+📚 Parte $SERIES_PAGE_INDEX de $SERIES_PAGES_NUMBER en $SERIES_HTML_LINK
+
+Anterior: $PREV_HTML_LINK
+Siguiente: $NEXT_HTML_LINK
+"""
+
+prev_only = """
+¡Bienvenido a la última parte de $SERIES_HTML_LINK!
+¿Eres nuevo? Comienza con $FIRST_HTML_LINK para construir una base sólida.
+
+Anterior: $PREV_HTML_LINK
+"""
+
+# Plantilla de respaldo.
+default = "Este artículo es parte de la serie $SERIES_HTML_LINK."
+
+# Conclusión.
+[extra.series_outro_templates]
+next_only = """
+¡Gracias por leer! 🙌
+
+Continúa tu viaje con $NEXT_HTML_LINK, donde $NEXT_DESCRIPTION
+O revisa el esquema completo de la serie [$SERIES_TITLE]($SERIES_PERMALINK).
+"""
+
+middle = """
+---
+📝 Navegación de la serie
+
+- Anterior: $PREV_HTML_LINK
+- Siguiente: $NEXT_HTML_LINK
+- [Resumen de la serie]($SERIES_PERMALINK)
+"""
+
+prev_only = """
+🎉 ¡Felicidades! Has completado $SERIES_HTML_LINK.
+
+¿Quieres repasar? Aquí comenzamos: $FIRST_HTML_LINK
+O revisa lo que acabamos de ver en $PREV_HTML_LINK.
+"""
+
+# Respaldo.
+default = """
+---
+Este artículo es la parte $SERIES_PAGE_INDEX de $SERIES_PAGES_NUMBER en $SERIES_HTML_LINK.
+"""
+```
+
+### Variables personalizadas
+
+Las plantillas de series admiten variables personalizadas para incluir información adicional en toda tu serie. El proceso tiene dos pasos:
+
+1. Primero, define tus **marcadores** en la configuración de tu serie (`_index.md`):
+
+```toml,name=series/_index.md
+[extra]
+series = true
+series_template_placeholders = ["$POSITION", "$TOPIC", "$DIFFICULTY"]
+```
+
+2. Luego, en cada artículo de la serie, proporciona los valores para estos marcadores en `series_template_variables`:
+
+```toml,name=series/article.md
+[extra.series_template_variables]
+position = "primero"
+topic = "Variables y tipos"
+difficulty = "Principiante"
+```
+
+### Uso de variables personalizadas
+
+Puedes usar tus variables personalizadas en cualquier plantilla, junto con las variables integradas:
+
+```toml,name=series/_index.md
+[extra.series_intro_templates]
+default = """
+Este es el artículo $POSITION en $SERIES_HTML_LINK.
+Tema de hoy: $TOPIC
+Nivel de dificultad: $DIFFICULTY
+"""
+```
+
+{{ admonition(type="warning", text="Aunque los marcadores se definen en mayúsculas (`$POSITION`), los nombres de variables en `series_template_variables` deben estar en minúsculas (`position`).") }}
+
+### Ejemplo con variables personalizadas
+
+```toml,name=series/_index.md
+# En la configuración de la serie.
+[extra]
+series = true
+series_template_placeholders = ["$LEARNING_TIME", "$KEY_CONCEPTS"]
+
+series_intro_templates.default = """
+📚 Parte $SERIES_PAGE_INDEX de $SERIES_PAGES_NUMBER
+⏱️ Tiempo estimado: $LEARNING_TIME
+🔑 Conceptos clave: $KEY_CONCEPTS
+"""
+```
+
+```toml,name=series/02-learning-rust/index.md
+# En un artículo de la serie.
+[extra.series_template_variables]
+learning_time = "30 minutos"
+key_concepts = "Funciones, manejo de errores, coincidencia de patrones"
+```
+
+Esto generará:
+
+```txt
+📚 Parte 2 de 5
+⏱️ Tiempo estimado: 30 minutos
+🔑 Conceptos clave: Funciones, manejo de errores, coincidencia de patrones
+```
+
+{{ admonition(type="warning", title="Variables faltantes", text="Si usas un marcador en tus plantillas pero no proporcionas su valor en `series_template_variables`, la compilación fallará con un error que lista las variables faltantes.") }}
diff --git a/content/blog/series/index.md b/content/blog/series/index.md
new file mode 100644
index 0000000..b17ce42
--- /dev/null
+++ b/content/blog/series/index.md
@@ -0,0 +1,409 @@
++++
+title = "A Complete Guide to Series"
+date = 2024-11-08
+updated = 2025-02-21
+description = "Learn how to organize your posts into sequential series, perfect for tutorials, courses, and multi-part stories."
+
+[taxonomies]
+tags = ["showcase", "tutorial", "FAQ", "series"]
+
+[extra]
+quick_navigation_buttons = true
+toc = true
+mermaid = true
+social_media_card = "social_cards/es_blog_series.jpg"
++++
+
+A series organizes related posts in a sequential order, similar to chapters in a book. Unlike tags, which simply group related content, series suggest a specific reading order from start to finish.
+
+Posts within a series do not need to be published consecutively; the series feature brings together thematically linked posts in a coherent sequence.
+
+The diagram below illustrates how series posts (3, 5, and 8) exist within the main blog flow while maintaining their own ordered sequence within Series 1.
+
+{% mermaid(full_width=true) %}
+flowchart
+ subgraph main[BLOG]
+ P1[Post 1]
+ P2[P2]
+ P3[P3]
+ P4[P4]
+ P5[P5]
+ P6[P6]
+ P7[P7]
+ P8[P8]
+ P9[P9]
+ end
+ subgraph series1[SERIES 1]
+ PS1["Series Post 1 (=P3)"]
+ PS2["Series Post 2 (=P5)"]
+ PS3["Series Post 3 (=P8)"]
+ end
+ P3 o-.-o PS1
+ P5 o-.-o PS2
+ P8 o-.-o PS3
+{% end %}
+
+## Quick Start
+
+1. Create a directory for your series.
+2. Create `_index.md` in the series directory.
+3. Set up the `_index.md` front matter:
+
+ ```toml,name=series/_index.md
+ title = "Learning Rust"
+ template = "series.html"
+ sort_by = "slug"
+ transparent = true
+
+ [extra]
+ series = true
+ ```
+
+4. Create your series articles in this directory.
+
+Want more? Keep reading!
+
+## How Do Series Work?
+
+A series is just a section which is handled in a special way by tabi. For more details on sections, see the [Zola documentation](https://www.getzola.org/documentation/content/section/).
+
+Taking the example from the diagram above, the directory structure would be as follow:
+
+```txt
+content/
+ _index.md
+ blog/
+ _index.md
+ post1/
+ index.md
+ post2/
+ index.md
+ post4/
+ index.md
+ post6/
+ index.md
+ post7/
+ index.md
+ post9/
+ index.md
+ series1/
+ _index.md
+ post3/
+ index.md
+ post5/
+ index.md
+ post8/
+ index.md
+```
+
+To create a series, you need to:
+
+1. Use the `series.html` template
+2. Set `series = true` in the section's `[extra]` configuration
+3. Enable `transparent = true` to integrate series posts with the parent blog section
+
+The series main page displays an overview followed by a list of all posts in the series:
+
+{{ dual_theme_image(light_src="blog/series/img/series_light.webp", dark_src="blog/series/img/series_dark.webp" alt="a series", full_width=true) }}
+
+## Jump to Posts
+
+If the content of a series (the Markdown after the front matter in `_index.md`) is over 2000 characters, a "Jump to posts" link appears next to the series title.
+
+{{ dual_theme_image(light_src="blog/series/img/jump_to_series_posts_light.webp", dark_src="blog/series/img/jump_to_series_posts_dark.webp" alt="jump to series posts link", full_width=true) }}
+
+To force the feature on or off, set `show_jump_to_posts` in the `[extra]` section of your series section or in `config.toml`. This setting follows [the hierarchy](@/blog/mastering-tabi-settings/index.md#settings-hierarchy).
+
+## Series Pages and Order
+
+All pages in the series section will be a series page. The series pages will be ordered as per the series section `sort_by`.
+
+While series maintain their own internal order, they remain independent from the main section's (e.g. `blog/`) chronological flow thanks to the `transparent` setting.
+
+### Sorting Options
+
+Choose from these sorting methods, each with its own advantages:
+
+{% wide_container() %}
+
+`sort_by` | pros | cons
+---------|-------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ `slug` | The series pages order is made explicit in the path (e.g. `example.com/blog/series1/01-series-post-one`). | Each series page must be prefixed accordingly.
+ `weight` | The series pages order is easy to set up transparently. First series post has weight `1`, second series post has weight `2` and so on. | Each series page must have its weight set accordingly.
+ `date` | The series pages order can be configured once in the series section configuration. No need to do anything on each series page. | The series pages order has to be reversed because the first page is usually the oldest. This can only be achieved by paginating the series section (`paginate_by = 9999`) and reversing its order (`paginate_reversed = true`).
+
+{% end %}
+
+{{ admonition(type="danger", title="Zola version to sort by date", text="In order to properly reverse dates, Zola v0.19.3+ (unreleased) is required so that pagination information is available through the `get_section` function. Anything relying on the series pages order won't be correct in a series page otherwise (e.g. previous/next series page, ordered and unordered list…) See [Zola PR #2653](https://github.com/getzola/zola/pull/2653).") }}
+
+### Page Indexing
+
+Pages in a series are indexed starting from 1, following their `sort_by` order. To reverse the indexing (making the first page have the highest index instead), add this setting to `_index.md` or `config.toml`:
+
+```toml
+[extra]
+post_listing_index_reversed = true # Defaults to false if unset.
+```
+
+{{ dual_theme_image(light_src="blog/series/img/series_reversed_light.webp", dark_src="blog/series/img/series_reversed_dark.webp" alt="a series with indexes reversed", full_width=true) }}
+
+This setting follows [the hierarchy](@/blog/mastering-tabi-settings/index.md#settings-hierarchy).
+
+## Intro and Outro Templates
+
+Series articles can have automatic introduction and conclusion sections. These are configured in your series' `_index.md`. A basic example:
+
+```toml,name=series/_index.md
+[extra.series_intro_templates]
+default = "This article is part of the $SERIES_HTML_LINK series."
+
+[extra.series_outro_templates]
+default = "Thanks for reading part $SERIES_PAGE_INDEX of $SERIES_HTML_LINK!"
+```
+
+The intro and outro sections each have their own CSS classes (`series-page-intro` and `series-page-outro`), allowing you to customize their appearance through [custom CSS](@/blog/mastering-tabi-settings/index.md#custom-css).
+
+### Template Types
+
+The series system uses different templates based on an article's position in the series:
+
+- `next_only` - Used for the first article (has next article but no previous)
+- `middle` - Used for articles with both previous and next articles
+- `prev_only` - Used for the last article (has previous article but no next)
+- `default` - Fallback template used when a specific position template isn't defined
+
+The system automatically determines which template to use based on the article's position. The templates are defined in the series configuration (`_index.md`), as `extra.series_intro_templates` and `extra.series_outro_templates`.:
+
+```toml,name=series/_index.md
+[extra.series_intro_templates]
+next_only = "Welcome to part 1! Next up: $NEXT_HTML_LINK"
+middle = "Previous: $PREV_HTML_LINK | Next: $NEXT_HTML_LINK"
+prev_only = "The final chapter! Previously: $PREV_HTML_LINK"
+default = "Part $SERIES_PAGE_INDEX of $SERIES_PAGES_NUMBER"
+```
+
+All templates are optional. Template selection follows a priority system:
+
+1. If a position-specific template exists (`next_only`, `middle`, or `prev_only`), it will be used
+2. Otherwise, the `default` template is used
+3. If no templates are defined at all, no series information will be displayed
+
+See the [template example](#template-example) for a more elaborate example.
+
+### Placement in Content
+
+By default:
+
+- Series introductions appear at the start of your article
+- Series outro appears at the end (before footnotes, if any)
+
+You can control exactly where these appear using `` and `` in your Markdown:
+
+```markdown
+This paragraph appears before the series introduction.
+
+
+
+Main content of the article.
+
+
+
+## Learning Resources
+
+Extra content…
+
+[^1]: Footnotes will always appear at the end.
+```
+
+## Variables
+
+Series templates use a flexible variable system that lets you:
+
+1. Reference series information (title, links)
+2. Add navigation between articles
+3. Show progress indicators
+4. Include custom information using your own variables
+
+Variables are placeholders starting with `$` that get replaced with actual content when your site builds. For example, `$SERIES_HTML_LINK` becomes a clickable link to your series index page.
+
+There are three types of variables:
+
+- [**Basic Series Variables**](#basic-series-variables): General information about the series
+- [**Navigation Variables**](#navigation-variables): Links to previous/next articles
+- [**Custom Variables**](#custom-variables): Your own placeholders for additional information
+
+### Basic Series Variables
+
+{% wide_container() %}
+
+| Variable | Availability | Returns | Description | Example Usage | Example Output |
+|----------|-------------|---------|-------------|---------------|----------------|
+| `$SERIES_TITLE` | Always | Text | Plain text title of the series | `Part of $SERIES_TITLE` | Part of Learn Rust |
+| `$SERIES_PERMALINK` | Always | Text | URL to series index | `[See all posts]($SERIES_PERMALINK)` | [See all posts](/series/learn-rust) |
+| `$SERIES_HTML_LINK` | Always | HTML | Ready-to-use link to series | `Welcome to $SERIES_HTML_LINK!` | Welcome to Learn Rust ! |
+| `$SERIES_PAGES_NUMBER` | Always | Number | Total articles in series | `A $SERIES_PAGES_NUMBER part series` | A 5 part series |
+| `$SERIES_PAGE_INDEX` | Always | Number | Current article's position | `Part $SERIES_PAGE_INDEX of $SERIES_PAGES_NUMBER` | Part 3 of 5 |
+| `$SERIES_PAGES_OLIST` | Always | HTML | Ordered list of all articles | `Articles in series: $SERIES_PAGES_OLIST` | Articles in series: Current article Other articles |
+| `$SERIES_PAGES_ULIST` | Always | HTML | Unordered list of all articles | `Articles in series: $SERIES_PAGES_ULIST` | Articles in series: |
+
+{% end %}
+
+{{ admonition(type="tip", title="TIP: Custom text with permalinks", text='Markdown links like `[text]($SERIES_PERMALINK)` will be marked (and [styled](@/blog/mastering-tabi-settings/index.md#external-link-indicator)) as external. If you need custom text and want to avoid external styling, use HTML: `your text `.') }}
+
+### Navigation Variables
+
+{% wide_container() %}
+
+| Variable | Availability | Returns | Description | Example Usage | Example Output |
+|----------|-------------|---------|-------------|---------------|----------------|
+| `$PREV_TITLE` | Previous exists | Text | Previous article's title | `Previously: $PREV_TITLE` | Previously: Setting Up Your Environment |
+| `$PREV_PERMALINK` | Previous exists | Text | URL to previous article | `[← Back]($PREV_PERMALINK)` | [← Back](/series/learn-rust/setup) |
+| `$PREV_HTML_LINK` | Previous exists | HTML | Ready-to-use link to previous | `Read $PREV_HTML_LINK first` | Read Setting Up Your Environment first |
+| `$PREV_DESCRIPTION` | Previous exists | Text | Description of previous article | `Recap: $PREV_DESCRIPTION` | Recap: Setting up Rust |
+| `$NEXT_TITLE` | Next exists | Text | Next article's title | `Next up: $NEXT_TITLE` | Next up: Advanced Patterns |
+| `$NEXT_PERMALINK` | Next exists | Text | URL to next article | `[Continue →]($NEXT_PERMALINK)` | [Continue →](/series/learn-rust/patterns) |
+| `$NEXT_HTML_LINK` | Next exists | HTML | Ready-to-use link to next | `Continue with $NEXT_HTML_LINK` | Continue with Advanced Patterns |
+| `$NEXT_DESCRIPTION` | Next exists | Text | Description of next article | `Coming up: $NEXT_DESCRIPTION` | Coming up: Learn about Rust's advanced pattern matching features |
+
+{% end %}
+
+### First Article Reference
+
+{% wide_container() %}
+
+| Variable | Availability | Returns | Description | Example Usage | Example Output |
+|----------|-------------|---------|-------------|---------------|----------------|
+| `$FIRST_TITLE` | Always | Text | First article's title | `Start with $FIRST_TITLE` | Start with Introduction to Rust |
+| `$FIRST_HTML_LINK` | Always | HTML | Ready-to-use link to first article | `Begin at $FIRST_HTML_LINK` | Begin at Introduction to Rust |
+
+{% end %}
+
+### Template Example
+
+{{ admonition(type="tip", title="HTML vs text variables", text="Use HTML variables (ending in `_HTML_LINK`) when you want ready-made links. Use text variables (ending in `_TITLE` or `_PERMALINK`) when you want more control over the formatting.") }}
+
+```toml,name=series/_index.md
+# Introduction.
+[extra.series_intro_templates]
+next_only = """
+Welcome to $SERIES_HTML_LINK! This $SERIES_PAGES_NUMBER-part series will teach you Rust from scratch.
+
+Up next: $NEXT_HTML_LINK - $NEXT_DESCRIPTION
+"""
+
+middle = """
+📚 Part $SERIES_PAGE_INDEX of $SERIES_PAGES_NUMBER in $SERIES_HTML_LINK
+
+Previously: $PREV_HTML_LINK
+Next up: $NEXT_HTML_LINK
+"""
+
+prev_only = """
+Welcome to the final part of $SERIES_HTML_LINK!
+New here? Start with $FIRST_HTML_LINK to build a strong foundation.
+
+Previously: $PREV_HTML_LINK
+"""
+
+# Fallback template.
+default = "This article is part of the $SERIES_HTML_LINK series."
+
+# Outro.
+[extra.series_outro_templates]
+next_only = """
+Thanks for reading! 🙌
+
+Continue your journey with $NEXT_HTML_LINK, where $NEXT_DESCRIPTION
+Or check out the complete [$SERIES_TITLE]($SERIES_PERMALINK) series outline.
+"""
+
+middle = """
+---
+📝 Series Navigation
+
+- Previous: $PREV_HTML_LINK
+- Next: $NEXT_HTML_LINK
+- [Series Overview]($SERIES_PERMALINK)
+"""
+
+prev_only = """
+🎉 Congratulations! You've completed $SERIES_HTML_LINK.
+
+Want to review? Here's where we started: $FIRST_HTML_LINK
+Or check what we just covered in $PREV_HTML_LINK.
+"""
+
+# Fallback.
+default = """
+---
+This article is part $SERIES_PAGE_INDEX of $SERIES_PAGES_NUMBER in $SERIES_HTML_LINK.
+"""
+```
+
+### Custom Variables
+
+Series templates support custom variables for additional information you want to include across your series. The process takes two steps:
+
+1. First, define your **placeholders** in your series configuration (`_index.md`):
+
+```toml,name=series/_index.md
+[extra]
+series = true
+series_template_placeholders = ["$POSITION", "$TOPIC", "$DIFFICULTY"]
+```
+
+2. Then, in each series article, provide the values for these placeholders in `series_template_variables`:
+
+```toml,name=series/article.md
+[extra.series_template_variables]
+position = "first"
+topic = "Variables and Types"
+difficulty = "Beginner"
+```
+
+### Using Custom Variables
+
+You can use your custom variables in any template, alongside the built-in variables:
+
+```toml,name=series/_index.md
+[extra.series_intro_templates]
+default = """
+This is the $POSITION article in $SERIES_HTML_LINK.
+Today's topic: $TOPIC
+Difficulty level: $DIFFICULTY
+"""
+```
+
+{{ admonition(type="warning", text="While placeholders are defined with uppercase (`$POSITION`), the variable names in `series_template_variables` must be lowercase (`position`).") }}
+
+### Example with Custom Variables
+
+```toml,name=series/_index.md
+# In the series configuration.
+[extra]
+series = true
+series_template_placeholders = ["$LEARNING_TIME", "$KEY_CONCEPTS"]
+
+series_intro_templates.default = """
+📚 Part $SERIES_PAGE_INDEX of $SERIES_PAGES_NUMBER
+⏱️ Estimated time: $LEARNING_TIME
+🔑 Key concepts: $KEY_CONCEPTS
+"""
+```
+
+```toml,name=series/02-learning-rust/index.md
+# In an article of the series.
+[extra.series_template_variables]
+learning_time = "30 minutes"
+key_concepts = "Functions, Error Handling, Pattern Matching"
+```
+
+This will output:
+
+```txt
+📚 Part 2 of 5
+⏱️ Estimated time: 30 minutes
+🔑 Key concepts: Functions, Error Handling, Pattern Matching
+```
+
+{{ admonition(type="warning", title="Missing Variables", text="If you use a placeholder in your templates but don't provide its value in `series_template_variables`, the build will fail with an error listing the missing variables.") }}
diff --git a/content/blog/series/social_cards/blog_series.jpg b/content/blog/series/social_cards/blog_series.jpg
new file mode 100644
index 0000000..0de6828
Binary files /dev/null and b/content/blog/series/social_cards/blog_series.jpg differ
diff --git a/content/blog/series/social_cards/ca_blog_series.jpg b/content/blog/series/social_cards/ca_blog_series.jpg
new file mode 100644
index 0000000..12ccc6c
Binary files /dev/null and b/content/blog/series/social_cards/ca_blog_series.jpg differ
diff --git a/content/blog/series/social_cards/es_blog_series.jpg b/content/blog/series/social_cards/es_blog_series.jpg
new file mode 100644
index 0000000..3a24a96
Binary files /dev/null and b/content/blog/series/social_cards/es_blog_series.jpg differ
diff --git a/content/blog/shortcodes/index.ca.md b/content/blog/shortcodes/index.ca.md
index 9c55f14..880267b 100644
--- a/content/blog/shortcodes/index.ca.md
+++ b/content/blog/shortcodes/index.ca.md
@@ -1,7 +1,7 @@
+++
title = "Shortcodes personalitzats"
date = 2023-02-19
-updated = 2024-05-18
+updated = 2025-08-01
description = "Aquest tema inclou alguns shortcodes personalitzats útils que pots utilitzar per millorar les teves publicacions. Ja sigui per mostrar imatges que s'adapten als temes clar i fosc, o per donar format a una secció de referències amb un aspecte professional, aquests shortcodes personalitzats t'ajudaran."
[taxonomies]
@@ -11,16 +11,105 @@ tags = ["funcionalitat", "shortcodes"]
toc = true
toc_levels = 2
quick_navigation_buttons = true
-add_src_to_code_block = true
+code_block_name_links = true
+mermaid = true
social_media_card = "social_cards/ca_blog_shortcodes.jpg"
+++
+## Shortcodes de diagrames
+
+### Diagrames de Mermaid
+
+[Mermaid](https://github.com/mermaid-js/mermaid) és una eina de diagramació i gràfics que utilitza text i codi per generar diagrames. Admet diagrames de flux, diagrames de seqüència, gràfics de Gantt i més.
+
+Per incloure un diagrama Mermaid a la teva publicació, cal fer dues coses:
+
+1. Estableix `mermaid = true` a la secció `[extra]` del front matter de la teva pàgina, secció o `config.toml`. Això carregarà el JavaScript necessari per renderitzar els diagrames.
+
+2. Utilitza el shortcode `mermaid()` per definir el teu diagrama. Per exemple:
+
+```txt
+{%/* mermaid() */%}
+classDiagram
+ class DistorsionsCognitives {
+ +PensamentTotORes()
+ +Sobregeneralitzacio()
+ +FiltreMental()
+ +TreureConclusionsPrecipitades()
+ }
+ class PensamentTotORes {
+ +VeureEnExtrems()
+ }
+ class Sobregeneralitzacio {
+ +GeneralitzarDUnic()
+ }
+ class FiltreMental {
+ +EnfocarseEnNegatiu()
+ }
+ class TreureConclusionsPrecipitades {
+ +FerSuposicions()
+ }
+ DistorsionsCognitives *-- PensamentTotORes
+ DistorsionsCognitives *-- Sobregeneralitzacio
+ DistorsionsCognitives *-- FiltreMental
+ DistorsionsCognitives *-- TreureConclusionsPrecipitades
+{%/* end */%}
+```
+
+El diagrama es renderitzarà així:
+
+{% mermaid() %}
+classDiagram
+ class DistorsionsCognitives {
+ +PensamentTotORes()
+ +Sobregeneralitzacio()
+ +FiltreMental()
+ +TreureConclusionsPrecipitades()
+ }
+ class PensamentTotORes {
+ +VeureEnExtrems()
+ }
+ class Sobregeneralitzacio {
+ +GeneralitzarDUnic()
+ }
+ class FiltreMental {
+ +EnfocarseEnNegatiu()
+ }
+ class TreureConclusionsPrecipitades {
+ +FerSuposicions()
+ }
+ DistorsionsCognitives *-- PensamentTotORes
+ DistorsionsCognitives *-- Sobregeneralitzacio
+ DistorsionsCognitives *-- FiltreMental
+ DistorsionsCognitives *-- TreureConclusionsPrecipitades
+{% end %}
+
+El shortcode de Mermaid admet dos paràmetres:
+
+- `invertible`: Si s'estableix a `true` (per defecte), el diagrama invertirà els seus colors en mode fosc, igual que les [imatges invertibles](#imatge-invertible).
+- `full_width`: Permet que el diagrama ocupi l'amplada de la capçalera. Mira [imatge d'amplada completa](#imatge-d-amplada-completa).
+
+{{ admonition(type="tip", title="CONSELL", text="Empra l'[editor de Mermaid](https://mermaid.live/) per crear i previsualitzar els teus diagrames.") }}
+
+#### Ús
+
+```
+{%/* mermaid(invertible=true, full_width=false) */%}
+
+El teu codi Mermaid va aquí.
+
+`invertible` or `full_width` poden ometre's per emprar els valors per defecte.
+
+{%/* end */%}
+```
+
## Shortcodes d'imatge
Tots els shortcodes d'imatge admeten rutes absolutes, rutes relatives, i fonts remotes en el paràmetre `src`.
-Tots els shortcodes d'imatge tenen tres paràmetres opcionals:
+Tots els shortcodes d'imatge tenen els següents paràmetres opcionals:
+- `raw_path`. Per defecte és `false`. Si es configura a `true`, el paràmetre `src` s'utilitzarà tal qual. Útil per a actius ubicats a la mateixa carpeta que tenen un slug personalitzat (vegeu [Zola issue #2598](https://github.com/getzola/zola/issues/2598)).
- `inline`. Valor predeterminat: `false`. Si s'estableix a `true`, la imatge es mostrarà en línia amb el text.
- `full_width`. Valor predeterminat: `false` (vegeu [a sota](#imatge-d-amplada-completa)).
- `lazy_loading`. Valor predeterminat: `true`.
@@ -98,27 +187,81 @@ Tots els altres shortcodes d'imatges poden utilizar l'amplada completa assignant
{{/* full_width_image(src="img/amsterdam_by_oskerwyld.webp", alt="Fotografia d'un canal a Àmsterdam") */}}
```
+## Shortcodes socials
+
+### iine
+
+{{ aside(text="Per afegir-lo a totes les publicacions, estableix `iine = true` a la secció `[extra]` del teu `config.toml`.") }}
+
+Aquest shortcode et permet afegir botons addicionals d'[iine.to](https://iine.to) a les teves publicacions, com aquest:
+
+{{ iine(slug="/blog/shortcodes/demo-button") }}
+
+#### Ús
+
+```
+{{/* iine(icon="heart", slug="/post/el-meu-slug-de-post/like", label="M'agrada aquesta publicació") */}}
+```
+
+El shortcode accepta els següents paràmetres opcionals:
+
+- `icon`: La icona a mostrar. Pot ser `heart`, `thumbs_up`, `upvote`, o qualsevol emoji.
+- `slug`: Un identificador únic. Per defecte és la ruta de la pàgina actual. Útil si vols més d'un botó a la mateixa pàgina.
+- `label`: L'etiqueta d'accessibilitat per al botó. Per defecte és "M'agrada aquesta publicació".
+
## Shortcodes de codi
### Mostrar ruta o URL
-Mostra una ruta o URL al següent bloc de codi trobat. Si comença amb "http", es convertirà en un enllaç. Particularment útil quan s'utilitza en conjunció amb el [shortcode de text remot](#text-remot).
+Pots mostrar una ruta o URL per a un bloc de codi utilitzant la sintaxi nativa de Zola:
-{{ admonition(type="warning", title="IMPORTANT", text="Aquesta funcionalitat requereix JavaScript. Per activar-la, configura `add_src_to_code_block = true` a la secció `[extra]` de la teva pàgina, secció, o `config.toml`.") }}
+{{ aside(text="Requereix Zola 0.20.0 o superior.") }}
-{{ add_src_to_code_block(src="https://github.com/welpo/doteki/blob/main/.gitignore") }}
+````
+```rust,name=src/main.rs
+fn main() {
+ println!("Hola, món!");
+}
+```
+````
-```.gitignore
-{{ remote_text(src="https://raw.githubusercontent.com/welpo/doteki/main/.gitignore") }}
+Això renderitza:
+
+```rust,name=src/main.rs
+fn main() {
+ println!("Hola, món!");
+}
+```
+
+Si estableixes el `name` com una URL (és a dir, comença amb `http` o `https`), pots convertir-lo en un enllaç clicable. Això és particularment útil quan s'utilitza juntament amb el [shortcode de text remot](#text-remot).
+
+{{ admonition(type="warning", title="JavaScript necessari", text="La funció d'URLs clicables requereix JavaScript. Per habilitar-la, configura `code_block_name_links = true` a la secció `[extra]` de la teva pàgina, secció, o `config.toml`.") }}
+
+```.gitignore,name=https://github.com/welpo/doteki/blob/main/.gitignore
+__pycache__/
+*coverage*
+.vscode/
+dist/
+```
+
+### Suport de shortcode heretat
+
+El shortcode `add_src_to_code_block` segueix funcionant per retrocompatibilitat però serà descontinuat en una versió futura. Si us plau, utilitza la sintaxi nativa de Zola:
+
+```
+# Forma antiga (descontinuada):
+{{/* add_src_to_code_block(src="ruta/al/fitxer.rs") */}}
+
+# Forma nova (recomanada):
+```rust,name=ruta/al/fitxer.rs
```
#### Ús
````
{{/* add_src_to_code_block(src="https://github.com/welpo/doteki/blob/main/.gitignore") */}}
-
```.gitignore
-__pycache__/
+**pycache**/
*coverage*
.vscode/
dist/
@@ -127,14 +270,54 @@ dist/
## Shortcodes de text
+### Aside (nota al marge)
+
+Afegeix contingut complementari als marges en pantalles amples, o com a blocs distintius en mòbil.
+
+{{ aside(text="*Nota al marge* ve de *nota* (del llatí, 'marca' o 'senyal') i *marge* (del llatí *margo*, 'vora' o 'límit').") }}
+
+El shortcode accepta dos paràmetres:
+
+- `position`: Establir com a `"right"` per col·locar al marge dret (per defecte, esquerre)
+- El contingut es pot proporcionar mitjançant el paràmetre `text` o entre les etiquetes del shortcode
+
+#### Ús
+
+{{ admonition(type="warning", text="Separa la definició de la nota del shortcode amb dues línies en blanc per evitar errors de renderització.") }}
+
+Fent servir el paràmetre `text`:
+
+```
+{{/* aside(text="*Nota al marge* ve de *nota* (del llatí, 'marca' o 'senyal') i *marge* (del llatí *margo*, 'vora' o 'límit').") */}}
+```
+
+Fent servir el cos del contingut i indicant la posició a la dreta:
+
+```
+{%/* aside(position="right") */%}
+Una nota més llarga que
+pot ocupar diverses línies.
+
+S'admet *Markdown*.
+{%/* end */%}
+```
+
### Text remot
Afegeix text des d'una URL remota o un arxiu local.
+El shortcode accepta tres paràmetres:
+
+- `src`: L'URL d'origen o ruta del fitxer (obligatori)
+- `start`: Primera línia a mostrar (opcional, comença a 1)
+- `end`: Número de l'última línia (opcional, per defecte és 0, l'última línia)
+
+{{ admonition(type="info", text="`start` i `end` són inclusius. `start=3, end=3` mostrarà només la tercera línia.") }}
+
**Important**:
- **Arxius remots VS arxius locals**: Si `src` comença amb "http", es tractarà com un arxiu remot. D'altra banda, s'assumeix que és una ruta d'arxiu local.
-- **Accés a arxius**: Atès que utilitza la funció [`load_data`](https://www.getzola.org/documentation/templates/overview/#load-data) de Zola, els arxius locals han d'estar dins del directori de Zola —vegeu la [lògica de cerca d'arxius](https://www.getzola.org/documentation/templates/overview/#file-searching-logic).
+- **Accés a arxius**: Atès que utilitza la funció [`load_data`](https://www.getzola.org/documentation/templates/overview/#load-data) de Zola, els arxius locals han d'estar dins del directori de Zola —vegeu la [lògica de cerca d'arxius](https://www.getzola.org/documentation/templates/overview/#file-searching-logic). Desde [tabi 2.16.0](https://github.com/welpo/tabi/releases/tag/v2.16.0), el shortcode admet també rutes relatives.
- **Formateig de blocs de codi**: Per mostrar el text com un bloc de codi, has d'afegir manualment les tanques de codi Markdown (cometes inverses) i, opcionalment, especificar el llenguatge de programació per al ressaltat sintàctic.
#### Ús
@@ -153,6 +336,12 @@ Mostra el text d'un arxiu local:
{{/* remote_text(src="ruta/a/arxiu.txt") */}}
```
+Mostreu només les línies 3 a 5 d'un arxiu local:
+
+```
+{{/* remote_text(src="ruta/a/arxiu.txt", start=3, end=5) */}}
+```
+
### Advertències
Destaca informació amb aquests shortcodes. Hi ha cinc tipus (`type`): `note`, `tip`, `info`, `warning`, i `danger`.
@@ -167,16 +356,32 @@ Destaca informació amb aquests shortcodes. Hi ha cinc tipus (`type`): `note`, `
{{ admonition(type="danger", text="Contingut amb **sintaxi** *Markdown*. Consulta [aquesta `api`](#).") }}
-Pots personalitzar el títol amb el paràmetre `title`:
+Pots canviar el `title` i la `icon` de l'advertència. Ambdós paràmetres accepten text i per defecte coincideixen amb el tipus d'advertència. `icon` pot ser qualsevol dels tipus d'advertència disponibles.
-{{ admonition(type="info", title="Título personalizado", text="Contingut amb **sintaxi** *Markdown*. Consulta [aquesta `api`](#).") }}
+{{ admonition(type="note", icon="tip", title="Títol i icona personalitzats", text="Contingut amb **sintaxi** *Markdown*. Consulta [aquesta `api`](#).") }}
#### Ús
+Pots utilitzar les advertències de dues maneres:
+
+1. En línia amb paràmetres:
+
+```md
+{{/* admonition(type="danger", icon="tip", title="Un consell important", text="Mantingues-te hidratat") */}}
```
-{{/* admonition(type="info", title="Títol opcional", text="Quelcom.") */}}
+
+2. Amb contingut al cos:
+
+```md
+{%/* admonition(type="danger", icon="tip", title="Un consell important") */%}
+Mantingues-te hidratat
+
+Aquest mètode és especialment útil per a contingut llarg o múltiples paràgrafs.
+{%/* end */%}
```
+Ambdós mètodes admeten els mateixos paràmetres (`type`, `icon`, i `title`).
+
### Cites multillenguatge
Aquest shortcode permet mostrar una cita traduïda i en el llenguatge original:
@@ -260,3 +465,31 @@ El Markdown, per suposat, serà interpretat.
{%/* end */%}
```
+
+### Forçar direcció del text
+
+Força la direcció del text d'un bloc de contingut. Substitueix tant la configuració global `force_codeblock_ltr` com la direcció general del document.
+
+Accepta el paràmetre `direction`: la direcció de text desitjada. Pot ser "ltr" (d'esquerra a dreta) o "rtl" (de dreta a esquerra). Per defecte és "ltr".
+
+{% force_text_direction(direction="rtl") %}
+```python
+def مرحبا_بالعالم():
+ print("مرحبا بالعالم!")
+```
+{% end %}
+
+#### Ús
+
+En una pàgina LTR podem forçar que un bloc de codi sigui RTL (com es mostra a dalt) de la següent manera:
+
+````
+{%/* force_text_direction(direction="rtl") */%}
+
+```python
+def مرحبا_بالعالم():
+ print("مرحبا بالعالم!")
+```
+
+{%/* end */%}
+````
diff --git a/content/blog/shortcodes/index.es.md b/content/blog/shortcodes/index.es.md
index 6dc8c0d..5efaf8c 100644
--- a/content/blog/shortcodes/index.es.md
+++ b/content/blog/shortcodes/index.es.md
@@ -1,7 +1,7 @@
+++
title = "Shortcodes personalizados"
date = 2023-02-19
-updated = 2024-05-18
+updated = 2025-08-01
description = "Este tema incluye algunos shortcodes personalizados útiles que puedes utilizar para mejorar tus publicaciones. Puedes mostrar imágenes que se adapten a los temas claro y oscuro, dar formato a una sección de referencias con un aspecto profesional, y más."
[taxonomies]
@@ -11,16 +11,103 @@ tags = ["funcionalidad", "shortcodes"]
toc = true
toc_levels = 2
quick_navigation_buttons = true
-add_src_to_code_block = true
+code_block_name_links = true
+mermaid = true
social_media_card = "social_cards/es_blog_shortcodes.jpg"
+++
+## Shortcodes de diagramas
+
+### Diagramas de Mermaid
+
+[Mermaid](https://github.com/mermaid-js/mermaid) es una herramienta de diagramación y gráficos que usa texto y código para generar diagramas. Admite diagramas de flujo, diagramas de secuencia, gráficos de Gantt y más.
+
+Para incluir un diagrama Mermaid en tu publicación, sigue estos dos pasos:
+
+1. Establece `mermaid = true` en la sección `[extra]` del front matter de tu página, sección o `config.toml`. Esto cargará el JavaScript necesario para renderizar los diagramas.
+
+2. Usa el shortcode `mermaid()` para definir tu diagrama. Por ejemplo:
+
+```txt
+{%/* mermaid() */%}
+classDiagram
+ class DistorsionesCognitivas {
+ +PensamientoTodoONada()
+ +Sobregeneralizacion()
+ +FiltroMental()
+ +SacarConclusionesPrecipitadas()
+ }
+ class PensamientoTodoONada {
+ +VerEnExtremos()
+ }
+ class Sobregeneralizacion {
+ +GeneralizarDeUnicoEjemplo()
+ }
+ class FiltroMental {
+ +EnfocarseEnNegativo()
+ }
+ class SacarConclusionesPrecipitadas {
+ +HacerSuposiciones()
+ }
+ DistorsionesCognitivas *-- PensamientoTodoONada
+ DistorsionesCognitivas *-- Sobregeneralizacion
+ DistorsionesCognitivas *-- FiltroMental
+ DistorsionesCognitivas *-- SacarConclusionesPrecipitadas
+{%/* end */%}
+```
+
+El diagrama se renderizará así:
+
+{% mermaid() %}
+classDiagram
+ class DistorsionesCognitivas {
+ +PensamientoTodoONada()
+ +Sobregeneralizacion()
+ +FiltroMental()
+ +SacarConclusionesPrecipitadas()
+ }
+ class PensamientoTodoONada {
+ +VerEnExtremos()
+ }
+ class Sobregeneralizacion {
+ +GeneralizarDeUnicoEjemplo()
+ }
+ class FiltroMental {
+ +EnfocarseEnNegativo()
+ }
+ class SacarConclusionesPrecipitadas {
+ +HacerSuposiciones()
+ }
+ DistorsionesCognitivas *-- PensamientoTodoONada
+ DistorsionesCognitivas *-- Sobregeneralizacion
+ DistorsionesCognitivas *-- FiltroMental
+ DistorsionesCognitivas *-- SacarConclusionesPrecipitadas
+{% end %}
+
+El shortcode de Mermaid admite dos parámetros:
+
+- `invertible`: Si se establece en `true` (por defecto), el diagrama se invertirá en modo oscuro, igual que las [imágenes invertibles](#imagen-invertible).
+- `full_width`: Permite que el diagrama ocupe el ancho del encabezado. Mira [imagen a ancho completo](#imagen-a-ancho-completo).
+
+{{ admonition(type="tip", title="CONSEJO", text="Puedes usar el [editor de Mermaid](https://mermaid.live/) para crear y previsualizar tus diagramas.") }}
+
+#### Uso
+
+```
+{%/* mermaid(invertible=true, full_width=false) */%}
+
+Tu diagrama Mermaid va aquí. Puedes omitir los parámetros para usar los valores predeterminados.
+
+{%/* end */%}
+```
+
## Shortcodes de imagen
Todos los shortcodes de imagen admiten rutas absolutas, rutas relativas, y fuentes remotas en el parámetro `src`.
-Todos los shortcodes de imagen tienen tres parámetros opcionales:
+Todos los shortcodes de imagen tienen los siguientes parámetros opcionales:
+- `raw_path`. Por defecto es `false`. Si se establece en `true`, el parámetro `src` se usará tal cual. Útil para activos ubicados en la misma carpeta que tienen un slug personalizado (ver [Zola issue #2598](https://github.com/getzola/zola/issues/2598)).
- `inline`. Valor predeterminado: `false`. Si se establece `true`, la imagen se mostrará en línea con el texto.
- `full_width`. Valor predeterminado: `false` (ver [más abajo](#imagen-a-ancho-completo)).
- `lazy_loading`. Valor predeterminado: `true`.
@@ -99,43 +186,125 @@ Todos los otros shortcodes de imágenes pueden usar el ancho completo asignando
{{/* full_width_image(src="img/amsterdam_by_oskerwyld.webp", alt="Fotografía de un canal en Ámsterdam") */}}
```
+## Shortcodes sociales
+
+### iine
+
+{{ aside(text="Para añadirlo a todas las publicaciones, establece `iine = true` en la sección `[extra]` de tu `config.toml`.") }}
+
+Este shortcode te permite añadir botones adicionales de [iine.to](https://iine.to) a tus publicaciones, como este:
+
+{{ iine(slug="/blog/shortcodes/demo-button") }}
+
+#### Uso
+
+```
+{{/* iine(icon="heart", slug="/post/mi-slug-de-post/like", label="Me gusta esta publicación") */}}
+```
+
+El shortcode acepta los siguientes parámetros opcionales:
+
+- `icon`: El icono a mostrar. Puede ser `heart`, `thumbs_up`, `upvote`, o cualquier emoji.
+- `slug`: Un identificador único. Por defecto es la ruta de la página actual. Útil si quieres más de un botón en la misma página.
+- `label`: La etiqueta de accesibilidad para el botón. Por defecto es "Me gusta esta publicación".
+
## Shortcodes de código
### Mostrar ruta o URL
-Muestra una ruta o URL en el siguiente bloque de código encontrado. Si comienza con "http", se convertirá en un enlace. Particularmente útil cuando se usa junto con el [shortcode de texto remot](#texto-remoto).
+Puedes mostrar una ruta o URL para un bloque de código usando la sintaxis nativa de Zola:
-{{ add_src_to_code_block(src="https://github.com/welpo/doteki/blob/main/.gitignore") }}
-
-```.gitignore
-{{ remote_text(src="https://raw.githubusercontent.com/welpo/doteki/main/.gitignore") }}
-```
-
-{{ admonition(type="warning", title="IMPORTANT", text="Esta característica requiere JavaScript. Para habilitarla, configura `add_src_to_code_block = true` en la sección `[extra]` de tu página, sección, o `config.toml`.") }}
-
-#### Uso
+{{ aside(text="Requiere Zola 0.20.0 o superior.") }}
````
-{{/* add_src_to_code_block(src="https://github.com/welpo/doteki/blob/main/.gitignore") */}}
+```rust,name=src/main.rs
+fn main() {
+ println!("¡Hola, mundo!");
+}
+```
+````
-```.gitignore
+Esto renderiza:
+
+```rust,name=src/main.rs
+fn main() {
+ println!("¡Hola, mundo!");
+}
+```
+
+Si estableces el `name` como una URL (es decir, comienza con `http` o `https`), puedes convertirlo en un enlace clickable. Esto es particularmente útil cuando se usa junto con el [shortcode de texto remoto](#texto-remoto).
+
+{{ admonition(type="warning", title="JavaScript requerido", text="La función de URLs clickables requiere JavaScript. Para habilitarla, configura `code_block_name_links = true` en la sección `[extra]` de tu página, sección, o `config.toml`.") }}
+
+```.gitignore,name=https://github.com/welpo/doteki/blob/main/.gitignore
__pycache__/
*coverage*
.vscode/
dist/
```
-````
+
+### Soporte de shortcode heredado
+
+El shortcode `add_src_to_code_block` sigue funcionando por retrocompatibilidad, pero será descontinuado en una versión futura. Por favor, usa la sintaxis nativa de Zola:
+
+```
+# Forma antigua (descontinuada):
+{{/* add_src_to_code_block(src="ruta/al/archivo.rs") */}}
+
+# Forma nueva (recomendada):
+```rust,name=ruta/al/archivo.rs
+```
## Shortcodes de texto
+### Aside (nota al margen)
+
+Añade contenido complementario en los márgenes en pantallas anchas, o como bloques distintivos en móvil.
+
+{{ aside(text="*Nota al margen* viene de *nota* (del latín, 'marca' o 'señal') y *margen* (del latín *margo*, 'borde' o 'límite').") }}
+
+El shortcode acepta dos parámetros:
+
+- `position`: Establecer como `"right"` para colocar en el margen derecho (por defecto, izquierdo)
+- El contenido puede proporcionarse mediante el parámetro `text` o entre las etiquetas del shortcode
+
+#### Uso
+
+{{ admonition(type="warning", text="Separa la llamada al shortcode con saltos de línea para evitar errores de renderizado.") }}
+
+Usando el parámetro `text`:
+
+```
+{{/* aside(text="*Nota al margen* viene de *nota* (del latín, 'marca' o 'señal') y *margen* (del latín *margo*, 'borde' o 'límite').") */}}
+```
+
+Usando el cuerpo del contenido e indicando la posición:
+
+```
+{%/* aside(position="right") */%}
+Una nota más larga que
+puede ocupar varias líneas.
+
+Se admite *Markdown*.
+{%/* end */%}
+```
+
### Texto remoto
Añade texto desde una URL remota o un archivo local.
+El shortcode acepta tres parámetros:
+
+- `src`: La URL de origen o ruta del archivo (obligatorio)
+- `start`: Primera línea a mostrar (opcional, empieza en 1)
+- `end`: Número de la última línea (opcional, por defecto es 0, la última línea)
+
+{{ admonition(type="info", text="`start` y `end` son inclusivos. `start=3, end=3` mostrará solo la tercera línea.") }}
+
**Importante**:
- **Archivos remotos VS archivos locales**: Si `src` empieza con "http", se tratará como un archivo remoto. De lo contrario, se asume que es una ruta de archivo local.
-- **Acceso a archivos**: Dado que utiliza la función [`load_data`](https://www.getzola.org/documentation/templates/overview/#load-data) de Zola, los archivos locales deben estar dentro del directorio de Zola —ver la [lógica de búsqueda de archivos](https://www.getzola.org/documentation/templates/overview/#file-searching-logic).
+- **Acceso a archivos**: Dado que utiliza la función [`load_data`](https://www.getzola.org/documentation/templates/overview/#load-data) de Zola, los archivos locales deben estar dentro del directorio de Zola —ver la [lógica de búsqueda de archivos](https://www.getzola.org/documentation/templates/overview/#file-searching-logic). Desde [tabi 2.16.0](https://github.com/welpo/tabi/releases/tag/v2.16.0), el shortcode admite también rutas relativas.
- **Formateo de bloques de código**: Para mostrar el texto como un bloque de código, debes añadir manualmente las cercas de código Markdown (comillas invertidas) y, opcionalmente, especificar el lenguaje de programación para el resaltado sintáctico.
#### Uso
@@ -154,6 +323,12 @@ Visualización de texto de un archivo local:
{{/* remote_text(src="ruta/a/archivo.txt") */}}
```
+Mostar sólo las líneas 3 a 5 de un archivo remoto:
+
+```
+{{/* remote_text(src="https://example.com/script.py", start=3, end=5) */}}
+```
+
### Advertencias
Destaca información con estos shortcodes. Hay cinco tipos (`type`): `note`, `tip`, `info`, `warning`, y `danger`.
@@ -168,16 +343,32 @@ Destaca información con estos shortcodes. Hay cinco tipos (`type`): `note`, `ti
{{ admonition(type="danger", text="Contenido con **sintaxis** *Markdown*. Consulta [esta `api`](#).") }}
-Puedes personalizar el título con el parámetro `title`:
+Puedes cambiar el `title` y el `icon` de la advertencia. Ambos parámetros aceptan texto y por defecto coinciden con el tipo de advertencia. `icon` puede ser cualquiera de los tipos de advertencia disponibles.
-{{ admonition(type="info", title="Título personalizado", text="Contenido con **sintaxis** *Markdown*. Consulta [esta `api`](#).") }}
+{{ admonition(type="note", icon="tip", title="Título e icono personalizados", text="Contenido con **sintaxis** *Markdown*. Consulta [esta `api`](#).") }}
#### Uso
+Puedes usar las advertencias de dos formas:
+
+1. En línea con parámetros:
+
+```md
+{{/* admonition(type="danger", icon="tip", title="Un consejo importante", text="Mantente hidratado") */}}
```
-{{/* admonition(type="info", title="Título opcional", text="Algo.") */}}
+
+2. Con contenido en el cuerpo:
+
+```md
+{%/* admonition(type="danger", icon="tip", title="Un consejo importante") */%}
+Mantente hidratado
+
+Este método es especialmente útil para contenido largo o múltiples párrafos.
+{%/* end */%}
```
+Ambos métodos admiten los mismos parámetros (`type`, `icon`, y `title`).
+
### Citas multilenguaje
Este shortcode permite mostrar una cita traducida y en su lenguaje original:
@@ -262,3 +453,31 @@ El Markdown, por supuesto, será interpretado.
{%/* end */%}
```
+
+### Forzar dirección del texto
+
+Fuerza la dirección del texto de un bloque de contenido. Anula tanto la configuración global `force_codeblock_ltr` como la dirección general del documento.
+
+Acepta el parámetro `direction`: la dirección de texto deseada. Puede ser "ltr" (de izquierda a derecha) o "rtl" (de derecha a izquierda). Por defecto es "ltr".
+
+{% force_text_direction(direction="rtl") %}
+```python
+def مرحبا_بالعالم():
+ print("مرحبا بالعالم!")
+```
+{% end %}
+
+#### Uso
+
+En una página LTR podemos forzar que un bloque de código sea RTL (como se muestra arriba) de la siguiente manera:
+
+````
+{%/* force_text_direction(direction="rtl") */%}
+
+```python
+def مرحبا_بالعالم():
+ print("مرحبا بالعالم!")
+```
+
+{%/* end */%}
+````
diff --git a/content/blog/shortcodes/index.md b/content/blog/shortcodes/index.md
index f7f5a74..d40d3cd 100644
--- a/content/blog/shortcodes/index.md
+++ b/content/blog/shortcodes/index.md
@@ -1,7 +1,7 @@
+++
title = "Custom shortcodes"
date = 2023-02-19
-updated = 2024-05-18
+updated = 2025-07-26
description = "This theme includes some useful custom shortcodes that you can use to enhance your posts. Whether you want to display images that adapt to light and dark themes, or format a professional-looking reference section, these custom shortcodes have got you covered."
[taxonomies]
@@ -11,16 +11,105 @@ tags = ["showcase", "shortcodes"]
toc = true
toc_levels = 2
quick_navigation_buttons = true
-add_src_to_code_block = true
+code_block_name_links = true
+mermaid = true
social_media_card = "social_cards/blog_shortcodes.jpg"
+++
+## Diagram shortcode
+
+### Mermaid diagrams
+
+[Mermaid](https://github.com/mermaid-js/mermaid) is a a diagramming and charting tool that uses text and code to generate diagrams. It supports flowcharts, sequence diagrams, Gantt charts, and more.
+
+To include a Mermaid diagram in your post, there are two steps:
+
+1. Set `mermaid = true` in the `[extra]` section of the front matter of your page, section or `config.toml`. This will load the JavaScript needed to render the diagrams.
+
+2. Use the `mermaid()` shortcode to define your diagram in your posts. For example:
+
+```txt
+{%/* mermaid() */%}
+classDiagram
+ class CognitiveDistortions {
+ +AllOrNothingThinking()
+ +Overgeneralization()
+ +MentalFilter()
+ +JumpingToConclusions()
+ }
+ class AllOrNothingThinking {
+ +SeeInExtremes()
+ }
+ class Overgeneralization {
+ +GeneralizeFromSingle()
+ }
+ class MentalFilter {
+ +FocusOnNegative()
+ }
+ class JumpingToConclusions {
+ +MakeAssumptions()
+ }
+ CognitiveDistortions *-- AllOrNothingThinking
+ CognitiveDistortions *-- Overgeneralization
+ CognitiveDistortions *-- MentalFilter
+ CognitiveDistortions *-- JumpingToConclusions
+{%/* end */%}
+```
+
+The diagram will be rendered as follows:
+
+{% mermaid() %}
+classDiagram
+ class CognitiveDistortions {
+ +AllOrNothingThinking()
+ +Overgeneralization()
+ +MentalFilter()
+ +JumpingToConclusions()
+ }
+ class AllOrNothingThinking {
+ +SeeInExtremes()
+ }
+ class Overgeneralization {
+ +GeneralizeFromSingle()
+ }
+ class MentalFilter {
+ +FocusOnNegative()
+ }
+ class JumpingToConclusions {
+ +MakeAssumptions()
+ }
+ CognitiveDistortions *-- AllOrNothingThinking
+ CognitiveDistortions *-- Overgeneralization
+ CognitiveDistortions *-- MentalFilter
+ CognitiveDistortions *-- JumpingToConclusions
+{% end %}
+
+The Mermaid shortcode supports two parameters:
+
+- `invertible`: If set to `true` (default), the diagram will be inverted in dark mode, just like [invertible images](#invertible-image).
+- `full_width`: Allows the diagram to take up the width of the header. See [full-width image](#full-width-image).
+
+{{ admonition(type="tip", text="You can use the [Mermaid Live Editor](https://mermaid.live/) to create and preview your diagrams.") }}
+
+#### Usage
+
+```
+{%/* mermaid(invertible=true, full_width=false) */%}
+
+Your diagram goes here.
+
+`invertible` or `full_width` can be omitted if default values are used.
+
+{%/* end */%}
+```
+
## Image shortcodes
All image shortcodes support absolute paths, relative paths, and remote sources in the `src` parameter.
-All image shortcodes have three optional parameters:
+All image shortcodes have these optional parameters:
+- `raw_path`. Defaults to `false`. If set to `true`, the `src` parameter will be used as is. Useful for colocated assets with a custom slug (see [Zola issue #2598](https://github.com/getzola/zola/issues/2598)).
- `inline`. Defaults to `false`. If set to `true`, the image will be displayed inline with the text.
- `full_width`. Defaults to `false` (see [below](#full-width-image))
- `lazy_loading`. Defaults to `true`.
@@ -32,6 +121,7 @@ Useful if you want to use a different image for the light and dark themes:
{{ dual_theme_image(light_src="img/paris_day.webp", dark_src="img/paris_night.webp" alt="The Eiffel tower") }}
#### Usage
+
```
{{/* dual_theme_image(light_src="img/paris_day.webp", dark_src="img/paris_night.webp" alt="The Eiffel tower") */}}
```
@@ -62,7 +152,7 @@ Images with too much brightness or contrast can be jarring against a dark backgr
### Swap image on hover
-Povides an interaction where the image displayed changes as the user hovers over it. Useful for before-after comparisons, for example.
+Provides an interaction where the image displayed changes as the user hovers over it. Useful for before-after comparisons, for example.
{{ image_hover(default_src="img/edited.webp", hovered_src="img/raw.webp", default_alt="Edited picture", hovered_alt="Original shot") }}
@@ -98,43 +188,125 @@ All other image shortcodes can be made into full-width by setting the optional p
{{/* full_width_image(src="img/amsterdam_by_oskerwyld.webp", alt="Photograph of a canal in Amsterdam") */}}
```
+## Engagement shortcodes
+
+### iine
+
+{{ aside(text="To add it to all posts, set `iine = true` in the `[extra]` section of your `config.toml`.") }}
+
+This shortcode allows you to add extra [iine.to](https://iine.to) buttons to your posts, like this:
+
+{{ iine(slug="/blog/shortcodes/demo-button") }}
+
+#### Usage
+
+```
+{{/* iine(icon="heart", slug="/post/my-post-slug/like", label="Like this post") */}}
+```
+
+The shortcode takes the following optional parameters:
+
+- `icon`: The icon to display. Can be `heart`, `thumbs_up`, `upvote`, or any emoji.
+- `slug`: A unique identifier. Defaults to the current page's path. Useful if you want more than one button on the same page.
+- `label`: The accessibility label for the button. Defaults to "Like this post".
+
## Code shortcodes
### Show source or path
-Display a path or URL on the next code block found. If it starts with "http", it will become a link. Particularly useful when used in conjunction with the [remote text shortcode](#remote-text).
+You can display a path or URL for a code block using Zola's native syntax:
-{{ add_src_to_code_block(src="https://github.com/welpo/doteki/blob/main/.gitignore") }}
-
-```.gitignore
-{{ remote_text(src="https://raw.githubusercontent.com/welpo/doteki/main/.gitignore") }}
-```
-
-{{ admonition(type="warning", title="IMPORTANT", text="This feature requires JavaScript. To enable it, set `add_src_to_code_block = true` on the `[extra]` section of your page, section, or `config.toml`.") }}
-
-#### Usage
+{{ aside(text="Requires Zola 0.20.0 or later.") }}
````
-{{/* add_src_to_code_block(src="https://github.com/welpo/doteki/blob/main/.gitignore") */}}
+```rust,name=src/main.rs
+fn main() {
+ println!("Hello, world!");
+}
+```
+````
-```.gitignore
+This renders:
+
+```rust,name=src/main.rs
+fn main() {
+ println!("Hello, world!");
+}
+```
+
+If you set the `name` to a URL (i.e. it starts with `http` or `https`), you can turn it into a clickable link. This is particularly useful when used in conjunction with the [remote text shortcode](#remote-text).
+
+{{ admonition(type="warning", title="JavaScript required", text="The clickable URL feature requires JavaScript. To enable it, set `code_block_name_links = true` on the `[extra]` section of your page, section, or `config.toml`.") }}
+
+```.gitignore,name=https://github.com/welpo/doteki/blob/main/.gitignore
__pycache__/
*coverage*
.vscode/
dist/
```
-````
+
+### Legacy shortcode support
+
+The `add_src_to_code_block` shortcode is still supported for backward compatibility but will be deprecated in a future release. Please use Zola's native syntax shown above instead:
+
+```
+# Old way (deprecated):
+{{/* add_src_to_code_block(src="path/to/file.rs") */}}
+
+# New way (preferred):
+```rust,name=path/to/file.rs
+```
## Text shortcodes
+### Aside (side/margin note)
+
+Add supplementary content in the margins on wide screens, or as distinct blocks on mobile.
+
+{{ aside(text="*Sidenote* comes from Latin *nota* ('mark') + Old English *síde* ('side').") }}
+
+The shortcode accepts two parameters:
+
+- `position`: Set to `"right"` to place in right margin (defaults to left)
+- Content can be provided via `text` parameter or between shortcode tags
+
+#### Usage
+
+{{ admonition(type="warning", text="Place the aside shortcode on its own line to prevent formatting issues.") }}
+
+Using the `text` parameter:
+
+```
+{{/* aside(text="*Sidenote* comes from Latin *nota* ('mark') + Old English *síde* ('side').") */}}
+```
+
+Using the content body and setting the position to right:
+
+```
+{%/* aside(position="right") */%}
+A longer note that
+can span multiple lines.
+
+_Markdown_ is supported.
+{%/* end */%}
+```
+
### Remote text
Embed text from a remote URL or a local file. To display the path or URL on the code block, see the [show source or path shortcode](#show-source-or-path).
+The shortcode accepts three parameters:
+
+- `src`: The source URL or file path (required)
+- `start`: First line to display (optional, starts at 1)
+- `end`: The ending line number (optional, defaults to 0, meaning the last line)
+
+{{ admonition(type="info", text="`start` and `end` are inclusive. `start=3, end=3` will display only the third line.") }}
+
**Important**:
- **Remote VS local files**: If `src` starts with "http", it will be treated as a remote file. Otherwise, it assumes a local file path.
-- **Files access**: As it uses Zola's [`load_data`](https://www.getzola.org/documentation/templates/overview/#load-data), local files must be inside the Zola directory—see [File searching logic](https://www.getzola.org/documentation/templates/overview/#file-searching-logic).
+- **Files access**: As it uses Zola's [`load_data`](https://www.getzola.org/documentation/templates/overview/#load-data), local files must be inside the Zola directory—see [File searching logic](https://www.getzola.org/documentation/templates/overview/#file-searching-logic). As of [tabi 2.16.0](https://github.com/welpo/tabi/releases/tag/v2.16.0), the shortcode supports both relative and absolute paths.
- **Code block formatting**: To display the text as a code block, you must manually add the Markdown code fences (backticks) and, optionally, specify the programming language for syntax highlighting.
#### Usage
@@ -153,6 +325,12 @@ Displaying text from a local file:
{{/* remote_text(src="path/to/file.txt") */}}
```
+Display lines 3 to 7 (both inclusive) of a local file:
+
+```
+{{/* remote_text(src="path/to/file.txt", start=3, end=7) */}}
+```
+
### Admonitions
Bring attention to information with these admonition shortcodes. They come in five `type`s: `note`, `tip`, `info`, `warning`, and `danger`.
@@ -167,26 +345,42 @@ Bring attention to information with these admonition shortcodes. They come in fi
{{ admonition(type="danger", text="Some **content** with _Markdown_ `syntax`. Check [this `api`](#).") }}
-You can set a custom title with the `title` parameter:
+You can change the `title` and `icon` of the admonition. Both parameters take a string and default to the type of admonition. `icon` can be any of the available admonition types.
-{{ admonition(type="note", title="Custom title", text="Some **content** with _Markdown_ `syntax`. Check [this `api`](#).") }}
+{{ admonition(type="note", icon="tip", title="Custom title and icon", text="Some **content** with _Markdown_ `syntax`. Check [this `api`](#).") }}
#### Usage
+You can use admonitions in two ways:
+
+1. Inline with parameters:
+
+```md
+{{/* admonition(type="danger", icon="tip", title="An important tip", text="Stay hydrated~") */}}
```
-{{/* admonition(type="info", title="Optional custom title", text="Something.") */}}
+
+2. With a content body:
+
+```md
+{%/* admonition(type="danger", icon="tip", title="An important tip") */%}
+Stay hydrated~
+
+This method is particularly useful for longer content or multiple paragraphs.
+{%/* end */%}
```
+Both methods support the same parameters (`type`, `icon`, and `title`), with the content either passed as the `text` parameter or as the body between tags.
+
### Multilingual quotes
This shortcode allows you to display both the translated and original text for a quote. The quotation marks will be added automatically:
-{{ multilingual_quote(original="Qué sosiego, ir por la vida en silencio, saludando sólo a los amigos.", translated="What tranquility, to go through life in silence, greeting only friends.", author="Francisco Umbral") }}
+{{ multilingual_quote(original="Qué sosiego, ir por la vida en silencio, saludando sólo a los amigos.", translated="What tranquillity, to go through life in silence, greeting only friends.", author="Francisco Umbral") }}
#### Usage
```
-{{/* multilingual_quote(original="Qué sosiego, ir por la vida en silencio, saludando sólo a los amigos.", translated="What tranquility, to go through life in silence, greeting only friends.", author="Francisco Umbral") */}}
+{{/* multilingual_quote(original="Qué sosiego, ir por la vida en silencio, saludando sólo a los amigos.", translated="What tranquillity, to go through life in silence, greeting only friends.", author="Francisco Umbral") */}}
```
### References with hanging indent
@@ -260,3 +454,33 @@ Markdown will of course be rendered.
{%/* end */%}
```
+
+### Force text direction
+
+Force the text direction of a content block. Overrides both the global `force_codeblock_ltr` setting and the document's overall direction.
+
+Accepts the parameter `direction`: the desired text direction. This can be either "ltr" (left-to-right) or "rtl" (right-to-left). Defaults to "ltr".
+
+{% force_text_direction(direction="rtl") %}
+
+```python
+def مرحبا_بالعالم():
+ print("مرحبا بالعالم!")
+```
+
+{% end %}
+
+#### Usage
+
+In a LTR page we can force a code block to be RTL (as shown above) like so:
+
+````
+{%/* force_text_direction(direction="rtl") */%}
+
+```python
+def مرحبا_بالعالم():
+ print("مرحبا بالعالم!")
+```
+
+{%/* end */%}
+````
diff --git a/content/social_cards/ca.jpg b/content/ca.jpg
similarity index 100%
rename from content/social_cards/ca.jpg
rename to content/ca.jpg
diff --git a/content/social_cards/es.jpg b/content/es.jpg
similarity index 100%
rename from content/social_cards/es.jpg
rename to content/es.jpg
diff --git a/content/social_cards/index.jpg b/content/index.jpg
similarity index 100%
rename from content/social_cards/index.jpg
rename to content/index.jpg
diff --git a/content/pages/_index.ar.md b/content/pages/_index.ar.md
new file mode 100644
index 0000000..704bbde
--- /dev/null
+++ b/content/pages/_index.ar.md
@@ -0,0 +1,7 @@
++++
+render = false
+insert_anchor_links = "right"
+
+[extra]
+hide_from_feed = true
++++
diff --git a/content/pages/about/index.ar.md b/content/pages/about/index.ar.md
new file mode 100644
index 0000000..3c87d48
--- /dev/null
+++ b/content/pages/about/index.ar.md
@@ -0,0 +1,40 @@
++++
+title = "عني"
+template = "info-page.html"
+path = "/ar/about"
+
+[extra]
+quick_navigation_buttons = true
+social_media_card = "social_cards/about.ar.jpg"
++++
+
+مرحبًا بكم في العرض التقديمي ل[**تابي**]، وهو قالب لـ[Zola]، مولد المواقع الثابتة السريع.
+
+**تابي** هو من ابتكار أوسكار فرنانديز ([welpo] على GitHub)، وقد صُمم في البداية لموقعه الشخصي [osc.garden]. هو قالب بشكل حديث غني بالميزات يوفر إعدادات افتراضية منطقية وآمنة.
+
+يمكنك العثور على وثائق تشرح طريقة إستخدام **تابي** في [المدونة] و[الأرشيف]، سوف تجد بهم مقالات تشرح القالب وتقدم لك نظرة عامة حوله.
+
+## الميزات
+
+يركز **تابي** على الاداء ويدعم [تعدد اللغات] أي انه يمكن لمدونتك دعم أكثر من لغة، ويمكنك [تخصيص مظهرها]، ويمكنك [تفعيل التعليقات بها] أي السماح للأخرين بالتعليق على منشوراتك. و **تابي** لا يجبر مدونتك على إستخدام جافاسكربت، حيث انها [إختيارية] ولكنك سوف تفقد المميزات التي تحتاج إليها.
+
+## المساهمة
+
+نحن نقدر المساهمات! نرحب بالتبليغ على الأخطاء، وتحسينات الترجمة أو الوثائق (بغض النظر عن حجمها)، واقتراحات الميزات... تحقق من [إرشادات المساهمة] لمعرفة كيفية المساعدة. شكرًا لك!
+
+## الترخيص
+
+الكود متاح بموجب [رخصة MIT].
+
+[**تابي**]: https://github.com/welpo/tabi
+[Zola]: https://www.getzola.org
+[welpo]: https://github.com/welpo
+[osc.garden]: https://osc.garden
+[المدونة]: https://welpo.github.io/tabi/blog
+[الأرشيف]: https://welpo.github.io/tabi/archive
+[تعدد اللغات]: https://welpo.github.io/tabi/blog/faq-languages
+[تخصيص مظهرها]: https://welpo.github.io/tabi/blog/customise-tabi
+[تفعيل التعليقات بها]: https://welpo.github.io/tabi/blog/comments
+[إختيارية]: https://welpo.github.io/tabi/blog/javascript
+[إرشادات المساهمة]: https://github.com/welpo/tabi/blob/main/CONTRIBUTING.md
+[رخصة MIT]: https://choosealicense.com/licenses/mit
diff --git a/content/pages/about/index.ca.md b/content/pages/about/index.ca.md
index 503fa84..4ecb30e 100644
--- a/content/pages/about/index.ca.md
+++ b/content/pages/about/index.ca.md
@@ -5,7 +5,6 @@ path = "/ca/about"
[extra]
quick_navigation_buttons = true
-social_media_card = "social_cards/about.ca.jpg"
+++
Benvingut a la demo de [**tabi**](https://github.com/welpo/tabi), un tema per a [Zola](https://www.getzola.org/), un generador de llocs web estàtics rapidíssim.
diff --git a/content/pages/about/index.es.md b/content/pages/about/index.es.md
index 005c336..8f74bef 100644
--- a/content/pages/about/index.es.md
+++ b/content/pages/about/index.es.md
@@ -5,7 +5,6 @@ path = "/es/about"
[extra]
quick_navigation_buttons = true
-social_media_card = "social_cards/about.es.jpg"
+++
Bienvenido a la demo de [**tabi**](https://github.com/welpo/tabi), un tema para [Zola](https://www.getzola.org/), un rapidísimo generador de sitios estáticos.
diff --git a/content/pages/about/index.md b/content/pages/about/index.md
index fba24f9..5db48c3 100644
--- a/content/pages/about/index.md
+++ b/content/pages/about/index.md
@@ -5,7 +5,6 @@ path = "about"
[extra]
quick_navigation_buttons = true
-social_media_card = "social_cards/about.jpg"
+++
Welcome to the demo of [**tabi**](https://github.com/welpo/tabi), a theme for [Zola](https://www.getzola.org/), a fast static site generator.
diff --git a/content/pages/about/social_cards/about.ar.jpg b/content/pages/about/social_cards/about.ar.jpg
new file mode 100644
index 0000000..981ba8f
Binary files /dev/null and b/content/pages/about/social_cards/about.ar.jpg differ
diff --git a/content/pages/about/social_cards/about.ca.jpg b/content/pages/about/social_cards/about.ca.jpg
deleted file mode 100644
index 6104cdc..0000000
Binary files a/content/pages/about/social_cards/about.ca.jpg and /dev/null differ
diff --git a/content/pages/about/social_cards/about.es.jpg b/content/pages/about/social_cards/about.es.jpg
deleted file mode 100644
index 809bd3a..0000000
Binary files a/content/pages/about/social_cards/about.es.jpg and /dev/null differ
diff --git a/content/pages/about/social_cards/about.jpg b/content/pages/about/social_cards/about.jpg
deleted file mode 100644
index 4117d18..0000000
Binary files a/content/pages/about/social_cards/about.jpg and /dev/null differ
diff --git a/content/pages/privacy/index.ar.md b/content/pages/privacy/index.ar.md
new file mode 100644
index 0000000..04450e5
--- /dev/null
+++ b/content/pages/privacy/index.ar.md
@@ -0,0 +1,95 @@
++++
+title = "سياسة الخصوصية"
+path = "/ar/privacy"
+date = 2023-10-31
+updated = 2024-05-12
++++
+
+هذه السياسة توضح كيف نقوم بجمع ومعالجة بياناتك على هذا الموقع.
+
+{{ toc() }}
+
+## ما البيانات التي نجمعها؟
+
+### التصفح العام {#what-general}
+
+أثناء تصفح الموقع، لا يتم جمع أي معلومات شخصية.
+
+### التعليقات {#what-comments}
+
+نحن لا نجمع أي بيانات عند إرسال تعليق على تدوينة، لكن GitHub يجمع البيانات لتوفير الخدمة، حيث انه يتم توفيرها من خلاله.
+
+### التحليلات {#what-analytics}
+
+لتحسين الموقع، يتم جمع البيانات غير الشخصية التالية:
+
+- **المرجع**: المصدر الذي قادك إلى هذا الموقع.
+- **الرابط المطلوب**: الصفحة المحددة التي قمت بزيارتها.
+- **وكيل المستخدم**: يحدد المتصفح ونظام التشغيل الذي تستخدمه (مثل "Safari 17.0، Mac OS X").
+- **اسم البلد**: البلد الذي زرت الموقع منه، يتم تحديده بواسطة عنوان IP الخاص بك.
+- **حجم الشاشة**: أبعاد شاشة جهازك.
+- **الوقت**: الوقت الذي وصلت فيه إلى الموقع.
+- **جلسة التصفح**: رمز تعريف مؤقت يتم إنشاؤه من عنوان IP الخاص بك، ومعلومات المتصفح، ورقم عشوائي. يُستخدم هذا للتعرف على جلسة التصفح لمدة 8 ساعات. بعد ذلك، يتم حذف الرمز من الذاكرة ولا يُخزن في أي مكان.
+
+نحن لا نتتبع الزوار عبر الجلسات، ولا نتتبع مدة بقائك في الموقع أو أين تذهب بعد مغادرتك.
+
+## كيف نجمع هذه البيانات؟
+
+### التعليقات {#how-comments}
+
+يتم جمع البيانات المرتبطة بالتعليقات باستخدام [Giscus](https://giscus.app/)، وهي منصة تمكن من إضافة التعليقات، المبنية على GitHub.
+
+### التحليلات {#how-analytics}
+
+يتم جمع البيانات غير الشخصية باستخدام نسخة مستضافة ذاتيًا من [GoatCounter](https://www.goatcounter.com/)، وهي منصة مفتوحة المصدر لتحليلات الويب تركز على الخصوصية.
+
+## كيف سنستخدم البيانات؟
+
+تُستخدم البيانات المرسلة إلى GitHub لعرض تعليقك على الموقع.
+
+تُستخدم البيانات غير الشخصية لإنشاء إحصائيات حول الموقع، مثل عدد الزوار يوميًا، أو الصفحات والمراجع الأكثر شعبية. تُستخدم هذه البيانات لتحسين هذا الموقع التجريبي وقالب تابي. يمكنك رؤية الإحصائيات الناتجة عن هذه البيانات على [صفحة الإحصائيات العامة](https://tabi-stats.osc.garden/).
+
+جميع البيانات المجمعة متاحة للجمهور، سواء في شكل تعليقات أو إحصائيات.
+
+نحن لا نستخدم البيانات لأي غرض آخر.
+
+## كيف نقوم بتخزين البيانات؟
+
+بيانات التعليقات لا تُخزن بواسطة Giscus، كما هو موضح في [سياسة الخصوصية الخاصة بهم](https://github.com/giscus/giscus/blob/main/PRIVACY-POLICY.md#what-data-do-we-collect). يتم تخزين البيانات على خوادم GitHub. راجع [سياسة الخصوصية الخاصة بGitHub](https://docs.github.com/en/site-policy/privacy-policies/github-privacy-statement).
+
+يتم تخزين بيانات التحليلات على خادم مستضاف بواسطة [Vultr](https://www.vultr.com/). يقع الخادم في باريس، فرنسا.
+
+## كم من الوقت سنقوم بتخزين البيانات؟
+
+تُخزن التعليقات إلى أجل غير مسمى، أو حتى تطلب حذفها.
+
+تُخزن باقي البيانات إلى أجل غير مسمى.
+
+## ما هي حقوقك في حماية البيانات؟
+
+اعتمادًا على المعالجة والأساس القانوني، هناك عدد من الخيارات المتاحة لك للحفاظ على السيطرة على بياناتك الشخصية:
+
+- حق الوصول إلى بياناتك
+- حق تعديل بياناتك
+- حق الاعتراض على معالجة بياناتك الشخصية
+- حق تقييد معالجة بياناتك
+- حق حذف بياناتك
+- حق سحب موافقتك
+
+إذا قدمت طلبًا، لدينا شهر واحد للرد عليك. إذا كنت ترغب في ممارسة أي من هذه الحقوق، يرجى الاتصال بنا باستخدام أيقونة البريد الإلكتروني في تذييل الموقع.
+
+## الكوكيز
+
+الموقع لا يستخدم الكوكيز.
+
+## سياسات الخصوصية لمواقع أخرى
+
+يحتوي هذا الموقع على روابط لمواقع أخرى. تنطبق سياسة الخصوصية هذه فقط على هذا الموقع، لذا إذا قمت بالنقر على رابط لموقع آخر، يجب عليك قراءة سياسة الخصوصية الخاصة بهم.
+
+## التغييرات على سياسة الخصوصية
+
+نحن نراجع هذه السياسة بانتظام ونضع أي تحديثات على هذه الصفحة. يمكنك التحقق من تاريخ تحديث هذه السياسة، بالإضافة إلى سجل التغييرات تحت عنوان الصفحة.
+
+## كيف تتواصل معنا
+
+إذا كانت لديك أي أسئلة حول سياسة الخصوصية هذه، أو البيانات التي نحتفظ بها عنك، أو إذا كنت ترغب في ممارسة أحد حقوق حماية البيانات الخاصة بك، فلا تتردد في الاتصال بنا باستخدام أيقونة البريد الإلكتروني في تذييل الموقع.
\ No newline at end of file
diff --git a/content/projects/_index.ar.md b/content/projects/_index.ar.md
new file mode 100644
index 0000000..d351532
--- /dev/null
+++ b/content/projects/_index.ar.md
@@ -0,0 +1,10 @@
++++
+title = "مشاريعي"
+sort_by = "weight"
+template = "cards.html"
+insert_anchor_links = "right"
+
+[extra]
+show_reading_time = false
+quick_navigation_buttons = true
++++
diff --git a/content/projects/_index.ca.md b/content/projects/_index.ca.md
index 5b65f16..b454ba3 100644
--- a/content/projects/_index.ca.md
+++ b/content/projects/_index.ca.md
@@ -5,7 +5,7 @@ template = "cards.html"
insert_anchor_links = "left"
[extra]
-social_media_card = "projects/social_cards/ca_projects.jpg"
+social_media_card = "projects/ca_projects.jpg"
show_reading_time = false
quick_navigation_buttons = true
+++
diff --git a/content/projects/_index.es.md b/content/projects/_index.es.md
index 196a3cd..93ab3fd 100644
--- a/content/projects/_index.es.md
+++ b/content/projects/_index.es.md
@@ -5,7 +5,7 @@ template = "cards.html"
insert_anchor_links = "left"
[extra]
-social_media_card = "projects/social_cards/es_projects.jpg"
+social_media_card = "projects/es_projects.jpg"
show_reading_time = false
quick_navigation_buttons = true
+++
diff --git a/content/projects/_index.md b/content/projects/_index.md
index e9130d9..e07ac64 100644
--- a/content/projects/_index.md
+++ b/content/projects/_index.md
@@ -5,7 +5,8 @@ template = "cards.html"
insert_anchor_links = "left"
[extra]
-social_media_card = "projects/social_cards/projects.jpg"
+social_media_card = "projects/projects.jpg"
show_reading_time = false
quick_navigation_buttons = true
+iine_icon = 'heart'
+++
diff --git a/content/projects/social_cards/ca_projects.jpg b/content/projects/ca_projects.jpg
similarity index 100%
rename from content/projects/social_cards/ca_projects.jpg
rename to content/projects/ca_projects.jpg
diff --git a/content/projects/doteki/doteki_logo.png b/content/projects/doteki/doteki_logo.png
deleted file mode 100644
index ebef2ce..0000000
Binary files a/content/projects/doteki/doteki_logo.png and /dev/null differ
diff --git a/content/projects/doteki/doteki_logo.webp b/content/projects/doteki/doteki_logo.webp
index c48c54c..ee76f41 100644
Binary files a/content/projects/doteki/doteki_logo.webp and b/content/projects/doteki/doteki_logo.webp differ
diff --git a/content/projects/doteki/index.ca.md b/content/projects/doteki/index.ca.md
index 761a597..6a318cb 100644
--- a/content/projects/doteki/index.ca.md
+++ b/content/projects/doteki/index.ca.md
@@ -3,33 +3,58 @@ title = "dōteki"
description = "Afegeix contingut dinàmic al teu perfil de GitHub amb un sistema intuïtiu de plugins."
weight = 30
+[taxonomies]
+tags = ["GitHub Actions", "automatització", "Python"]
+
[extra]
local_image = "projects/doteki/doteki_logo.webp"
social_media_card = "social_cards/projects_doteki.jpg"
canonical_url = "https://osc.garden/ca/projects/doteki/"
+++
-[**dōteki**](https://doteki.org/) és una eina dissenyada per donar vida als perfils de GitHub afegint contingut dinàmic de manera senzilla. Amb un arxiu de configuració TOML intuïtiu i un sistema de plugins versàtil, **dōteki** permet als usuaris mostrar contingut recent i automatitzat directament als seus perfils de GitHub.
+**dōteki** actualitza el teu perfil de GitHub automàticament. Afegeix les teves últimes publicacions del blog, la música que escoltes o qualsevol altre contingut dinàmic mitjançant plugins.

#### [GitHub](https://github.com/welpo/doteki) • [Lloc web](https://doteki.org/) • [Documentació](https://doteki.org/docs/) {.centered-text}
-## Per què dōteki?
+## Com funciona
-**dōteki** destaca per la seva simplicitat i potència. És altament personalitzable i extensible, i està dissenyat per ser fàcil de configurar i utilitzar.
+1. Afegeix marcadors al teu README:
-## Característiques clau
+```md,name=README.md
+
+
+```
-- **Plug-and-Play**: Afegeix marcadors al teu README i utilitza un arxiu TOML per incorporar seccions de contingut dinàmic al teu perfil de GitHub.
-- **Sistema de plugins extensible**: Des de mostrar les últimes publicacions del teu blog fins a compartir la música que has estat escoltant, el sistema de plugins permet infinites possibilitats. No trobes un plugin que s'ajusti a les teves necessitats? [Crea el teu propi](https://doteki.org/docs/developer-guide/plugin-standard)!
-- [**Documentació exhaustiva**](https://doteki.org/docs/) amb informació detallada sobre com configurar i utilitzar **dōteki** i els seus plugins. Inclou [instruccions clares per als desenvolupadors](https://doteki.org/docs/developer-guide/) que vulguin contribuir al projecte.
-- **Preparat per a l'automatització**: Utilitza l'[Acció de GitHub](https://github.com/welpo/doteki-action) per mantenir el teu perfil sempre actualitzat.
+2. Configura què hi va:
-## Refresca el teu perfil de GitHub
+```toml,name=doteki.toml
+[sections.blog]
+plugin = "feed"
+url = "https://osc.garden/atom.xml" # Substitueix amb el teu feed.
-Aprofita les capacitats dinàmiques de **dōteki** i transforma el teu perfil de GitHub en un aparador del teu treball més recent, pensaments i interessos.
+[sections.last_updated]
+plugin = "current_date"
+inline = true
+```
-[Configura **dōteki** en menys de 5 minuts](https://doteki.org/) i dóna vida al teu perfil de GitHub.
+3. Configura l'[Acció de GitHub](https://github.com/welpo/doteki-action).
-[](https://doteki.org/)
+Això és tot! El teu README s'actualitzarà automàticament.
+
+## Característiques
+
+- **Sistema de plugins**: Mostra [entrades del blog](https://doteki.org/docs/plugins/feed), [música](https://doteki.org/docs/plugins/lastfm), o [crea el teu propi plugin](https://doteki.org/docs/developer-guide/plugin-standard)
+- **Configuració simple**: Un arxiu TOML, una Acció de GitHub
+- **Flexible**: Cada plugin té les seves pròpies opcions (ordre, entrades màximes, format…)
+- **[Documentació detallada](https://doteki.org/docs/)**: Informació detallada sobre com configurar i utilitzar **dōteki** i els seus plugins. Inclou [instruccions clares per als desenvolupadors](https://doteki.org/docs/developer-guide/) que vulguin contribuir.
+
+## Documentació
+
+Consulta la [documentació](https://doteki.org/docs/) per a:
+
+- [Guia d'inici](https://doteki.org/docs/)
+- [Plugins disponibles](https://doteki.org/docs/category/plugins)
+- [Desenvolupament de plugins](https://doteki.org/docs/developer-guide/)
+- [Opcions de configuració](https://doteki.org/docs/configuration/)
diff --git a/content/projects/doteki/index.es.md b/content/projects/doteki/index.es.md
index 4e50e6c..93e5159 100644
--- a/content/projects/doteki/index.es.md
+++ b/content/projects/doteki/index.es.md
@@ -3,33 +3,58 @@ title = "dōteki"
description = "Añade contenido dinámico a tu perfil de GitHub con un sistema intuitivo de plugins."
weight = 30
+[taxonomies]
+tags = ["GitHub Actions", "automatización", "Python"]
+
[extra]
local_image = "projects/doteki/doteki_logo.webp"
social_media_card = "social_cards/projects_doteki.jpg"
canonical_url = "https://osc.garden/es/projects/doteki/"
+++
-[**dōteki**](https://doteki.org/) es una herramienta diseñada para dar vida a los perfiles de GitHub añadiendo contenido dinámico de manera sencilla. Con un archivo de configuración TOML intuitivo y un versátil sistema de plugins, **dōteki** permite a los usuarios mostrar contenido reciente y automatizado directamente en sus perfiles de GitHub.
+**dōteki** actualiza tu perfil de GitHub automáticamente. Añade tus últimas publicaciones del blog, la música que escuchas o cualquier otro contenido dinámico mediante plugins.

#### [GitHub](https://github.com/welpo/doteki) • [Sitio web](https://doteki.org/) • [Documentación](https://doteki.org/docs/) {.centered-text}
-## ¿Por qué dōteki?
+## Cómo funciona
-**dōteki** destaca por su simplicidad y potencia. Permite mostrar tu trabajo, intereses y personalidad en tu perfil de GitHub, siempre al día. Es altamente personalizable y extensible, y está diseñado para ser fácil de configurar y usar.
+1. Añade marcadores a tu README:
-## Características clave
+```md,name=README.md
+
+
+```
-- **Plug-and-Play**: Añade marcadores a tu README y utiliza un archivo TOML para incorporar secciones de contenido dinámico en tu perfil de GitHub.
-- **Sistema de plugins extensible**: Desde mostrar las últimas publicaciones de tu blog hasta compartir la música que has estado escuchando, el sistema de plugins permite infinitas posibilidades. ¿No encuentras un plugin que se ajuste a tus necesidades? ¡[Crea tu propio plugin](https://doteki.org/docs/developer-guide/plugin-standard)!
-- [**Documentación exhaustiva**](https://doteki.org/docs/) con información detallada sobre cómo configurar y usar **dōteki** y sus plugins. Incluye [instrucciones claras para los desarrolladores](https://doteki.org/docs/developer-guide/) que quieran contribuir al proyecto
-- **Listo para la automatización**: Utiliza la [Acción de GitHub](https://github.com/welpo/doteki-action) para mantener tu perfil siempre actualizado.
+2. Configura qué va ahí:
-## Refresca tu perfil de GitHub
+```toml,name=doteki.toml
+[sections.blog]
+plugin = "feed"
+url = "https://osc.garden/atom.xml" # Reemplaza con tu feed.
-Aprovecha las capacidades dinámicas de **dōteki** y transforma tu perfil de GitHub en un escaparate de tu trabajo más reciente, pensamientos e intereses.
+[sections.last_updated]
+plugin = "current_date"
+inline = true
+```
-[Configura **dōteki** en menos de 5 minutos](https://doteki.org/) y da vida a tu perfil de GitHub.
+3. Configura la [Acción de GitHub](https://github.com/welpo/doteki-action).
-[](https://doteki.org/)
+¡Eso es todo! Tu README se actualizará automáticamente.
+
+## Características
+
+- **Sistema de plugins**: Muestra [entradas del blog](https://doteki.org/docs/plugins/feed), [música](https://doteki.org/docs/plugins/lastfm), o [crea tu propio plugin](https://doteki.org/docs/developer-guide/plugin-standard)
+- **Configuración simple**: Un archivo TOML, una Acción de GitHub
+- **Flexible**: Cada plugin tiene sus propias opciones (orden, entradas máximas, formato…)
+- **[Documentación detallada](https://doteki.org/docs/)**: Información detallada sobre cómo configurar y usar **dōteki** y sus plugins. Incluye [instrucciones claras para los desarrolladores](https://doteki.org/docs/developer-guide/) que quieran contribuir.
+
+## Documentación
+
+Consulta la [documentación](https://doteki.org/docs/) para:
+
+- [Guía de inicio rápido](https://doteki.org/docs/)
+- [Plugins disponibles](https://doteki.org/docs/category/plugins)
+- [Desarrollo de plugins](https://doteki.org/docs/developer-guide/)
+- [Opciones de configuración](https://doteki.org/docs/configuration/)
diff --git a/content/projects/doteki/index.md b/content/projects/doteki/index.md
index e8e9fec..067bf76 100644
--- a/content/projects/doteki/index.md
+++ b/content/projects/doteki/index.md
@@ -3,33 +3,58 @@ title = "dōteki"
description = "Add dynamic content to your GitHub profile through an intuitive plugin system."
weight = 30
+[taxonomies]
+tags = ["GitHub Actions", "automation", "Python"]
+
[extra]
local_image = "projects/doteki/doteki_logo.webp"
social_media_card = "social_cards/projects_doteki.jpg"
canonical_url = "https://osc.garden/projects/doteki/"
+++
-[**dōteki**](https://doteki.org/) is a tool designed to breathe life into GitHub profiles by adding dynamic content effortlessly. By leveraging an intuitive TOML configuration file along with a versatile plugin system, **dōteki** empowers users to showcase fresh, automated content directly on their GitHub profiles.
+**dōteki** updates your GitHub profile README automatically. Add your latest blog posts, music you're listening to, or any other dynamic content using plugins.

#### [GitHub](https://github.com/welpo/doteki) • [Website](https://doteki.org/) • [Documentation](https://doteki.org/docs/) {.centered-text}
-## Why dōteki?
+## How it works
-**dōteki** stands out for its simplicity and power, enabling you to dynamically showcase your work, interests and personality on your GitHub profile. It's designed to be easy to set up and use, while also being highly customizable and extensible.
+1. Add markers to your README:
-## Key Features
+```md,name=README.md
+
+
+```
-- **Plug-and-Play**: Add markers to your README and use a TOML file for straightforward setup and easy management of dynamic content sections on your GitHub profile README.
-- **Extensible plugin system**: From showcasing your latest blog posts to displaying your favourite music, the plugin system allows for endless possibilities. Can't find a plugin that suits your needs? [Create your own](https://doteki.org/docs/developer-guide/plugin-standard)!
-- **Extensive documentation**: The [comprehensive documentation](https://doteki.org/docs/) provides detailed information on how to set up and use **dōteki** and its plugins. It includes [clear instructions for developers](https://doteki.org/docs/developer-guide/) looking to contribute.
-- **Automation Ready**: Use the [GitHub Action](https://github.com/welpo/doteki-action) to keep your profile always up to date.
+2. Configure what goes there:
-## Enhance Your GitHub Profile Today
+```toml,name=doteki.toml
+[sections.blog]
+plugin = "feed"
+url = "https://osc.garden/atom.xml" # Replace with your feed.
-Embrace the dynamic capabilities of **dōteki** and transform your GitHub profile into a vibrant showcase of your latest work, thoughts, and interests.
+[sections.last_updated]
+plugin = "current_date"
+inline = true
+```
-[Set up **dōteki** in less than 5 minutes](https://doteki.org/) and bring your GitHub profile to life.
+3. Set up the [GitHub Action](https://github.com/welpo/doteki-action).
-[](https://doteki.org/)
+That's it! Your README will stay updated automatically.
+
+## Features
+
+- **Plugin system**: Show [blog posts](https://doteki.org/docs/plugins/feed), [music](https://doteki.org/docs/plugins/lastfm), or [build your own plugin](https://doteki.org/docs/developer-guide/plugin-standard)
+- **Simple setup**: One TOML file, one GitHub Action
+- **Flexible**: Each plugin has its own options (sort order, max entries, format…)
+- **[Extensive documentation](https://doteki.org/docs/)**: Detailed information on how to set up and use **dōteki** and its plugins. It includes [clear instructions for developers](https://doteki.org/docs/developer-guide/) looking to contribute.
+
+## Documentation
+
+Check the [docs](https://doteki.org/docs/) for:
+
+- [Getting started guide](https://doteki.org/docs/)
+- [Available plugins](https://doteki.org/docs/category/plugins)
+- [Plugin development](https://doteki.org/docs/developer-guide/)
+- [Configuration options](https://doteki.org/docs/configuration/)
diff --git a/content/projects/social_cards/es_projects.jpg b/content/projects/es_projects.jpg
similarity index 100%
rename from content/projects/social_cards/es_projects.jpg
rename to content/projects/es_projects.jpg
diff --git a/content/projects/git-sumi/git-sumi_logo.png b/content/projects/git-sumi/git-sumi_logo.png
deleted file mode 100644
index 450d71b..0000000
Binary files a/content/projects/git-sumi/git-sumi_logo.png and /dev/null differ
diff --git a/content/projects/git-sumi/git-sumi_logo.webp b/content/projects/git-sumi/git-sumi_logo.webp
index d5d3ae8..90fd11b 100644
Binary files a/content/projects/git-sumi/git-sumi_logo.webp and b/content/projects/git-sumi/git-sumi_logo.webp differ
diff --git a/content/projects/git-sumi/index.ca.md b/content/projects/git-sumi/index.ca.md
index 8d6b4ad..cdee76e 100644
--- a/content/projects/git-sumi/index.ca.md
+++ b/content/projects/git-sumi/index.ca.md
@@ -3,13 +3,16 @@ title = "git-sumi"
description = "El linter de missatges de commit no opinat basat en Rust."
weight = 10
+[taxonomies]
+tags = ["Git", "Rust", "Continuous Integration", "GitHub Actions", "CLI", "automatització"]
+
[extra]
local_image = "projects/git-sumi/git-sumi_logo.webp"
social_media_card = "social_cards/projects_git-sumi.jpg"
canonical_url = "https://osc.garden/ca/projects/git-sumi/"
+++
-**git-sumi** és un linter de missatges de commit no opinat escrit en Rust. És una eina flexible per complir els teus estàndards de missatges de commit, facilitant missatges consistents i fàcilment automatitzables.
+**git-sumi** és el linter de missatges de commit no opinat escrit en Rust.
{% wide_container() %}
@@ -19,21 +22,12 @@ canonical_url = "https://osc.garden/ca/projects/git-sumi/"
## Característiques principals
-- **Regles personalitzables**: Configura git-**sumi** per satisfer els requisits específics de cada projecte. Configura regles per a Conventional Commits, límits de longitud, ús de Gitmoji i més a través d'un senzill arxiu de configuració TOML.
-- **Informe d'errors clar**: Proporciona un informe d'errors detallat, fent que la correcció sigui senzilla i educativa.
-- **Integració sense fissures**: Sent un únic binari, git-**sumi** s'integra fàcilment en el teu flux de treball. Fins i tot pots utilitzar l'[Acció de GitHub](https://github.com/welpo/git-sumi-action) per validar els teus commits (o títols de PR) sense necessitat d'instal·lar res localment.
+- **Regles personalitzables**: Configura regles per a Conventional Commits, límits de longitud, ús de [Gitmoji](https://gitmoji.dev/) i [més](https://sumi.rs/docs/rules).
+- **Informe d'errors clar**: Proporciona errors detallats, fent que la correcció sigui senzilla i educativa.
+- **Integració senzilla**: Com a binari únic, git-sumi s'integra fàcilment al teu flux de treball. També pots fer servir l'[Acció de GitHub](https://github.com/welpo/git-sumi-action) per validar commits (o títols de PR) sense instal·lar res.
## Bones pràctiques de desenvolupament
-- **Ampla cobertura del codi**: Més del 95% de cobertura de línies i una cobertura de característiques exhaustiva garanteixen la robustesa de git-**sumi**.
-- **Integració [contínua](https://github.com/welpo/git-sumi/blob/main/.github/workflows/ci.yml) i [publicació](https://github.com/welpo/git-sumi/blob/main/.github/workflows/release.yml)**: Fluxos de treball automatitzats per provar, integrar i publicar asseguren que cada versió de git-**sumi** estigui completament provada i llesta per al seu ús.
-- **Contribucions de la comunitat**: Fomenta les contribucions de la comunitat de tot tipus, amb un enfocament acollidor tant per als nouvinguts com per als desenvolupadors experimentats.
-- [**Documentació exhaustiva**](https://sumi.rs/docs/) per començar amb git-**sumi** i comprendre les seves característiques i capacitats.
-
-## Comença a millorar les teves pràctiques de commit avui
-
-Fes el primer pas cap a la transformació de les teves pràctiques de commit. La combinació de flexibilitat, retroalimentació detallada i fàcil integració de git-**sumi** el converteix en l'opció perfecta per a equips i individus que busquen millorar els seus missatges de commit.
-
-[Descobreix **git-sumi**](https://sumi.rs/) i fes-lo part del teu kit d'eines de desenvolupament.
-
-[](https://sumi.rs/)
+- **Cobertura de codi**: 98% de cobertura en tests; un linter ha de ser fiable.
+- **[Integració](https://github.com/welpo/git-sumi/blob/main/.github/workflows/ci.yml) i [publicació](https://github.com/welpo/git-sumi/blob/main/.github/workflows/release.yml) contínua**: Fluxos automatitzats per a testing i publicació de binaris multiplataforma a crates.io, PyPI i GitHub releases.
+- **Documentació**: [Documentació completa](https://sumi.rs/docs/) amb [guia ràpida](https://sumi.rs/docs/), [exemples](https://sumi.rs/docs/examples), [regles](https://sumi.rs/docs/rules), [integració](https://sumi.rs/docs/integration), [FAQ](https://sumi.rs/docs/faq)...
diff --git a/content/projects/git-sumi/index.es.md b/content/projects/git-sumi/index.es.md
index 0f8df7d..5830eee 100644
--- a/content/projects/git-sumi/index.es.md
+++ b/content/projects/git-sumi/index.es.md
@@ -3,13 +3,16 @@ title = "git-sumi"
description = "El linter de mensajes de commit no opinado basado en Rust."
weight = 10
+[taxonomies]
+tags = ["Git", "Rust", "Continuous Integration", "GitHub Actions", "CLI", "automatización"]
+
[extra]
local_image = "projects/git-sumi/git-sumi_logo.webp"
social_media_card = "social_cards/projects_git-sumi.jpg"
canonical_url = "https://osc.garden/es/projects/git-sumi/"
+++
-**git-sumi** es un linter de mensajes de commit no opinado escrito en Rust. Es una herramienta flexible para cumplir tus estándares de mensajes de commit, facilitando mensajes consistentes y fácilmente automatizables.
+**git-sumi** es el linter de mensajes de commit no opinado escrito en Rust.
{% wide_container() %}
@@ -19,21 +22,12 @@ canonical_url = "https://osc.garden/es/projects/git-sumi/"
## Características principales
-- **Reglas personalizables**: Configura git-**sumi** para satisfacer los requisitos específicos de cada proyecto. Configura reglas para Conventional Commits, límites de longitud, uso de Gitmoji y más a través de un archivo de un sencillo archivo de configuración TOML.
-- **Reporte de errores claro**: Proporciona un reporte de errores detallado, haciendo que la corrección sea sencilla y educativa.
-- **Integración sin fisuras**: Al ser único binario, git-**sumi** se integra fácilmente en tu flujo de trabajo. Incluso puedes usar la [Acción de GitHub](https://github.com/welpo/git-sumi-action) para validar tus commits (o títulos de PR) sin necesidad de instalar nada localmente.
+- **Reglas personalizables**: Configura reglas para [Conventional Commits](https://www.conventionalcommits.org/), límites de longitud, uso de [Gitmoji](https://gitmoji.dev/) y [más](https://sumi.rs/docs/rules).
+- **Reporte de errores claro**: Proporciona errores detallados, haciendo que la corrección sea sencilla y educativa.
+- **Integración sencilla**: Al ser único binario, git-sumi se integra fácilmente en tu flujo de trabajo. Puedes usar la [Acción de GitHub](https://github.com/welpo/git-sumi-action) para validar commits (o títulos de PR) sin instalar nada.
## Buenas prácticas de desarrollo
-- **Amplia cobertura del código**: Más del 95% de cobertura de líneas y una cobertura de características exhaustiva garantizan la robustez de git-**sumi**.
-- **Integración [continua](https://github.com/welpo/git-sumi/blob/main/.github/workflows/ci.yml) y [publicación](https://github.com/welpo/git-sumi/blob/main/.github/workflows/release.yml)**: Flujos de trabajo automatizados para probar, integrar y publicar aseguran que cada versión de git-**sumi** esté completamente probada y lista para su uso.
-- **Contribuciones de la comunidad**: Fomenta las contribuciones de la comunidad de todo tipo, con un enfoque acogedor tanto para los recién llegados como para los desarrolladores experimentados.
-- [**Documentación exhaustiva**](https://sumi.rs/docs/) para empezar con git-**sumi** y comprender sus características y capacidades.
-
-## Empieza a mejorar tus prácticas de commit hoy
-
-Da el primer paso hacia la transformación de tus prácticas de commit. La combinación de flexibilidad, retroalimentación detallada y fácil integración de git-**sumi** lo convierte en la opción perfecta para equipos e individuos que buscan mejorar sus mensajes de commit.
-
-[Descubre **git-sumi**](https://sumi.rs/) y hazlo parte de tu kit de herramientas de desarrollo.
-
-[](https://sumi.rs/)
+- **Cobertura de código**: 98% de cobertura de código; un linter debe ser robusto.
+- **[Integración](https://github.com/welpo/git-sumi/blob/main/.github/workflows/ci.yml) y [publicación](https://github.com/welpo/git-sumi/blob/main/.github/workflows/release.yml) continua**: Flujos automatizados para testing y publicación de binarios multiplataforma en crates.io, PyPI y GitHub releases.
+- **Documentación**: [Documentación completa](https://sumi.rs/docs/) con [guía rápida](https://sumi.rs/docs/), [ejemplos](https://sumi.rs/docs/examples), [reglas](https://sumi.rs/docs/rules), [integración](https://sumi.rs/docs/integration), [FAQ](https://sumi.rs/docs/faq)...
diff --git a/content/projects/git-sumi/index.md b/content/projects/git-sumi/index.md
index f2cfb74..0cb59b8 100644
--- a/content/projects/git-sumi/index.md
+++ b/content/projects/git-sumi/index.md
@@ -3,13 +3,16 @@ title = "git-sumi"
description = "The non-opinionated Rust-based commit message linter."
weight = 10
+[taxonomies]
+tags = ["Git", "Rust", "Continuous Integration", "GitHub Actions", "CLI", "automation"]
+
[extra]
local_image = "projects/git-sumi/git-sumi_logo.webp"
social_media_card = "social_cards/projects_git-sumi.jpg"
canonical_url = "https://osc.garden/projects/git-sumi/"
+++
-**git-sumi** is a non-opinionated commit message linter written in Rust. It's a flexible tool to enforce commit message standards, ensuring consistent and automation-friendly commit messages.
+**git-sumi** is the non-opinionated commit message linter written in Rust.
{% wide_container() %}
@@ -17,23 +20,14 @@ canonical_url = "https://osc.garden/projects/git-sumi/"
#### [GitHub](https://github.com/welpo/git-sumi) • [Website](https://sumi.rs/) • [Documentation](https://sumi.rs/docs/) {.centered-text}
-## Main Features
+## Main features
-- **Customizable rules**: Tailor git-sumi to meet the specific requirements of each project. Configure rules to enforce Conventional Commits, length limits, Gitmoji usage, and more through a simple TOML configuration file.
+- **Customizable rules**: Configure rules to enforce [Conventional Commits](https://www.conventionalcommits.org/), length limits, [Gitmoji](https://gitmoji.dev/) usage, and [more](https://sumi.rs/docs/rules).
- **Clear error reporting**: Provides detailed error reporting, making fixing commit messages straightforward and educational.
-- **Seamless integration**: As a single binary, git-sumi integrates easily into your existing workflow with minimal setup. You can even use the [GitHub Action](https://github.com/welpo/git-sumi-action) to lint your commits (or PR titles) without installing anything locally.
+- **Seamless integration**: As a single binary, git-sumi easily integrates into your existing workflow with minimal setup. You can even use the [GitHub Action](https://github.com/welpo/git-sumi-action) to lint your commits (or PR titles) without installing anything.
-## Development Best Practices
+## Development best practices
-- **Comprehensive code coverage**: Over 95% line coverage and thorough feature coverage ensures that git-sumi is reliable, robust, and ready for use.
-- **Continuous [integration](https://github.com/welpo/git-sumi/blob/main/.github/workflows/ci.yml) and [deployment](https://github.com/welpo/git-sumi/blob/main/.github/workflows/release.yml)**: Automated workflows for testing, releasing, and deploying, ensuring that each version of git-sumi is thoroughly tested and ready for use.
-- **Community contributions**: Encourages contributions from the community, including feature requests, bug reports, and enhancements, with a welcoming approach to both newcomers and seasoned developers.
-- **Documentation**: [Comprehensive documentation](https://sumi.rs/docs/) to help users get started with git-sumi and understand its features and capabilities.
-
-## Start Enhancing Your Commit Practices Today
-
-Take the first step towards transforming your commit practices. git-sumi's blend of flexibility, detailed feedback, and ease of integration makes it the perfect choice for teams and individuals looking to improve their Git commit messages.
-
-[Discover **git-sumi**](https://sumi.rs/) and make it a part of your development toolkit.
-
-[](https://sumi.rs/)
+- **Comprehensive code coverage**: 98% test coverage; linting needs to be reliable.
+- **Continuous [integration](https://github.com/welpo/git-sumi/blob/main/.github/workflows/ci.yml) and [deployment](https://github.com/welpo/git-sumi/blob/main/.github/workflows/release.yml)**: Automated workflows for testing and releasing cross-compiled binaries to crates.io, PyPI and GitHub releases.
+- **Documentation**: [Comprehensive documentation](https://sumi.rs/docs/) with a [quick start guide](https://sumi.rs/docs/), [examples](https://sumi.rs/docs/examples), [rules](https://sumi.rs/docs/rules), [integration](https://sumi.rs/docs/integration), [FAQ](https://sumi.rs/docs/faq)…
diff --git a/content/projects/iine/iine_logo.webp b/content/projects/iine/iine_logo.webp
new file mode 100644
index 0000000..f6681dd
Binary files /dev/null and b/content/projects/iine/iine_logo.webp differ
diff --git a/content/projects/iine/index.ca.md b/content/projects/iine/index.ca.md
new file mode 100644
index 0000000..28b7f90
--- /dev/null
+++ b/content/projects/iine/index.ca.md
@@ -0,0 +1,52 @@
++++
+title = "iine"
+description = "Botons d'apreciació centrats en la privadesa i accessibles per a la web petita/independent."
+weight = 15
+
+[taxonomies]
+tags = ["web", "JavaScript", "privadesa", "backend"]
+
+[extra]
+local_image = "projects/iine/iine_logo.webp"
+social_media_card = "social_cards/projects_iine.jpg"
+canonical_url = "https://osc.garden/projects/iine/"
++++
+
+Botons d'apreciació per al teu blog, jardí digital, portafoli… No cal compte. Sense seguiment.
+
+#### [GitHub](https://github.com/welpo/iine) • [Web](https://iine.to) {.centered-text}
+
+## Característiques
+
+- Sense marques de temps, sense IPs, sense seguiment
+- ~3KB de JavaScript vanilla
+- Funciona sense JavaScript
+- Diverses icones: cor, polze amunt, vot positiu, o qualsevol emoji
+- Construït per a la web petita/independent
+- Gratuït per sempre
+- Accessible per disseny
+- Auto-hostejable
+
+## Inici ràpid
+
+Afegeix botons d'apreciació al teu lloc amb dues línies. Carrega l'script:
+
+```html
+
+```
+
+Afegeix el botó:
+
+```html
+
+```
+
+Fet. Els teus visitants ja poden mostrar apreciació anònima pel teu contingut.
+
+## Per què iine?
+
+Volia afegir botons de m'agrada/felicitacions/alegria/apreciació al [meu blog](https://osc.garden) sense registrar-me a res, i assegurant-me que els meus visitants no fossin rastrejats.
+
+Esperant que altres ho trobin útil, vaig fer el servei públic (codi obert) i gratuït per sempre (almenys fins que doni suport a més de 100k llocs web).
+
+Construït per a blogs, portafolis, jardins digitals, i qualsevol que cregui que la web hauria de ser més humana.
diff --git a/content/projects/iine/index.es.md b/content/projects/iine/index.es.md
new file mode 100644
index 0000000..5396832
--- /dev/null
+++ b/content/projects/iine/index.es.md
@@ -0,0 +1,52 @@
++++
+title = "iine"
+description = "Botones de apreciación centrados en la privacidad y accesibles para la web pequeña."
+weight = 15
+
+[taxonomies]
+tags = ["web", "JavaScript", "privacidad", "backend"]
+
+[extra]
+local_image = "projects/iine/iine_logo.webp"
+social_media_card = "social_cards/projects_iine.jpg"
+canonical_url = "https://osc.garden/projects/iine/"
++++
+
+Botones de apreciación para tu blog, jardín digital, portafolio… Sin cuenta requerida. Sin seguimiento.
+
+#### [GitHub](https://github.com/welpo/iine) • [Sitio web](https://iine.to) {.centered-text}
+
+## Características
+
+- Sin marcas de tiempo, sin IPs, sin seguimiento
+- ~3KB de JavaScript vanilla
+- Funciona sin JavaScript
+- Varios iconos: corazón, pulgar arriba, voto positivo, o cualquier emoji
+- Construido para la web pequeña/independiente
+- Gratis para siempre
+- Accesible por diseño
+- Auto-hosteable
+
+## Inicio rápido
+
+Añade botones de apreciación a tu sitio con dos líneas. Carga el script:
+
+```html
+
+```
+
+Añade el botón:
+
+```html
+
+```
+
+Listo. Tus visitantes ya pueden mostrar apreciación anónima por tu contenido.
+
+## ¿Por qué iine?
+
+Quería añadir botones de me gusta/felicitaciones/alegría/apreciación a [mi blog](https://osc.garden) sin registrarme en nada, y asegurándome de que mis visitantes no fueran rastreados.
+
+Esperando que otros lo encuentren útil, hice el servicio público (código abierto) y gratis para siempre (al menos hasta que soporte más de 100k sitios web).
+
+Construido para blogs, portafolios, jardines digitales, y cualquiera que crea que la web debería ser más humana.
diff --git a/content/projects/iine/index.md b/content/projects/iine/index.md
new file mode 100644
index 0000000..557310f
--- /dev/null
+++ b/content/projects/iine/index.md
@@ -0,0 +1,52 @@
++++
+title = "iine"
+description = "Privacy-focused & accessible like buttons for the small web."
+weight = 15
+
+[taxonomies]
+tags = ["web", "JavaScript", "privacy", "backend"]
+
+[extra]
+local_image = "projects/iine/iine_logo.webp"
+social_media_card = "social_cards/projects_iine.jpg"
+canonical_url = "https://osc.garden/projects/iine/"
++++
+
+Appreciation buttons for your blog, digital garden, portfolio… No account required. No tracking.
+
+#### [GitHub](https://github.com/welpo/iine) • [Website](https://iine.to) {.centered-text}
+
+## Features
+
+- No timestamps, no IPs, no tracking
+- ~3KB of vanilla JavaScript
+- Works without JavaScript
+- Various icons: heart, thumbs up, upvote, or any emoji
+- Built for the small/indie web
+- Free forever
+- Accessible by design
+- Self-hostable
+
+## Quick start
+
+Add appreciation buttons to your site with two lines. Load the script:
+
+```html
+
+```
+
+Add the button:
+
+```html
+
+```
+
+Done. Your visitors can now show anonymous appreciation for your content.
+
+## Why iine?
+
+I wanted to add like/kudos/cheers/appreciation buttons to [my blog](https://osc.garden) without signing up for anything, and making sure my visitors weren't tracked.
+
+Hoping others find it useful, I made the service public (open source) and free forever (at least until it supports over 100k websites).
+
+Built for blogs, portfolios, digital gardens, and anyone who believes the web should be more human.
diff --git a/content/projects/iine/social_cards/projects_iine.jpg b/content/projects/iine/social_cards/projects_iine.jpg
new file mode 100644
index 0000000..bdb1d9a
Binary files /dev/null and b/content/projects/iine/social_cards/projects_iine.jpg differ
diff --git a/content/projects/nani/index.ca.md b/content/projects/nani/index.ca.md
index 5bf2375..abd9663 100644
--- a/content/projects/nani/index.ca.md
+++ b/content/projects/nani/index.ca.md
@@ -3,6 +3,9 @@ title = "nani"
description = "Script Bash per crear URLs públiques a partir d'arxius o text en servidors remots."
weight = 50
+[taxonomies]
+tags = ["bash", "CLI"]
+
[extra]
local_image = "projects/nani/nani_logo.webp"
canonical_url = "https://osc.garden/ca/projects/tabi/"
diff --git a/content/projects/nani/index.es.md b/content/projects/nani/index.es.md
index edf773a..0b338aa 100644
--- a/content/projects/nani/index.es.md
+++ b/content/projects/nani/index.es.md
@@ -3,6 +3,9 @@ title = "nani"
description = "Script Bash para crear URLs públicas a partir de archivos o texto en servidores remotos."
weight = 50
+[taxonomies]
+tags = ["bash", "CLI"]
+
[extra]
local_image = "projects/nani/nani_logo.webp"
canonical_url = "https://osc.garden/es/projects/tabi/"
diff --git a/content/projects/nani/index.md b/content/projects/nani/index.md
index cab154a..4372312 100644
--- a/content/projects/nani/index.md
+++ b/content/projects/nani/index.md
@@ -3,6 +3,9 @@ title = "nani"
description = "Bash script to create public URLs from files or text on remote servers."
weight = 50
+[taxonomies]
+tags = ["bash", "CLI"]
+
[extra]
local_image = "projects/nani/nani_logo.webp"
canonical_url = "https://osc.garden/projects/tabi/"
diff --git a/content/projects/nani/nani_logo.webp b/content/projects/nani/nani_logo.webp
index 2f301b1..08d7175 100644
Binary files a/content/projects/nani/nani_logo.webp and b/content/projects/nani/nani_logo.webp differ
diff --git a/content/projects/nemui/index.ca.md b/content/projects/nemui/index.ca.md
new file mode 100644
index 0000000..5b2e61f
--- /dev/null
+++ b/content/projects/nemui/index.ca.md
@@ -0,0 +1,35 @@
++++
+title = "nemui"
+description = "Ajusta gradualment el teu horari de son amb suport per horari d'estiu."
+weight = 22
+
+[taxonomies]
+tags = ["son", "interactiu", "web app", "web", "JavaScript"]
+
+[extra]
+local_image = "projects/nemui/nemui_logo.webp"
+canonical_url = "https://osc.garden/ca/projects/tabi/"
+social_media_card = "social_cards/projects_nemui.jpg"
++++
+
+nemui és una aplicació web que t'ajuda a fer una transició suau a un nou horari de son. El seu nom ve de les paraules japoneses per dormir (眠nemu ) i transició (移i ), que es llegeix com 眠いnemui (somnolent).
+
+#### [Prova-la ara](https://nemui.osc.garden) • [GitHub](https://github.com/welpo/nemui) • [Blog](https://osc.garden/ca/blog/nemui-sleep-schedule-planner/) {.centered-text}
+
+## Característiques
+
+- Interfície interactiva de rellotge inspirada en Apple
+- Ajust gradual de l'horari de son basat en la ciència del son
+- Suport complet per a l'horari d'estiu (DST)
+- Exportació a calendari (.ics) amb recordatoris per anar a dormir
+- Emmagatzematge local per seguir el teu progrés
+- Accessible: compatible amb navegació per teclat i lectors de pantalla
+
+## Per què nemui?
+
+A diferència dels canvis bruscos que poden alterar el teu ritme circadià, nemui t'ajuda a ajustar el teu horari de son de manera gradual. És especialment útil per a:
+
+- Adaptar-te a nous horaris de feina/estudi
+- Preparar-te per a canvis de zona horària
+- Fer una transició suau durant els canvis d'hora
+- Corregir un horari de son desajustat
diff --git a/content/projects/nemui/index.es.md b/content/projects/nemui/index.es.md
new file mode 100644
index 0000000..6365ad0
--- /dev/null
+++ b/content/projects/nemui/index.es.md
@@ -0,0 +1,35 @@
++++
+title = "nemui"
+description = "Ajusta gradualmente tu horario de sueño con soporte para horario de verano."
+weight = 32
+
+[taxonomies]
+tags = ["sueño", "interactivo", "web app", "web", "JavaScript"]
+
+[extra]
+local_image = "projects/nemui/nemui_logo.webp"
+canonical_url = "https://osc.garden/es/projects/tabi/"
+social_media_card = "social_cards/projects_nemui.jpg"
++++
+
+nemui es una aplicación web que te ayuda a hacer una transición suave a un nuevo horario de sueño. Su nombre viene de las palabras japonesas para dormir (眠nemu ) y transición (移i ), que se lee como 眠いnemui (somnoliento).
+
+#### [Pruébala ahora](https://nemui.osc.garden) • [GitHub](https://github.com/welpo/nemui) • [Blog](https://osc.garden/es/blog/nemui-sleep-schedule-planner/) {.centered-text}
+
+## Características
+
+- Interfaz interactiva de reloj inspirada en Apple
+- Ajuste gradual del horario de sueño basado en la ciencia del sueño
+- Soporte completo para el horario de verano (DST)
+- Exportación a calendario (.ics) con recordatorios para dormir
+- Almacenamiento local para seguir tu progreso
+- Accesible: compatible con navegación por teclado y lectores de pantalla
+
+## ¿Por qué nemui?
+
+A diferencia de los cambios bruscos que pueden alterar tu ritmo circadiano, nemui te ayuda a ajustar tu horario de sueño de forma gradual. Es especialmente útil para:
+
+- Adaptarte a nuevos horarios de trabajo/estudio
+- Prepararte para cambios de zona horaria
+- Hacer una transición suave durante los cambios de hora
+- Corregir un horario de sueño desajustado
diff --git a/content/projects/nemui/index.md b/content/projects/nemui/index.md
new file mode 100644
index 0000000..f6347cd
--- /dev/null
+++ b/content/projects/nemui/index.md
@@ -0,0 +1,35 @@
++++
+title = "nemui"
+description = "Gradually adjust your sleep schedule with support for DST transitions."
+weight = 32
+
+[taxonomies]
+tags = ["sleep", "interactive", "web app", "web", "JavaScript"]
+
+[extra]
+local_image = "projects/nemui/nemui_logo.webp"
+canonical_url = "https://osc.garden/projects/tabi/"
+social_media_card = "social_cards/projects_nemui.jpg"
++++
+
+nemui is a web app that helps you smoothly transition to a new sleep schedule. Named after the Japanese words for sleep (眠nemu ) and transition (移i ), reading as 眠いnemui (sleepy).
+
+#### [Try it now](https://nemui.osc.garden) • [GitHub](https://github.com/welpo/nemui) • [Blog post](https://osc.garden/blog/nemui-sleep-schedule-planner/) {.centered-text}
+
+## Features
+
+- Interactive clock interface inspired by Apple
+- Gradual sleep schedule adjustment based on sleep science
+- Full Daylight Saving Time (DST) support
+- Calendar (.ics) export with bedtime reminders
+- Local storage for progress tracking
+- Accessible: supports keyboard navigation and screen readers
+
+## Why nemui?
+
+Unlike abrupt changes that can disrupt your circadian rhythm, nemui helps you adjust your sleep schedule gradually. It's particularly useful for:
+
+- Adapting to new work/study schedules
+- Preparing for timezone changes
+- Smoothly transitioning through DST changes
+- Fixing a misaligned sleep schedule
diff --git a/content/projects/nemui/nemui_logo.webp b/content/projects/nemui/nemui_logo.webp
new file mode 100644
index 0000000..454203f
Binary files /dev/null and b/content/projects/nemui/nemui_logo.webp differ
diff --git a/content/projects/nemui/social_cards/projects_nemui.jpg b/content/projects/nemui/social_cards/projects_nemui.jpg
new file mode 100644
index 0000000..d7b6ea0
Binary files /dev/null and b/content/projects/nemui/social_cards/projects_nemui.jpg differ
diff --git a/content/projects/social_cards/projects.jpg b/content/projects/projects.jpg
similarity index 100%
rename from content/projects/social_cards/projects.jpg
rename to content/projects/projects.jpg
diff --git a/content/projects/ramu/index.ca.md b/content/projects/ramu/index.ca.md
new file mode 100644
index 0000000..63ce50e
--- /dev/null
+++ b/content/projects/ramu/index.ca.md
@@ -0,0 +1,34 @@
++++
+title = "ramu"
+description = "Una aplicació web per practicar la lectura i comprensió auditiva de nombres en japonès."
+weight = 35
+
+[taxonomies]
+tags = ["Japonès", "interactiu", "web app", "web", "PWA", "JavaScript"]
+
+[extra]
+local_image = "projects/ramu/ramu_logo.webp"
+canonical_url = "https://osc.garden/ca/projects/ramu/"
+social_media_card = "social_cards/projects_ramu.jpg"
+iine_icon = '🐏'
++++
+
+ラra ムmu és una aplicació web progressiva per practicar la lectura i comprensió auditiva de nombres en japonès. El nom reflecteix el seu propòsit: aconseguir accès aleatori (RAM; memòria d'accés aleatori) als nombres, en contraposició a una memòria seqüencial (1, 2, 3…).
+
+{% wide_container() %}
+
+{% end %}
+
+#### [Prova-la ara](https://ramu.osc.garden) • [GitHub](https://github.com/welpo/ramu) • [Article](https://osc.garden/ca/blog/ramu-japanese-numbers-practice-web-app/) {.centered-text}
+
+## Característiques
+
+- Pràctica amb nombres aràbics (123…) i japonesos (一二三…)
+- Dos modes de pràctica: lectura i comprensió auditiva
+- Rangs numèrics configurables (des de 0 fins a més de 100.000.000)
+- Pràctica de comptadors (個、本、匹…)
+- Funciona sense connexió com a aplicació web progressiva
+- Control complet per teclat (espai /→ per següent, esc per aturar)
+- Compatible amb lectors de pantalla per a la pràctica amb nombres aràbics
+
+[](https://ramu.osc.garden)
diff --git a/content/projects/ramu/index.es.md b/content/projects/ramu/index.es.md
new file mode 100644
index 0000000..9e0311e
--- /dev/null
+++ b/content/projects/ramu/index.es.md
@@ -0,0 +1,34 @@
++++
+title = "ramu"
+description = "Una aplicación web para practicar la lectura y comprensión auditiva de números en japonés."
+weight = 35
+
+[taxonomies]
+tags = ["Japonés", "interactivo", "web app", "web", "PWA", "JavaScript"]
+
+[extra]
+local_image = "projects/ramu/ramu_logo.webp"
+canonical_url = "https://osc.garden/es/projects/ramu/"
+social_media_card = "social_cards/projects_ramu.jpg"
+iine_icon = '🐏'
++++
+
+ラra ムmu es una aplicación web progresiva para practicar la lectura y comprensión auditiva de números en japonés. El nombre refleja su propósito: lograr acceso aleatorio (RAM; memoria de acceso aleatorio) a los números, en contraposición a una memoria secuencial (1, 2, 3…).
+
+{% wide_container() %}
+
+{% end %}
+
+#### [Pruébala ahora](https://ramu.osc.garden) • [GitHub](https://github.com/welpo/ramu) • [Artículo](https://osc.garden/es/blog/ramu-japanese-numbers-practice-web-app/) {.centered-text}
+
+## Características
+
+- Práctica con números arábigos (123…) y japoneses (一二三…)
+- Dos modos de práctica: lectura y comprensión auditiva
+- Rangos numéricos configurables (desde 0 hasta más de 100.000.000)
+- Práctica de contadores (個、本、匹…)
+- Funciona sin conexión como aplicación web progresiva
+- Control por teclado (espacio /→ para siguiente, esc para detener)
+- Compatible con lectores de pantalla para la práctica con números arábigos
+
+[](https://ramu.osc.garden)
diff --git a/content/projects/ramu/index.md b/content/projects/ramu/index.md
new file mode 100644
index 0000000..8016baf
--- /dev/null
+++ b/content/projects/ramu/index.md
@@ -0,0 +1,34 @@
++++
+title = "ramu"
+description = "A web app to practice reading and listening to Japanese numbers."
+weight = 35
+
+[taxonomies]
+tags = ["Japanese", "interactive", "web app", "web", "PWA", "JavaScript"]
+
+[extra]
+local_image = "projects/ramu/ramu_logo.webp"
+canonical_url = "https://osc.garden/projects/ramu/"
+social_media_card = "social_cards/projects_ramu.jpg"
+iine_icon = '🐏'
++++
+
+ラra ムmu is a Progressive Web App to practice reading and listening to Japanese numbers. The name reflects its purpose: achieving RAM (Random Access Memory) to numbers, as opposed to sequential memory (1, 2, 3…).
+
+{% wide_container() %}
+
+{% end %}
+
+#### [Try it now](https://ramu.osc.garden) • [GitHub](https://github.com/welpo/ramu) • [Blog post](https://osc.garden/blog/ramu-japanese-numbers-practice-web-app/) {.centered-text}
+
+## Features
+
+- Practice with both Arabic (123…) and Japanese (一二三…) numerals
+- Two practice modes: reading and listening comprehension
+- Configurable number ranges (from 0 to over 100,000,000)
+- Counter word practice (個、本、匹…)
+- Works offline as a Progressive Web App
+- Full keyboard control (space /→ for next, esc to stop)
+- Screen reader friendly for Arabic numeral practice
+
+[](https://ramu.osc.garden)
diff --git a/content/projects/ramu/media/ラム_demo.mp4 b/content/projects/ramu/media/ラム_demo.mp4
new file mode 100644
index 0000000..0a96a11
Binary files /dev/null and b/content/projects/ramu/media/ラム_demo.mp4 differ
diff --git a/content/projects/ramu/ramu_logo.webp b/content/projects/ramu/ramu_logo.webp
new file mode 100644
index 0000000..1eee491
Binary files /dev/null and b/content/projects/ramu/ramu_logo.webp differ
diff --git a/content/projects/ramu/social_cards/projects_ramu.jpg b/content/projects/ramu/social_cards/projects_ramu.jpg
new file mode 100644
index 0000000..09757fd
Binary files /dev/null and b/content/projects/ramu/social_cards/projects_ramu.jpg differ
diff --git a/content/projects/shuku/index.ca.md b/content/projects/shuku/index.ca.md
new file mode 100644
index 0000000..78230a0
--- /dev/null
+++ b/content/projects/shuku/index.ca.md
@@ -0,0 +1,48 @@
++++
+title = "shuku"
+description = "Condensa pel·lícules i sèries per quedar-te només amb el diàleg. Dissenyat per aprendre idiomes."
+weight = 20
+
+[taxonomies]
+tags = ["Python", "media", "linguistics", "CLI"]
+
+[extra]
+local_image = "projects/shuku/shuku_logo.webp"
+social_media_card = "social_cards/projects_shuku.jpg"
+canonical_url = "https://osc.garden/ca/projects/shuku/"
++++
+
+**shuku** (縮 しゅく 小 しょう : «minificació») crea versions condensades de pel·lícules i sèries conservant només els diàlegs.
+
+
+
+#### [GitHub](https://github.com/welpo/shuku) • [Blog](https://osc.garden/ca/blog/shuku-condensed-media-language-learning/) • [Documentació](https://github.com/welpo/shuku#readme) • [PyPI](https://pypi.org/project/shuku/) {.centered-text}
+
+## Característiques
+
+### Gestió intel·ligent de continguts
+
+- Detecció i correspondència automàtica de subtítols amb cerca difusa (fuzzy matching)
+- Selecció intel·ligent de pistes d'àudio/subtítols
+- Extracció de metadades (títol, temporada, número d'episodi)
+
+### Output flexible
+
+- Àudio condensat (MP3, FLAC, AAC, Opus…)
+- Vídeo condensat
+- Subtítols sincronitzats (SRT, ASS, o LRC per a apps tipus karaoke)
+
+### Alta personalització
+
+- Qualitat i còdecs d'àudio/vídeo configurables
+- Ajust de temps de subtítols i farciment
+- Filtra subtítols (efectes de so, lletres, capítols específics)
+- Suport per a arguments personalitzats de FFmpeg
+
+### Experiència de l'usuari
+
+- Multiplataforma: GNU+Linux, macOS i Windows
+- Logging detallat amb indicadors de progrés
+- Suport per a processament per lots
+
+[](https://github.com/welpo/shuku)
diff --git a/content/projects/shuku/index.es.md b/content/projects/shuku/index.es.md
new file mode 100644
index 0000000..dd8d79b
--- /dev/null
+++ b/content/projects/shuku/index.es.md
@@ -0,0 +1,48 @@
++++
+title = "shuku"
+description = "Condensa películas y series para quedarte solo con el diálogo. Diseñado para aprender idiomas."
+weight = 20
+
+[taxonomies]
+tags = ["Python", "media", "linguistics", "CLI"]
+
+[extra]
+local_image = "projects/shuku/shuku_logo.webp"
+social_media_card = "social_cards/projects_shuku.jpg"
+canonical_url = "https://osc.garden/es/projects/shuku/"
++++
+
+**shuku** (縮 しゅく 小 しょう : «minificación») crea versiones condensadas de películas y series conservando solo los diálogos.
+
+
+
+#### [GitHub](https://github.com/welpo/shuku) • [Blog](https://osc.garden/es/blog/shuku-condensed-media-language-learning/) • [Documentación](https://github.com/welpo/shuku#readme) • [PyPI](https://pypi.org/project/shuku/) {.centered-text}
+
+## Características
+
+### Manejo inteligente de medios
+
+- Detección y correspondencia automática de subtítulos con búsqueda difusa (fuzzy matching)
+- Selección inteligente de pistas de audio/subtítulos
+- Extracción de metadatos (título, temporada, número de episodio)
+
+### Output flexible
+
+- Audio condensado (MP3, FLAC, AAC, Opus…)
+- Video condensado
+- Subtítulos sincronizados (SRT, ASS, o LRC para apps tipo karaoke)
+
+### Alta personalización
+
+- Calidad y códecs de audio/video configurables
+- Ajuste de tiempo de subtítulos y relleno
+- Filtra subtítulos (efectos de sonido, letras, capítulos específicos)
+- Soporte para argumentos personalizados de FFmpeg
+
+### Experiencia del usuario
+
+- Multiplataforma: GNU+Linux, macOS y Windows
+- Logging detallado con indicadores de progreso
+- Soporte para procesamiento por lotes
+
+[](https://github.com/welpo/shuku)
diff --git a/content/projects/shuku/index.md b/content/projects/shuku/index.md
new file mode 100644
index 0000000..1c188fe
--- /dev/null
+++ b/content/projects/shuku/index.md
@@ -0,0 +1,56 @@
++++
+title = "shuku"
+description = "Shrink media to keep only the dialogue. For immersion language learning."
+weight = 20
+
+[taxonomies]
+tags = ["Python", "media", "linguistics", "CLI"]
+
+[extra]
+local_image = "projects/shuku/shuku_logo.webp"
+social_media_card = "social_cards/projects_shuku.jpg"
+canonical_url = "https://osc.garden/projects/shuku/"
++++
+
+**shuku** (縮 しゅく 小 しょう : "minification") creates condensed versions of films and TV shows by keeping only the dialogue.
+
+
+
+#### [GitHub](https://github.com/welpo/shuku) • [Blog post](https://osc.garden/blog/shuku-condensed-media-language-learning/) • [Documentation](https://github.com/welpo/shuku#readme) • [PyPI](https://pypi.org/project/shuku/) {.centered-text}
+
+## Features
+
+### Smart media handling
+
+- Automatic subtitle detection and matching with fuzzy search
+- Intelligent audio/subtitle track selection
+- Metadata extraction (title, season, episode number)
+
+### Flexible output
+
+- Condensed audio (MP3, FLAC, AAC, Opus...)
+- Condensed video
+- Synchronized subtitles (including LRC for karaoke-style review)
+- Clean filenames in output
+
+### High customization
+
+- Configurable audio/video quality and codecs
+- Subtitle timing adjustment and padding
+- Skip unwanted content (sound effects, lyrics, specific chapters)
+- Custom FFmpeg arguments support
+
+### User experience
+
+- Cross-platform: GNU+Linux, macOS, and Windows
+- Detailed logging with progress indicators
+- Batch processing support
+
+## Development best practices
+
+- Comprehensive testing: 100% code coverage
+- Clean code: Type-hinted Python with clear responsibilities
+- Continuous Integration/Deployment
+- Comprehensive documentation
+
+[](https://github.com/welpo/shuku)
diff --git a/content/projects/shuku/shuku_logo.webp b/content/projects/shuku/shuku_logo.webp
new file mode 100644
index 0000000..900a598
Binary files /dev/null and b/content/projects/shuku/shuku_logo.webp differ
diff --git a/content/projects/shuku/social_cards/projects_shuku.jpg b/content/projects/shuku/social_cards/projects_shuku.jpg
new file mode 100644
index 0000000..24d2bed
Binary files /dev/null and b/content/projects/shuku/social_cards/projects_shuku.jpg differ
diff --git a/content/projects/streaming-royalties-calculator/index.ca.md b/content/projects/streaming-royalties-calculator/index.ca.md
index 2c3ccc8..bfa69f8 100644
--- a/content/projects/streaming-royalties-calculator/index.ca.md
+++ b/content/projects/streaming-royalties-calculator/index.ca.md
@@ -3,6 +3,9 @@ title = "Calculadora de royalties de streaming"
description = "Una eina per calcular els royalties de streaming per a músics."
weight = 45
+[taxonomies]
+tags = ["música", "interactiu", "web app", "web", "JavaScript", "anàlisi de dades"]
+
[extra]
local_image = "projects/streaming-royalties-calculator/streaming-royalties-calculator_logo.webp"
canonical_url = "https://osc.garden/ca/projects/streaming-royalties-calculator/"
diff --git a/content/projects/streaming-royalties-calculator/index.es.md b/content/projects/streaming-royalties-calculator/index.es.md
index ae4d9f7..a9f598f 100644
--- a/content/projects/streaming-royalties-calculator/index.es.md
+++ b/content/projects/streaming-royalties-calculator/index.es.md
@@ -3,6 +3,9 @@ title = "Calculadora de royalties de streaming"
description = "Una herramienta para calcular los royalties de streaming para músicos."
weight = 45
+[taxonomies]
+tags = ["música", "interactivo", "web app", "web", "JavaScript", "análisis de datos"]
+
[extra]
local_image = "projects/streaming-royalties-calculator/streaming-royalties-calculator_logo.webp"
canonical_url = "https://osc.garden/es/projects/streaming-royalties-calculator/"
diff --git a/content/projects/streaming-royalties-calculator/index.md b/content/projects/streaming-royalties-calculator/index.md
index 8aac428..c531834 100644
--- a/content/projects/streaming-royalties-calculator/index.md
+++ b/content/projects/streaming-royalties-calculator/index.md
@@ -3,6 +3,9 @@ title = "Streaming Royalties Calculator"
description = "A tool to calculate streaming royalties for musicians."
weight = 45
+[taxonomies]
+tags = ["music", "interactive", "web app", "web", "JavaScript", "data analysis"]
+
[extra]
local_image = "projects/streaming-royalties-calculator/streaming-royalties-calculator_logo.webp"
canonical_url = "https://osc.garden/projects/streaming-royalties-calculator/"
diff --git a/content/projects/streaming-royalties-calculator/streaming-royalties-calculator_logo.webp b/content/projects/streaming-royalties-calculator/streaming-royalties-calculator_logo.webp
index 06754bf..19c8fe4 100644
Binary files a/content/projects/streaming-royalties-calculator/streaming-royalties-calculator_logo.webp and b/content/projects/streaming-royalties-calculator/streaming-royalties-calculator_logo.webp differ
diff --git a/content/projects/tabi/index.ar.md b/content/projects/tabi/index.ar.md
new file mode 100644
index 0000000..02abea0
--- /dev/null
+++ b/content/projects/tabi/index.ar.md
@@ -0,0 +1,47 @@
++++
+title = "تابي"
+description = "سمة زولا عصرية غنية بالمميزات مع دعم متميز لتعدد اللغات"
+weight = 40
+
+[taxonomies]
+tags = ["ويب", "جافا سكريبت"]
+
+[extra]
+local_image = "projects/tabi/tabi.webp"
++++
+
+[**تابي**](https://github.com/welpo/tabi) هي سمة عصرية غنية بالمميزات لـ[Zola](https://www.getzola.org/)، منشئ مواقع ثابتة سريع.
+
+{{ full_width_image(src="https://cdn.jsdelivr.net/gh/welpo/tabi@main/light_dark_screenshot.png", alt="تابي في الوضعين الفاتح والداكن") }}
+
+#### [عرض على GitHub](https://github.com/welpo/tabi) • [عرض توضيحي وتوثيق](https://welpo.github.io/tabi/) {.centered-text}
+
+## المميزات
+
+- دعم كامل [للغة العربية والكتابة من اليمين إلى اليسار](https://welpo.github.io/tabi/blog/faq-languages/#how-do-i-set-a-default-language-for-my-site)
+- [دعم للسلاسل](https://welpo.github.io/tabi/blog/series/) لإنشاء محتوى متسلسل مثل الدروس والدورات
+- سمتان داكنة وفاتحة، مع التبديل التلقائي حسب إعدادات النظام
+- [دعم التعليقات](https://welpo.github.io/tabi/blog/comments/) باستخدام giscus أو utterances أو Hyvor Talk أو Isso
+- [دعم KaTeX](https://katex.org/) للمعادلات الرياضية
+- [دعم Indieweb](https://indieweb.org/) مع microformats وh-card وwebmentions
+- [دعم Mermaid](https://welpo.github.io/tabi/blog/shortcodes/#mermaid-diagrams) لإنشاء المخططات
+- [بحث محلي](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#search) متعدد اللغات
+- تصميم متجاوب يعمل على جميع الأجهزة
+- [صفحة مشاريع](https://welpo.github.io/tabi/projects/) و[أرشيف](https://welpo.github.io/tabi/archive/)
+
+## ممارسات التطوير
+
+- **[الالتزامات التقليدية](https://www.conventionalcommits.org) و[Gitmoji](https://gitmoji.dev/)**: تتبع رسائل الالتزام تنسيقات موحدة لتحسين القراءة
+- **تتبع المشكلات**: لكل خطأ أو ميزة جديدة تذكرة مخصصة، مرتبطة بأي التزامات برمجية وطلبات سحب ذات صلة
+- **تعليقات شاملة**: يتم توثيق التذاكر بالصور ومقاطع الفيديو والأوصاف التفصيلية لتسهيل التواصل الفعال وحل المشكلات
+- **الإحالات المرجعية**: نربط جميع التذاكر بالتزامات الشفرة وطلبات السحب أو المشكلات ذات الصلة للتتبع الكامل
+
+## تطور المشروع
+
+تم تصميم **تابي** في الأصل لموقعي الشخصي، [osc.garden](https://osc.garden). على الرغم من أصولها للاستخدام الشخصي، تم تنفيذ أفضل الممارسات منذ البداية لضمان الجودة وقابلية الصيانة. ومنذ ذلك الحين نمت السمة لتجذب مجتمعًا نشطًا من المساهمين على GitHub.
+
+## ابدأ رحلة الكتابة مع تابي
+
+لديك شيء تريد قوله. ربما عن تجربتك في تعلم لغة جديدة، أو عن رحلتك في استكشاف [فن الفلامنكو](https://en.wikipedia.org/wiki/Palo_(flamenco))، أو عن كيف نجحت في حل مشكلة برمجية في مشروع مفتوح المصدر.
+
+**تابي** توفر الأساس المثالي لمساحة كتابتك، مما يتيح لك التركيز على كلماتك بينما يهتم Zola وتابي بالجانب التقني. ادخل عالم التدوين مع نظام يجعل كل تدوينة متعة في الكتابة والقراءة. صوتك له قيمة—شاركه مع العالم.
diff --git a/content/projects/tabi/index.ca.md b/content/projects/tabi/index.ca.md
index 4a47865..0293403 100644
--- a/content/projects/tabi/index.ca.md
+++ b/content/projects/tabi/index.ca.md
@@ -1,17 +1,21 @@
+++
title = "tabi"
description = "Un tema de Zola ràpid, lleuger i modern amb suport multilingüe."
-weight = 30
+weight = 40
+
+[taxonomies]
+tags = ["web", "JavaScript"]
[extra]
local_image = "projects/tabi/tabi.webp"
canonical_url = "https://osc.garden/ca/projects/tabi/"
social_media_card = "social_cards/ca_projects_tabi.jpg"
+iine_icon = '🌱'
+++
[**tabi**](https://github.com/welpo/tabi) és un tema modern i ric en funcionalitat per a [Zola](https://www.getzola.org/), un generador de llocs web estàtics molt ràpid.
-{{ full_width_image(src="light_dark_tabi.webp", alt="Modes clar i fosc de tabi") }}
+{{ full_width_image(src="https://cdn.jsdelivr.net/gh/welpo/tabi@main/light_dark_screenshot.png", alt="Modes clar i fosc de tabi") }}
#### [Veure a GitHub](https://github.com/welpo/tabi) • [Demo i documentación](https://welpo.github.io/tabi/ca/) {.centered-text}
@@ -19,9 +23,13 @@ social_media_card = "social_cards/ca_projects_tabi.jpg"
- [Estableix qualsevol idioma com a predeterminat](https://welpo.github.io/tabi/ca/blog/faq-languages/#com-estableixo-la-llengua-predeterminada-del-meu-lloc). Configura el teu lloc en xinès, espanyol, francès, hindi… o qualsevol [altre idioma compatible](https://welpo.github.io/tabi/ca/blog/faq-languages/#quines-llengues-admet-tabi). La interfície del tema es traduirà en conseqüència.
- [Integració amb repositoris remots](https://welpo.github.io/tabi/ca/blog/mastering-tabi-settings#integracio-amb-repositoris-git) a GitHub, GitLab, Gitea i Codeberg per a l'historial de commits i mostrar el codi font del lloc.
-- Temes clars i foscos. S'adapta a la configuració del sistema operatiu, amb un interruptor a la barra de navegació.
+- Tema clar i fosc. S'adapta a la configuració del sistema operatiu, amb un interruptor a la barra de navegació.
- [Suport multilingüe complet](https://welpo.github.io/tabi/ca/blog/faq-languages/#com-gestiona-tabi-el-suport-multilingue). Afegeix tants idiomes com vulguis i deixa que els teus usuaris triin amb el selector d'idioma.
+- [Suport per a sèries](https://welpo.github.io/tabi/ca/blog/series/) per crear contingut seqüencial com tutorials, cursos i històries multipart.
- Puntuació perfecta en Lighthouse (Rendiment, Accessibilitat, Millors Pràctiques i SEO).
+- Suport per a [Indieweb](https://indieweb.org/) amb microformats, suport per a [hcard](https://welpo.github.io/tabi/ca/blog/mastering-tabi-settings/#h-card-representativa) i [webmentions](https://welpo.github.io/tabi/ca/blog/mastering-tabi-settings/#webmentions).
+- Suport per a [diagrames de Mermaid](https://welpo.github.io/tabi/ca/blog/shortcodes/#diagrames-de-mermaid) per a crear diagrames i gràfics amb text.
+- Botons de «m'agrada» d'[iine](https://iine.to/) per mostrar apreciació anònima pel teu contingut.
- Ressaltat de sintaxi de codi amb colors basats en [Catppuccin](https://github.com/catppuccin/catppuccin) Frappé.
- Suport per a [comentaris usant giscus, utterances, Hyvor Talk o Isso](https://welpo.github.io/tabi/ca/blog/comments/).
- [Cerca local](https://welpo.github.io/tabi/ca/blog/mastering-tabi-settings/#cerca) amb una interfície accessible i multilingüe.
@@ -39,6 +47,7 @@ social_media_card = "social_cards/ca_projects_tabi.jpg"
- [Botons de navegació ràpida](https://welpo.github.io/tabi/ca/blog/mastering-tabi-settings/#botons-de-navegacio-rapida).
- [Shortcodes personalitzats](https://welpo.github.io/tabi/ca/blog/shortcodes/).
- [Skins personalitzables](https://welpo.github.io/tabi/ca/blog/customise-tabi/).
+- [Publicacions fixades](https://welpo.github.io/tabi/ca/blog/mastering-tabi-settings/#fixar-entrades).
- [Pàgina de projectes](https://welpo.github.io/tabi/ca/projects/).
- Disseny responsive.
- Suport de [KaTeX](https://katex.org/).
diff --git a/content/projects/tabi/index.es.md b/content/projects/tabi/index.es.md
index 054404e..d6725bb 100644
--- a/content/projects/tabi/index.es.md
+++ b/content/projects/tabi/index.es.md
@@ -1,17 +1,21 @@
+++
title = "tabi"
description = "Un tema de Zola rápido, ligero y moderno con soporte multilingüe."
-weight = 30
+weight = 40
+
+[taxonomies]
+tags = ["web", "JavaScript"]
[extra]
local_image = "projects/tabi/tabi.webp"
canonical_url = "https://osc.garden/es/projects/tabi/"
social_media_card = "social_cards/es_projects_tabi.jpg"
+iine_icon = '🌱'
+++
[**tabi**](https://github.com/welpo/tabi) es un tema moderno y rico en funcionalidad para [Zola](https://www.getzola.org/), un generador de sitios web estáticos muy rápido.
-{{ full_width_image(src="light_dark_tabi.webp", alt="Modos claro y oscuro de tabi") }}
+{{ full_width_image(src="https://cdn.jsdelivr.net/gh/welpo/tabi@main/light_dark_screenshot.png", alt="Modos claro y oscuro de tabi") }}
#### [Ver en GitHub](https://github.com/welpo/tabi) • [Demo y documentación](https://welpo.github.io/tabi/es/) {.centered-text}
@@ -20,8 +24,12 @@ social_media_card = "social_cards/es_projects_tabi.jpg"
- [Establece cualquier idioma como predeterminado](https://welpo.github.io/tabi/es/blog/faq-languages/#como-establezco-el-idioma-predeterminado-de-mi-sitio). Configura tu sitio en chino, español, francés, hindi… o cualquier [otro idioma compatible](https://welpo.github.io/tabi/es/blog/faq-languages/#que-idiomas-admite-tabi). La interfaz del tema se traducirá en consecuencia.
- [Integración con repositorios remotos](https://welpo.github.io/tabi/es/blog/mastering-tabi-settings/#integracion-con-repositorios-git) en GitHub, GitLab, Gitea y Codeberg para el historial de commits y mostrar el código fuente del sitio.
- [Soporte multilingüe completo](https://welpo.github.io/tabi/es/blog/faq-languages/#como-gestiona-tabi-el-soporte-multilingue). Añade tantos idiomas como desees y deja que tus usuarios elijan con un selector de idioma.
-- Temas claros y oscuros. Se adapta a la configuración del sistema operativo, con un interruptor en la barra de navegación.
+- Tema claro y oscuro. Se adapta a la configuración del sistema operativo, con un interruptor en la barra de navegación.
+- [Soporte para series](https://welpo.github.io/tabi/es/blog/series/) para crear contenido secuencial como tutoriales, cursos e historias en varias partes.
- Puntuación perfecta en Lighthouse (Rendimiento, Accesibilidad, Mejores Prácticas y SEO).
+- Soporte para [Indieweb](https://indieweb.org/) con microformatos, soporte para [hcard](https://welpo.github.io/tabi/es/blog/mastering-tabi-settings/#h-card-representativa) y [webmentions](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#webmentions).
+- Botones de «me gusta» de [iine](https://iine.to/) para mostrar aprecio anónimo por tu contenido.
+- Soporte para [diagramas de Mermaid](https://welpo.github.io/tabi/es/blog/shortcodes/#diagramas-de-mermaid) para crear diagramas y gráficos con texto.
- Resaltado de sintaxis de código con colores basados en [Catppuccin](https://github.com/catppuccin/catppuccin) Frappé.
- Soporte para [comentarios usando giscus, utterances, Hyvor Talk o Isso](https://welpo.github.io/tabi/es/blog/comments/).
- Todo el JavaScript se puede [deshabilitar completamente](https://welpo.github.io/tabi/es/blog/javascript/).
@@ -39,6 +47,7 @@ social_media_card = "social_cards/es_projects_tabi.jpg"
- [Tarjetas para redes sociales](https://welpo.github.io/tabi/es/blog/mastering-tabi-settings/#tarjetas-para-redes-sociales).
- [Shortcodes personalizados](https://welpo.github.io/tabi/es/blog/shortcodes/).
- [Skins personalizables](https://welpo.github.io/tabi/es/blog/customise-tabi/).
+- [Publicaciones fijadas](https://welpo.github.io/tabi/es/blog/mastering-tabi-settings/#fijar-publicaciones).
- [Página de proyectos](https://welpo.github.io/tabi/es/projects/).
- Diseño responsive.
- Soporte de [KaTeX](https://katex.org/).
diff --git a/content/projects/tabi/index.md b/content/projects/tabi/index.md
index 556fb44..1d13797 100644
--- a/content/projects/tabi/index.md
+++ b/content/projects/tabi/index.md
@@ -1,11 +1,15 @@
+++
title = "tabi"
description = "A feature-rich modern Zola theme with first-class multi-language support."
-weight = 30
+weight = 40
+
+[taxonomies]
+tags = ["web", "JavaScript"]
[extra]
local_image = "projects/tabi/tabi.webp"
social_media_card = "social_cards/projects_tabi.jpg"
+iine_icon = '🌱'
+++
[**tabi**](https://github.com/welpo/tabi) is a modern, feature-rich theme for [Zola](https://www.getzola.org/), a fast static site generator.
@@ -18,13 +22,18 @@ social_media_card = "social_cards/projects_tabi.jpg"
- [Set any language as default](https://welpo.github.io/tabi/blog/faq-languages/#how-do-i-set-a-default-language-for-my-site). Set your base site to Chinese, Spanish, French, Hindi… or any [other supported language](https://welpo.github.io/tabi/blog/faq-languages/#what-languages-does-tabi-support). The theme's interface will be translated accordingly.
- [Integration with remote repositories](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#git-repository-integration) on GitHub, GitLab, Gitea & Codeberg for commit history and showing the site source.
+- [Series support](https://welpo.github.io/tabi/blog/series/) for creating sequential content like tutorials, courses, and multi-part stories.
- Dark and light themes. Defaults to the OS setting, with a switcher in the navigation bar.
- Thorough documentation. See [Mastering tabi Settings: A Comprehensive Guide](https://welpo.github.io/tabi/blog/mastering-tabi-settings/).
- Perfect Lighthouse score (Performance, Accessibility, Best Practices and SEO).
- [Comprehensive multi-language support](https://welpo.github.io/tabi/blog/faq-languages/#how-does-tabi-handle-multilingual-support). Add as many languages as you wish.
- Support for [comments using giscus, utterances, Hyvor Talk, or Isso](https://welpo.github.io/tabi/blog/comments/).
+- [Indieweb](https://indieweb.org/) ready with microformats, [hcard](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#representative-h-card) and [webmentions](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#webmentions) support.
- Code syntax highlighting with colours based on [Catppuccin](https://github.com/catppuccin/catppuccin) Frappé.
+- [iine like buttons](https://iine.to/) for anonymous appreciation of your content.
+- [Mermaid support](https://welpo.github.io/tabi/blog/shortcodes/#mermaid-diagrams) to create diagrams and charts with text.
- [Local search](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#search) with an accessible, multi-lingual interface.
+- [Custom Twitter card](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#social-media-cards) and automatic Open Graph tags.
- [KaTeX](https://katex.org/) support for mathematical notation.
- [Stylized and human readable Atom feed](https://welpo.github.io/tabi/atom.xml).
- [Stylized and human readable sitemap](https://welpo.github.io/tabi/sitemap.xml).
@@ -38,11 +47,11 @@ social_media_card = "social_cards/projects_tabi.jpg"
- [Custom canonical URLs](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#canonical-url).
- [Customizable skins](https://welpo.github.io/tabi/blog/customise-tabi/).
- [Custom shortcodes](https://welpo.github.io/tabi/blog/shortcodes/).
-- [Footnote backlinks](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#footnote-backlinks).
- [Social media cards](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#social-media-cards).
- Responsive design.
- [Projects page](https://welpo.github.io/tabi/projects/).
- [Archive page](https://welpo.github.io/tabi/archive/).
+- [Pinned posts](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#pinning-posts).
- [Social links](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#social-media-icons).
- [Tags](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#tags).
diff --git a/content/projects/tabi/tabi.webp b/content/projects/tabi/tabi.webp
index 5b0f1d2..c05d2a7 100644
Binary files a/content/projects/tabi/tabi.webp and b/content/projects/tabi/tabi.webp differ
diff --git a/content/projects/zutsu/index.ca.md b/content/projects/zutsu/index.ca.md
new file mode 100644
index 0000000..cbe50bb
--- /dev/null
+++ b/content/projects/zutsu/index.ca.md
@@ -0,0 +1,51 @@
++++
+title = "zutsu"
+description = "Una aplicació minimalista i privada de gestió de tasques."
+weight = 32
+
+[taxonomies]
+tags = ["interactiu", "productivitat", "web app", "web", "JavaScript"]
+
+[extra]
+local_image = "projects/zutsu/zutsu_logo.webp"
+canonical_url = "https://osc.garden/ca/projects/zutsu/"
+social_media_card = "social_cards/projects_zutsu.jpg"
++++
+
+{% wide_container() %}
+
+{% end %}
+
+#### [Prova-la ara](https://zutsu.osc.garden) • [GitHub](https://github.com/welpo/zutsu) • [Article](https://osc.garden/ca/blog/zutsu-offline-task-planner-web-app/) {.centered-text}
+
+ずzu つtsu és una aplicació web de gestió de tasques dissenyada per ajudar-te a centrar-te en una tasca cada vegada. El nom ve de 一つhitotsu ずつzutsu , que significa «d'un en un» en 日本語japonès .
+
+## Per què?
+
+Volia substituir els esdeveniments de calendari inflexibles per a les sessions d'estudi per alguna cosa senzilla i adaptable. Sense aplicacions de tercers, sense sincronització al núvol, només un espai centrat en a la gestió de tasques.
+
+## Funcionalitats
+
+### Principals
+
+- Gestió de tasques amb possibilitat de reordenar-les arrossegant
+- Temporitzador amb durada personalitzable per tasca
+- Privada i offline —sense comptes, seguiment ni emmagatzematge al servidor
+- Importació/exportació de llistes de tasques (JSON)
+
+### Utilitats
+
+- Temporitzador Pomodoro
+- Calendari d'activitat (vista de 30 dies)
+- Comptador i cronòmetre
+- Espai per prendre notes
+- Selectors aleatoris
+
+### Qualitat de vida
+
+- Tema fosc i clar
+- Notificacions del navegador i so
+- Dreceres de teclat
+- Disseny responsive
+
+[](https://zutsu.osc.garden)
diff --git a/content/projects/zutsu/index.es.md b/content/projects/zutsu/index.es.md
new file mode 100644
index 0000000..003fa19
--- /dev/null
+++ b/content/projects/zutsu/index.es.md
@@ -0,0 +1,51 @@
++++
+title = "zutsu"
+description = "Una aplicación minimalista y privada de gestión de tareas."
+weight = 32
+
+[taxonomies]
+tags = ["interactivo", "productividad", "web app", "web", "JavaScript"]
+
+[extra]
+local_image = "projects/zutsu/zutsu_logo.webp"
+canonical_url = "https://osc.garden/es/projects/zutsu/"
+social_media_card = "social_cards/projects_zutsu.jpg"
++++
+
+{% wide_container() %}
+
+{% end %}
+
+#### [Pruébala ahora](https://zutsu.osc.garden) • [GitHub](https://github.com/welpo/zutsu) • [Artículo](https://osc.garden/es/blog/zutsu-offline-task-planner-web-app/) {.centered-text}
+
+ずzu つtsu es una aplicación web de gestión de tareas diseñada para ayudarte a centrarte en una tarea a la vez. El nombre viene de 一つhitotsu ずつzutsu , que significa «uno por uno» en 日本語japonés .
+
+## ¿Por qué?
+
+Quería sustituir la inflexibilidad del calendario para planificar las sesiones de estudio por algo simple y adaptable. Sin aplicaciones de terceros, sin sincronización en la nube —solo un espacio centrado en la gestión de tareas.
+
+## Funcionalidades
+
+### Principales
+
+- Gestión de tareas con posibilidad de reordenarlas arrastrando y soltando
+- Temporizador con duración personalizable por tarea
+- Privada y offline —sin cuentas, seguimiento ni almacenamiento en servidor
+- Importación/exportación de listas de tareas (JSON)
+
+### Utilidades
+
+- Temporizador Pomodoro
+- Calendario de actividad (vista de 30 días)
+- Contador y cronómetro
+- Espacio para tomar notas
+- Selectores aleatorios
+
+### Calidad de vida
+
+- Tema oscuro y claro
+- Notificaciones del navegador y sonido
+- Atajos de teclado
+- Diseño responsive
+
+[](https://zutsu.osc.garden)
diff --git a/content/projects/zutsu/index.md b/content/projects/zutsu/index.md
new file mode 100644
index 0000000..4205459
--- /dev/null
+++ b/content/projects/zutsu/index.md
@@ -0,0 +1,51 @@
++++
+title = "zutsu"
+description = "A private minimalist task management app."
+weight = 32
+
+[taxonomies]
+tags = ["interactive", "productivity", "web app", "web", "JavaScript"]
+
+[extra]
+local_image = "projects/zutsu/zutsu_logo.webp"
+canonical_url = "https://osc.garden/projects/zutsu/"
+social_media_card = "social_cards/projects_zutsu.jpg"
++++
+
+{% wide_container() %}
+
+{% end %}
+
+#### [Try it now](https://zutsu.osc.garden) • [GitHub](https://github.com/welpo/zutsu) • [Blog post](https://osc.garden/blog/zutsu-offline-task-planner-web-app/) {.centered-text}
+
+ずzu つtsu is a task management web app designed to help you focus on one task at a time. The name comes from 一つhitotsu ずつzutsu which means "one at a time" in 日本語Japanese .
+
+## Why?
+
+I wanted to replace inflexible calendar events for study sessions with something simple and adaptable. No third-party apps, no cloud sync —just a focused space for task management.
+
+## Features
+
+### Core
+
+- Task management with drag-and-drop reordering
+- Timer with customizable duration for each task
+- Private & offline—no accounts, tracking, or server storage
+- Import/export task lists (JSON)
+
+### Utilities
+
+- Pomodoro timer
+- Activity calendar (30-day view)
+- Counter & stopwatch
+- Note-taking space
+- Random choice makers
+
+### Quality of life
+
+- Dark and light theme support
+- Browser and sound notifications
+- Keyboard shortcuts
+- Responsive design
+
+[](https://zutsu.osc.garden)
diff --git a/content/projects/zutsu/social_cards/projects_zutsu.jpg b/content/projects/zutsu/social_cards/projects_zutsu.jpg
new file mode 100644
index 0000000..9373a35
Binary files /dev/null and b/content/projects/zutsu/social_cards/projects_zutsu.jpg differ
diff --git a/content/projects/zutsu/zutsu_logo.webp b/content/projects/zutsu/zutsu_logo.webp
new file mode 100644
index 0000000..8432797
Binary files /dev/null and b/content/projects/zutsu/zutsu_logo.webp differ
diff --git a/i18n/ar.toml b/i18n/ar.toml
index 250526e..afeeb28 100644
--- a/i18n/ar.toml
+++ b/i18n/ar.toml
@@ -30,6 +30,9 @@ few_results = "تم العثور على $NUMBER نتائج" # for 3 to 10 searc
many_results = "تم العثور على $NUMBER نتيجة" # 11 or more search results.
# Navigation.
+skip_to_content = "الإنتقال إلى المحتوى"
+pinned = "مثبتة"
+jump_to_posts = "الإنتقال إلى التدوينات"
read_more = "إقرأ المزيد"
one_posts = "تدوينة واحدة" #One blog post.
two_posts = "تدوينتين" #Two blog posts.
@@ -70,7 +73,7 @@ two_words = "كلمتين" # Two words.
few_words = "$NUMBER كلمات" # 3 to 10 words.
many_words = "$NUMBER كلمة" # 11 or more words.
-last_updated_on = "آخر تحديث كان في"
+last_updated_on = "تم التحديث في $DATE"
see_changes = "الإطلاع على التغييرات"
# Post body.
@@ -81,6 +84,9 @@ load_comments = "إظهار التعليقات"
copied = "تم النسخ!"
copy_code_to_clipboard = "نسخ الشِفرة إلى الحافظة"
+# iine appreciation button.
+like_this_post = "أعجبني"
+
# Footer: Powered by Zola and tabi.
powered_by = "مُشَغل بواسطة"
and = "و"
diff --git a/i18n/ca.toml b/i18n/ca.toml
index 1532574..5edd8cd 100644
--- a/i18n/ca.toml
+++ b/i18n/ca.toml
@@ -23,6 +23,9 @@ one_results = "$NUMBER resultat" # "1 result"
many_results = "$NUMBER resultats" # "3 results"
# Navigation.
+skip_to_content = "Saltar al contingut"
+pinned = "Fixada"
+jump_to_posts = "Saltar als articles"
read_more = "Llegir més"
one_posts = "$NUMBER entrada"
many_posts = "$NUMBER entrades"
@@ -55,7 +58,7 @@ many_min_read = "$NUMBER mins de lectura"
zero_words = "Cap paraula"
one_words = "$NUMBER paraula"
many_words = "$NUMBER paraules"
-last_updated_on = "Última actualizació el"
+last_updated_on = "Actualitzat el $DATE"
see_changes = "Veure canvis"
# Post body.
@@ -66,6 +69,9 @@ load_comments = "Carregar comentaris"
copied = "Copiat!"
copy_code_to_clipboard = "Copia el codi al porta-retalls"
+# iine appreciation button.
+like_this_post = "M'agrada aquesta publicació"
+
# Footer: Powered by Zola and tabi.
powered_by = "Propulsat per"
and = "i"
diff --git a/i18n/de.toml b/i18n/de.toml
index a633b68..79c846f 100644
--- a/i18n/de.toml
+++ b/i18n/de.toml
@@ -27,6 +27,9 @@ one_results = "$NUMBER Ergebnis" # "1 result"
many_results = "$NUMBER Ergebnisse" # "3 results"
# Navigation.
+skip_to_content = "Zum Inhalt springen"
+pinned = "Angeheftet"
+jump_to_posts = "Zu den Beiträgen springen"
read_more = "Weiterlesen"
one_posts = "$NUMBER Beitrag"
many_posts = "$NUMBER Beiträge"
@@ -59,7 +62,7 @@ many_min_read = "$NUMBER Min. Lesezeit"
zero_words = "Keine Wörter"
one_words = "$NUMBER Wort"
many_words = "$NUMBER Wörter"
-last_updated_on = "Zuletzt aktualisiert am"
+last_updated_on = "Aktualisiert am $DATE"
see_changes = "Änderungen anzeigen"
# Post body.
@@ -70,6 +73,9 @@ load_comments = "Kommentare laden"
copied = "Kopiert!"
copy_code_to_clipboard = "Code in die Zwischenablage kopieren"
+# iine appreciation button.
+like_this_post = "Dieser Beitrag gefällt mir"
+
# Footer.
powered_by = "Angetrieben von"
and = "und"
diff --git a/i18n/en.toml b/i18n/en.toml
index ae5f02e..586153c 100644
--- a/i18n/en.toml
+++ b/i18n/en.toml
@@ -23,6 +23,9 @@ one_results = "$NUMBER result" # "1 result"
many_results = "$NUMBER results" # "3 results"
# Navigation.
+skip_to_content = "Skip to content"
+pinned = "Pinned"
+jump_to_posts = "Jump to posts"
read_more = "Read more"
one_posts = "$NUMBER post"
many_posts = "$NUMBER posts" # "3 posts"
@@ -55,7 +58,7 @@ many_min_read = "$NUMBER min read"
zero_words = "No words"
one_words = "$NUMBER word"
many_words = "$NUMBER words"
-last_updated_on = "Last updated on"
+last_updated_on = "Updated on $DATE"
see_changes = "See changes"
# Post body.
@@ -66,6 +69,9 @@ load_comments = "Load comments"
copied = "Copied!"
copy_code_to_clipboard = "Copy code to clipboard"
+# iine appreciation button.
+like_this_post = "Like this post"
+
# Footer: Powered by Zola and tabi.
powered_by = "Powered by"
and = "&"
diff --git a/i18n/es.toml b/i18n/es.toml
index 7e0fe0c..df419e8 100644
--- a/i18n/es.toml
+++ b/i18n/es.toml
@@ -23,6 +23,9 @@ one_results = "$NUMBER resultado"
many_results = "$NUMBER resultados"
# Navigation.
+skip_to_content = "Saltar al contenido"
+pinned = "Fijada"
+jump_to_posts = "Saltar a las entradas"
read_more = "Leer más"
one_posts = "$NUMBER entrada"
many_posts = "$NUMBER entradas"
@@ -55,7 +58,7 @@ many_min_read = "$NUMBER mins de lectura"
zero_words = "Cero palabras"
one_words = "$NUMBER palabra"
many_words = "$NUMBER palabras"
-last_updated_on = "Última actualización el"
+last_updated_on = "Actualizado el $DATE"
see_changes = "Ver cambios"
# Post body.
@@ -66,6 +69,9 @@ load_comments = "Cargar comentarios"
copied = "Copiado!"
copy_code_to_clipboard = "Copiar código al portapapeles"
+# iine appreciation button.
+like_this_post = "Me gusta esta publicación"
+
# Footer: Powered by Zola and tabi.
powered_by = "Impulsado por"
and = "y"
diff --git a/i18n/et.toml b/i18n/et.toml
new file mode 100644
index 0000000..f328552
--- /dev/null
+++ b/i18n/et.toml
@@ -0,0 +1,99 @@
+language_name = "Eesti" # Shown in language picker for multi-language sites.
+date_locale = "et_EE"
+full_stop = "." # Used at the end of a sentence.
+
+# Menu items.
+# Should match the names in config.extra.menu and config.extra.footer_menu.
+blog = "blogi"
+archive = "arhiiv"
+tags = "sildid"
+projects = "projektid"
+about = "minust"
+contact = "kontakt"
+privacy = "privaatsuspoliitika"
+site_statistics = "saidi statistika"
+sitemap = "saidikaart"
+
+# Search.
+search = "Otsing"
+search_icon_title = "Otsingu avamiseks klõpsake või vajutage $SHORTCUT" # $SHORTCUT will be replaced with the actual keyboard shortcut.
+clear_search = "Tühjenda otsing" # Title of the X icon next to search input.
+zero_results = "Tulemusi pole"
+one_results = "$NUMBER tulemus" # "1 result"
+many_results = "$NUMBER tulemust" # "3 results"
+
+# Navigation.
+skip_to_content = "Hüppa sisu juurde"
+pinned = "Kinnitatud"
+jump_to_posts = "Hüppa postitusteni"
+read_more = "Loe edasi"
+one_posts = "$NUMBER postitus"
+many_posts = "$NUMBER postitust" # "3 posts"
+prev = "Eelmine" # As in "Previous" page.
+next = "Järgmine" # As in "Next" page.
+of = "/" # E.g. Page 1 "of" 3
+all_posts = "Kõik postitused"
+all_tags = "Kõik sildid"
+all_projects = "Kõik projektid"
+featured_projects = "Esiletõstetud projektid"
+language_selection = "Keele valik"
+toggle_mode = "Lülita $MODE režiim" # $MODE will be replaced by a value (or both) below.
+dark = "tume"
+light = "hele"
+reset_mode = "Lähtesta vaikerežiim"
+
+# Quick navigation buttons.
+toggle_toc = "Sisukorra kuvamine/peitmine"
+go_to_top = "Mine lehe ülaossa"
+go_to_comments = "Mine kommentaaride juurde"
+
+# Post metadata.
+by_author = "Autor: $AUTHOR" # $AUTHOR will be replaced by the author(s).
+author_separator = ", " # For multiple authors. Ensure spacing where necessary.
+author_conjunction = " ja " # For multiple authors. Ensure spacing where necessary.
+draft = "MUSTAND"
+zero_min_read = "Lugemisaeg <1 min"
+one_min_read = "Lugemisaeg $NUMBER min"
+many_min_read = "Lugemisaeg $NUMBER min"
+zero_words = "Sõnu pole"
+one_words = "$NUMBER sõna"
+many_words = "$NUMBER sõna"
+last_updated_on = "Uuendatud $DATE"
+see_changes = "Vaata muudatusi"
+
+# Post body.
+table_of_contents = "Sisukord"
+load_comments = "Lae kommentaarid"
+
+# Copy code block button.
+copied = "Kopeeritud!"
+copy_code_to_clipboard = "Kopeeri kood lõikelauale"
+
+# iine appreciation button.
+like_this_post = "Mulle meeldib see postitus"
+
+# Footer: Powered by Zola and tabi.
+powered_by = "Toetab"
+and = "ja"
+site_source = "Saidi lähtekood"
+
+# 404 error.
+# https://welpo.github.io/tabi/404.html
+page_missing = "Tundub, et otsitud lehte ei leitud"
+translation_missing = "või pole seda veel teie keelde tõlgitud"
+check_url = "Kontrollige URL-i vigade suhtes või"
+go_home = "minge tagasi avalehele"
+
+# For multilingual quote shortcode.
+# https://welpo.github.io/tabi/blog/shortcodes/#multilingual-quotes
+show_original_quote = "Näita originaaltsitaati"
+show_translation = "Näita tõlget"
+open_quotation_mark = "“"
+close_quotation_mark = "”"
+
+# Translations for stylised Atom feed.
+# https://welpo.github.io/tabi/atom.xml
+# Must contain "About Feeds"; it will become a link.
+about_feeds = "See on veebivoog, tuntud ka kui Atom-voog. Tellimiseks kopeerige URL aadressiribalt oma uudistelugerisse. Külastage About Feeds lehte, et õppida ja alustada. See on tasuta."
+visit_the_site = "Külasta veebisaiti"
+recent_posts = "Viimased postitused"
diff --git a/i18n/fa.toml b/i18n/fa.toml
index 9f1a553..2153aab 100644
--- a/i18n/fa.toml
+++ b/i18n/fa.toml
@@ -23,6 +23,9 @@ one_results = "$NUMBER نتیجه" # "1 result"
many_results = "$NUMBER نتیجه" # "3 results"
# Navigation.
+skip_to_content = "پرش به محتوا"
+pinned = "سنجاقشده"
+jump_to_posts = "پرش به نوشتهها"
read_more = "ادامه مطلب"
one_posts = "$NUMBER مطلب"
many_posts = "$NUMBER مطلب" # "3 posts"
@@ -56,7 +59,7 @@ many_min_read = "خواندن $NUMBER دقیقه"
zero_words = "هیچ کلمهای"
one_words = "$NUMBER کلمه"
many_words = "$NUMBER کلمه"
-last_updated_on = "آخرین بهروزرسانی در"
+last_updated_on = "آخرین بهروزرسانی در $DATE"
see_changes = "مشاهده تغییرات"
# Post body.
@@ -67,6 +70,9 @@ load_comments = "بارگذاری نظرات"
copied = "کپی شد!"
copy_code_to_clipboard = "کپی کد به کلیپبورد"
+# iine appreciation button.
+like_this_post = "این مقاله را دوست دارم"
+
# Footer: Powered by Zola and tabi.
powered_by = "قدرت گرفته از"
and = "و"
diff --git a/i18n/fi.toml b/i18n/fi.toml
new file mode 100644
index 0000000..32fa48d
--- /dev/null
+++ b/i18n/fi.toml
@@ -0,0 +1,103 @@
+language_name = "suomi" # Shown in language picker for multi-language sites.
+date_locale = "fi_FI"
+full_stop = "." # Used at the end of a sentence.
+
+# Menu items.
+# Should match the names in config.extra.menu and config.extra.footer_menu.
+blog = "blogi"
+archive = "arkisto"
+tags = "tunnisteet"
+projects = "projektit"
+diagrams = "kaaviot"
+about = "minusta"
+contact = "yhteystiedot"
+privacy = "tietosuojakäytäntö"
+site_statistics = "tilastot"
+sitemap = "sivustokartta"
+
+# Search.
+search = "Hae"
+search_icon_title = "Paina $SHORTCUT avataksesi haun" # $SHORTCUT will be replaced with the actual keyboard shortcut.
+clear_search = "Tyhjennä haku" # Title of the X icon next to search input.
+zero_results = "Ei tuloksia"
+one_results = "$NUMBER tulos" # "1 result"
+many_results = "$NUMBER tulosta" # "3 results"
+
+# Navigation.
+skip_to_content = "Siirry sisältöön"
+# Some will prefer artikkeli (=article) instead of julkaisu (=publication), but this is more general
+pinned = "Kiinnitetty"
+jump_to_posts = "Siirry julkaisuihin"
+read_more = "Lue lisää"
+one_posts = "$NUMBER julkaisu"
+many_posts = "$NUMBER julkaisua" # "3 posts"
+prev = "Edellinen" # As in "Previous" page.
+next = "Seuraava" # As in "Next" page.
+of = "/" # E.g. Page 1 "of" 3
+all_posts = "Kaikki julkaisut"
+all_tags = "Kaikki tunnisteet"
+all_projects = "Kaikki projektit"
+featured_projects = "Esittelyprojektit"
+language_selection = "Kielivalinta"
+toggle_mode = "Vaihda $MODE" # $MODE will be replaced by a value (or both) below. Literally "Change $MODE"
+# The declension assumes that both values are used. e.g. "Change dark mode" wouldn't work and would need the "to" preposition
+# It also omits the "mode" word: "Change dark/light mode" instead of "Change dark mode/light mode"
+dark = "tumma"
+light = "vaalea tila"
+reset_mode = "Palauta oletustilaan"
+
+# Quick navigation buttons.
+toggle_toc = "Sisällysluettelo päälle/pois"
+go_to_top = "Siirry sivun alkuun"
+go_to_comments = "Siirry kommenttiosioon"
+
+# Post metadata.
+by_author = "Kirjoittanut $AUTHOR" # $AUTHOR will be replaced by the author(s). Literally "Written by $AUTHOR"
+author_separator = ", " # For multiple authors. Ensure spacing where necessary.
+author_conjunction = " ja " # For multiple authors. Ensure spacing where necessary.
+draft = "LUONNOS"
+zero_min_read = "<1 min. lukuaika"
+one_min_read = "$NUMBER min. lukuaika"
+many_min_read = "$NUMBER min. lukuaika"
+zero_words = "Ei sanoja"
+one_words = "$NUMBER sana"
+many_words = "$NUMBER sanaa"
+last_updated_on = "Päivitetty $DATE"
+see_changes = "Katso muutokset"
+
+# Post body.
+table_of_contents = "Sisällysluettelo"
+load_comments = "Lataa kommentit"
+
+# Copy code block button.
+copied = "Kopioitu!"
+copy_code_to_clipboard = "Kopioi koodi leikepöydälle"
+
+# iine appreciation button.
+like_this_post = "Pidän tästä kirjoituksesta"
+
+# Footer: Powered by Zola and tabi.
+powered_by = "Pyörii ohjelmilla" # "Works using the software"
+and = "&"
+site_source = "Sivuston lähdekoodi"
+
+# 404 error.
+# https://welpo.github.io/tabi/404.html
+page_missing = "Pyytämääsi sivua ei löydy"
+translation_missing = "tai sitä ei ole vielä käännetty kielellesi"
+check_url = "Tarkista URL-osoitteesta mahdolliset virheet tai"
+go_home = "palaa etusivulle"
+
+# For multilingual quote shortcode.
+# https://welpo.github.io/tabi/blog/shortcodes/#multilingual-quotes
+show_original_quote = "Näytä alkuperäinen lainaus"
+show_translation = "Näytä käännös"
+open_quotation_mark = "“"
+close_quotation_mark = "”"
+
+# Translations for stylised Atom feed.
+# https://welpo.github.io/tabi/atom.xml
+# Must contain "About Feeds"; it will become a link.
+about_feeds = "Tämä on verkkosyöte, joka tunnetaan myös nimellä Atom-syöte. Tilaa kopioimalla URL-osoite osoitepalkista uutislukijaasi. Käy sivulla About Feeds saadaksesi lisätietoja ja aloittaakeksi. Se on ilmaista."
+visit_the_site = "Vieraile sivustolla"
+recent_posts = "Viimeisimmät julkaisut"
diff --git a/i18n/fr.toml b/i18n/fr.toml
index f5b7963..636a015 100644
--- a/i18n/fr.toml
+++ b/i18n/fr.toml
@@ -23,6 +23,9 @@ one_results = "$NUMBER résultat" # "1 result"
many_results = "$NUMBER résultats" # "3 results"
# Navigation.
+skip_to_content = "Passer au contenu"
+pinned = "Épinglé"
+jump_to_posts = "Aller aux articles"
read_more = "Lire plus"
one_posts = "$NUMBER article"
many_posts = "$NUMBER articles"
@@ -55,7 +58,7 @@ many_min_read = "$NUMBER min de lecture"
zero_words = "aucun mot"
one_words = "$NUMBER mot"
many_words = "$NUMBER mots"
-last_updated_on = "Dernière mise à jour le"
+last_updated_on = "Mis à jour le $DATE"
see_changes = "Voir les modifications"
# Post body.
@@ -66,6 +69,9 @@ load_comments = "Afficher les commentaires"
copied = "Copié !"
copy_code_to_clipboard = "Copier le code dans le presse-papier"
+# iine appreciation button.
+like_this_post = "J'aime cet article"
+
# Footer: Powered by Zola and tabi.
powered_by = "Propulsé par"
and = "et"
diff --git a/i18n/hi.toml b/i18n/hi.toml
index ab00aa7..77320c8 100644
--- a/i18n/hi.toml
+++ b/i18n/hi.toml
@@ -25,6 +25,9 @@ one_results = "$NUMBER परिणाम" # "1 result"
many_results = "$NUMBER परिणाम" # "3 results"
# Navigation.
+skip_to_content = "सामग्री पर जाएं"
+pinned = "पिन किया गया"
+jump_to_posts = "पोस्ट पर जाएं"
read_more = "और पढ़ें"
one_posts = "$NUMBER पोस्ट"
many_posts = "$NUMBER पोस्ट्स"
@@ -57,7 +60,7 @@ many_min_read = "$NUMBER मिनट पठन समय"
zero_words = "कोई शब्द नहीं"
one_words = "$NUMBER शब्द"
many_words = "$NUMBER शब्द"
-last_updated_on = "आखिरी अपडेट"
+last_updated_on = "$DATE को अपडेट किया गया"
see_changes = "बदलाव देखें"
# Post body.
@@ -68,6 +71,9 @@ load_comments = "कमेंट्स लोड करें"
copied = "कॉपी किया गया!"
copy_code_to_clipboard = "कोड क्लिपबोर्ड में कॉपी करें"
+# iine appreciation button.
+like_this_post = "मुझे यह पोस्ट पसंद है"
+
# Footer: Powered by Zola and tabi.
powered_by = "चालित द्वारा"
and = "और"
diff --git a/i18n/it.toml b/i18n/it.toml
index 54b55d2..44495dd 100644
--- a/i18n/it.toml
+++ b/i18n/it.toml
@@ -23,6 +23,9 @@ one_results = "$NUMBER risultato"
many_results = "$NUMBER risultati"
# Navigation.
+skip_to_content = "Salta al contenuto"
+pinned = "In evidenza"
+jump_to_posts = "Vai ai post"
read_more = "Leggi di più"
one_posts = "$NUMBER post"
many_posts = "$NUMBER post"
@@ -55,7 +58,7 @@ many_min_read = "$NUMBER min di lettura"
zero_words = "Nessuna parola"
one_words = "$NUMBER parola"
many_words = "$NUMBER parole"
-last_updated_on = "Ultimo aggiornamento il"
+last_updated_on = "Aggiornato il $DATE"
see_changes = "Vedi modifiche"
# Post body.
@@ -66,6 +69,9 @@ load_comments = "Carica commenti"
copied = "Copiato!"
copy_code_to_clipboard = "Copia codice negli appunti"
+# iine appreciation button.
+like_this_post = "Mi piace questo post"
+
# Footer: Powered by Zola and tabi.
powered_by = "Alimentato da"
and = "e"
diff --git a/i18n/ja.toml b/i18n/ja.toml
index 4241914..10b9265 100644
--- a/i18n/ja.toml
+++ b/i18n/ja.toml
@@ -27,6 +27,9 @@ one_results = "$NUMBER 結果" # "1 result"
many_results = "$NUMBER 結果" # "3 results"
# Navigation.
+skip_to_content = "コンテンツにスキップ"
+pinned = "固定"
+jump_to_posts = "投稿へジャンプ"
read_more = "続きを読む"
one_posts = "$NUMBER 投稿"
many_posts = "$NUMBER 投稿"
@@ -59,7 +62,7 @@ many_min_read = "$NUMBER 分の読了時間"
zero_words = "単語数ゼロ"
one_words = "$NUMBER 単語"
many_words = "$NUMBER 単語"
-last_updated_on = "最終更新日"
+last_updated_on = "$DATE に更新"
see_changes = "変更を見る"
# Post body.
@@ -70,6 +73,9 @@ load_comments = "コメントを読む"
copied = "コピーしました!"
copy_code_to_clipboard = "コードをクリップボードにコピー"
+# iine appreciation button.
+like_this_post = "いいね!"
+
# Footer: Powered by Zola and tabi.
powered_by = "Powered by"
and = "と"
diff --git a/i18n/ko.toml b/i18n/ko.toml
index 1e3097d..e5eee12 100644
--- a/i18n/ko.toml
+++ b/i18n/ko.toml
@@ -27,6 +27,9 @@ one_results = "$NUMBER 결과" # "1 result"
many_results = "$NUMBER 결과" # "3 results"
# Navigation.
+skip_to_content = "콘텐츠로 건너뛰기"
+pinned = "고정됨"
+jump_to_posts = "게시물로 이동"
read_more = "더 읽기"
one_posts = "$NUMBER 게시물"
many_posts = "$NUMBER 게시물"
@@ -59,7 +62,7 @@ many_min_read = "$NUMBER 분 읽기"
zero_words = "단어 없음"
one_words = "$NUMBER 단어"
many_words = "$NUMBER 단어"
-last_updated_on = "최근 업데이트"
+last_updated_on = "$DATE에 업데이트됨"
see_changes = "변경사항 보기"
# Post body.
@@ -70,6 +73,9 @@ load_comments = "댓글 불러오기"
copied = "복사됨!"
copy_code_to_clipboard = "코드를 클립보드에 복사"
+# iine appreciation button.
+like_this_post = "이 글이 좋아요"
+
# Footer: Powered by Zola and tabi.
powered_by = "제공됨"
and = "&"
diff --git a/i18n/nl.toml b/i18n/nl.toml
index 5446b6c..c6649d5 100644
--- a/i18n/nl.toml
+++ b/i18n/nl.toml
@@ -23,6 +23,9 @@ one_results = "$NUMBER resultaat" # "1 result"
many_results = "$NUMBER resultaten" # "3 results"
# Navigation.
+skip_to_content = "Naar inhoud springen"
+pinned = "Vastgezet"
+jump_to_posts = "Naar berichten springen"
read_more = "Lees meer"
one_posts = "$NUMBER bericht" # "1 post"
many_posts = "$NUMBER berichten" # "3 posts"
@@ -55,7 +58,7 @@ many_min_read = "$NUMBER minuten lezen"
zero_words = "Geen woorden"
one_words = "$NUMBER woord"
many_words = "$NUMBER woorden"
-last_updated_on = "Laatst geupdate op"
+last_updated_on = "Bijgewerkt op $DATE"
see_changes = "Zie wijzigingen"
# Post body.
@@ -66,6 +69,9 @@ load_comments = "Laad opmerkingen"
copied = "Gekopieerd!"
copy_code_to_clipboard = "Kopieer code naar klembord"
+# iine appreciation button.
+like_this_post = "Vind ik leuk"
+
# Footer: Powered by Zola and tabi.
powered_by = "Aangedreven door"
and = "&"
diff --git a/i18n/or.toml b/i18n/or.toml
new file mode 100644
index 0000000..2db18e9
--- /dev/null
+++ b/i18n/or.toml
@@ -0,0 +1,99 @@
+language_name = "ଓଡ଼ିଆ" # Shown in language picker for multi-language sites.
+date_locale = "or_IN"
+full_stop = "।" # Used at the end of a sentence.
+
+# Menu items.
+# Should match the names in config.extra.menu and config.extra.footer_menu.
+blog = "ବ୍ଲଗ"
+archive = "ଆର୍କାଇଭ"
+tags = "ଟ୍ୟାଗଗୁଡ଼ିକ"
+projects = "ପ୍ରକଳ୍ପଗୁଡ଼ିକ"
+about = "ବାବଦରେ"
+contact = "ଯୋଗାଯୋଗ"
+privacy = "ଗୋପନୀୟତା ନୀତି"
+site_statistics = "ସାଇଟ ପରିସଂଖ୍ୟାନ"
+sitemap = "ସାଇଟମ୍ୟାପ"
+
+# Search.
+search = "ଖୋଜନ୍ତୁ"
+search_icon_title = "ଖୋଜିବାକୁ $SHORTCUT କୁ ଚିପନ୍ତୁ କିମ୍ବା କ୍ଲିକ କରନ୍ତୁ" # $SHORTCUT will be replaced with the actual keyboard shortcut.
+clear_search = "ଖୋଜା ସଫା କରନ୍ତୁ" # Title of the X icon next to search input.
+zero_results = "କିଛି ମିଳିଲା ନାହିଁ"
+one_results = "$NUMBER ପରିଣାମ" # "1 result"
+many_results = "$NUMBER ପରିଣାମଗୁଡ଼ିକ" # "3 results"
+
+# Navigation.
+skip_to_content = "ବିଷୟବସ୍ତୁକୁ ଯାଆନ୍ତୁ"
+pinned = "ପିନ୍ କରାଯାଇଛି"
+jump_to_posts = "ପୋଷ୍ଟକୁ ଯାଆନ୍ତୁ"
+read_more = "ଆହୁରି ପଢ଼ନ୍ତୁ"
+one_posts = "$NUMBER ପୋଷ୍ଟ"
+many_posts = "$NUMBER ପୋଷ୍ଟଗୁଡ଼ିକ" # "3 posts"
+prev = "ପୂର୍ବ" # As in "Previous" page.
+next = "ପର" # As in "Next" page.
+of = "ର" # E.g. Page 1 "of" 3
+all_posts = "ସମସ୍ତ ପୋଷ୍ଟଗୁଡ଼ିକ"
+all_tags = "ସମସ୍ତ ଟ୍ୟାଗଗୁଡ଼ିକ"
+all_projects = "ସମସ୍ତ ପ୍ରକଳ୍ପଗୁଡ଼ିକ"
+featured_projects = "ବିଶେଷ ପ୍ରକଳ୍ପଗୁଡ଼ିକ"
+language_selection = "ଭାଷା ଚୟନ"
+toggle_mode = "$MODE ଟଗଲ କରନ୍ତୁ" # $MODE will be replaced by a value (or both) below.
+dark = "ଅନ୍ଧାର"
+light = "ଆଲୋକ"
+reset_mode = "ସାଇଟର ମୂଳ ମୋଡକୁ ଆଣନ୍ତୁ"
+
+# Quick navigation buttons.
+toggle_toc = "ସୂଚୀପତ୍ର ଟଗଲ କରନ୍ତୁ"
+go_to_top = "ପୃଷ୍ଠାର ଶୀର୍ଷକୁ ଯାଆନ୍ତୁ"
+go_to_comments = "ମତାମତ ବିଭାଗକୁ ଯାଆନ୍ତୁ"
+
+# Post metadata.
+by_author = "$AUTHOR ଙ୍କ ଦ୍ୱାରା" # $AUTHOR will be replaced by the author(s).
+author_separator = ", " # For multiple authors. Ensure spacing where necessary.
+author_conjunction = " ଏବଂ " # For multiple authors. Ensure spacing where necessary.
+draft = "ଡ୍ରାଫ୍ଟ"
+zero_min_read = "<୧ ମିନିଟ ପଢ଼ିବା ସମୟ"
+one_min_read = "$NUMBER ମିନିଟ ପଢ଼ିବା ସମୟ"
+many_min_read = "$NUMBER ମିନିଟ ପଢ଼ିବା ସମୟ"
+zero_words = "କୌଣସି ଶବ୍ଦ ନାହିଁ "
+one_words = "$NUMBER ଶବ୍ଦ"
+many_words = "$NUMBER ଶବ୍ଦଗୁଡ଼ିକ"
+last_updated_on = "$DATE ଦିନ ଅଦ୍ୟତନ ହୋଇଥିଲା"
+see_changes = "ପରିବର୍ତ୍ତନଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ"
+
+# Post body.
+table_of_contents = "ସୂଚୀପତ୍ର"
+load_comments = "ମତାମତ ଲୋଡ କରନ୍ତୁ"
+
+# Copy code block button.
+copied = "କପି ହେଲା!"
+copy_code_to_clipboard = "କ୍ଲିପବୋର୍ଡକୁ କପି କରନ୍ତୁ"
+
+# iine appreciation button.
+like_this_post = "ମୋର ଏହି ପୋସ୍ଟ ଭଲ ଲାଗେ"
+
+# Footer: Powered by Zola and tabi.
+powered_by = "ଚାଳିତ ଦ୍ୱାରା"
+and = "ଏବଂ"
+site_source = "ସାଇଟ ଉତ୍ସ"
+
+# 404 error.
+# https://welpo.github.io/tabi/404.html
+page_missing = "ଆପଣ ଯେଉଁ ପୃଷ୍ଠାଟିକୁ ଅନୁରୋଧ କରିଥିଲେ ତାହା ନାହିଁ"
+translation_missing = "କିମ୍ବା ଆପଣଙ୍କର ଭାଷାକୁ ଏପର୍ଯ୍ୟନ୍ତ ଅନୁବାଦିତ ହୋଇନାହିଁ"
+check_url = "ତୃଟିଗୁଡ଼ିକ ପାଇଁ URL କୁ ଦେଖନ୍ତୁ କିମ୍ବା"
+go_home = "ମୂଳ ପୃଷ୍ଠାକୁ ଫେରିଯାଆନ୍ତୁ"
+
+# For multilingual quote shortcode.
+# https://welpo.github.io/tabi/blog/shortcodes/#multilingual-quotes
+show_original_quote = "ମୂଳ ଉଦ୍ଧୃତ ଦେଖାନ୍ତୁ"
+show_translation = "ଅନୁବାଦ ଦେଖାନ୍ତୁ"
+open_quotation_mark = "“"
+close_quotation_mark = "”"
+
+# Translations for stylised Atom feed.
+# https://welpo.github.io/tabi/atom.xml
+# Must contain "About Feeds"; it will become a link.
+about_feeds = "ଏହା ଏକ ୱେବ୍ ଫିଡ୍, ଯାହାକୁ ଆଟମ୍ ଫିଡ୍ ମଧ୍ୟ କୁହାଯାଏ। ଠିକଣା ବାରରୁ URL କୁ ଆପଣଙ୍କ ନ୍ୟୁଜ୍ ରିଡରରେ କପି କରି ସବ୍ସ୍କ୍ରାଇବ୍ କରନ୍ତୁ। ଅଧିକ ଜାଣିବା ଏବଂ ଆରମ୍ଭ କରିବାକୁ About Feeds ଯାଆନ୍ତୁ। ଏହା ମାଗଣା ଅଟେ ।"
+visit_the_site = "ୱେବସାଇଟକୁ ଯାଆନ୍ତୁ"
+recent_posts = "ସାମ୍ପ୍ରତିକ ପୋଷ୍ଟଗୁଡିକ"
diff --git a/i18n/pt-PT.toml b/i18n/pt-PT.toml
index d104427..1147770 100644
--- a/i18n/pt-PT.toml
+++ b/i18n/pt-PT.toml
@@ -23,6 +23,9 @@ one_results = "$NUMBER resultado" # "1 result"
many_results = "$NUMBER resultados" # "3 results"
# Navigation.
+skip_to_content = "Pular para o conteúdo"
+pinned = "Fixado"
+jump_to_posts = "Ir para as publicações"
read_more = "Ler mais"
one_posts = "$NUMBER publicação"
many_posts = "$NUMBER publicações"
@@ -55,7 +58,7 @@ many_min_read = "$NUMBER mins de leitura"
zero_words = "Nenhuma palavra"
one_words = "$NUMBER palavra"
many_words = "$NUMBER palavras"
-last_updated_on = "Última atualização em"
+last_updated_on = "Atualizado em $DATE"
see_changes = "Ver alterações"
# Post body.
@@ -66,6 +69,9 @@ load_comments = "Carregar comentários"
copied = "Copiado!"
copy_code_to_clipboard = "Copiar código para a área de transferência"
+# iine appreciation button.
+like_this_post = "Gosto desta publicação"
+
# Footer: Powered by Zola and tabi.
powered_by = "Impulsionado por"
and = "e"
diff --git a/i18n/ru.toml b/i18n/ru.toml
index 12c94db..1b566ad 100644
--- a/i18n/ru.toml
+++ b/i18n/ru.toml
@@ -28,6 +28,9 @@ few_results = "$NUMBER результата" # 2, 3, 4 but not 12-14
many_results = "$NUMBER результатов" # 5-9, 0, 11-14, and others
# Navigation.
+skip_to_content = "Перейти к содержанию"
+pinned = "Закреплено"
+jump_to_posts = "Перейти к записям"
read_more = "Читать далее"
post = "пост"
one_posts = "$NUMBER пост"
@@ -64,7 +67,7 @@ zero_words = "Нет слов"
one_words = "$NUMBER слово"
few_words = "$NUMBER слова" # 2, 3, 4 but not 12-14
many_words = "$NUMBER слов" # 5-9, 0, 11-14, and others
-last_updated_on = "Последнее обновление"
+last_updated_on = "Обновлено $DATE"
see_changes = "Смотреть изменения"
# Post body.
@@ -75,6 +78,9 @@ load_comments = "Загрузить комментарии"
copied = "Скопировано!"
copy_code_to_clipboard = "Скопировать код в буфер обмена"
+# iine appreciation button.
+like_this_post = "Мне нравится эта статья"
+
# Footer: Powered by Zola and tabi.
powered_by = "Под управлением"
and = "&"
diff --git a/i18n/uk.toml b/i18n/uk.toml
index 7b1519d..d1696fe 100644
--- a/i18n/uk.toml
+++ b/i18n/uk.toml
@@ -33,6 +33,9 @@ few_results = "$NUMBER результати"
many_results = "$NUMBER результатів"
# Navigation.
+skip_to_content = "Перейти до вмісту"
+pinned = "Закріплено"
+jump_to_posts = "Перейти до дописів"
read_more = "Читати далі"
one_posts = "$NUMBER пост"
few_posts = "$NUMBER пости" # 2, 3, 4 but not 12-14
@@ -68,7 +71,7 @@ zero_words = "Без слів"
one_words = "$NUMBER слово"
few_words = "$NUMBER слова" # 2, 3, 4 but not 12-14
many_words = "$NUMBER слів" # 5-9, 0, 11-14, and others
-last_updated_on = "Останнє оновлення"
+last_updated_on = "Оновлено $DATE"
see_changes = "Переглянути зміни"
# Post body.
@@ -79,6 +82,9 @@ load_comments = "Завантажити коментарі"
copied = "Скопійовано!"
copy_code_to_clipboard = "Копіювати код у буфер обміну"
+# iine appreciation button.
+like_this_post = "Мені подобається ця стаття"
+
# Footer: Powered by Zola and tabi.
powered_by = "Під управлінням"
and = "та"
diff --git a/i18n/zh-Hans.toml b/i18n/zh-Hans.toml
index 96f8b08..15a4cc6 100644
--- a/i18n/zh-Hans.toml
+++ b/i18n/zh-Hans.toml
@@ -23,6 +23,9 @@ one_results = "$NUMBER 个结果"
many_results = "$NUMBER 个结果"
# Navigation.
+skip_to_content = "跳到内容"
+pinned = "置顶"
+jump_to_posts = "跳转到文章"
read_more = "阅读全文"
one_posts = "$NUMBER 篇文章"
many_posts = "$NUMBER 篇文章"
@@ -55,7 +58,7 @@ many_min_read = "$NUMBER 分钟阅读"
zero_words = "没有字"
one_words = "$NUMBER 字"
many_words = "$NUMBER 字"
-last_updated_on = "最后更新于"
+last_updated_on = "更新于 $DATE"
see_changes = "修改纪录"
# Post body.
@@ -66,6 +69,9 @@ load_comments = "载入留言"
copied = "已复制!" # Machine translated.
copy_code_to_clipboard = "复制代码到剪贴板" # Machine translated.
+# iine appreciation button.
+like_this_post = "喜欢这篇文章"
+
# Footer: Powered by Zola and tabi.
powered_by = "网站基于"
and = "和"
diff --git a/i18n/zh-Hant.toml b/i18n/zh-Hant.toml
index 36769bc..d6f42e5 100644
--- a/i18n/zh-Hant.toml
+++ b/i18n/zh-Hant.toml
@@ -23,6 +23,9 @@ one_results = "$NUMBER 個結果"
many_results = "$NUMBER 個結果"
# Navigation.
+skip_to_content = "跳到內容"
+pinned = "釘選"
+jump_to_posts = "跳轉到文章"
read_more = "閱讀全文"
one_posts = "$NUMBER 篇文章"
many_posts = "$NUMBER 篇文章"
@@ -55,7 +58,7 @@ many_min_read = "$NUMBER 分鐘閱讀"
zero_words = "沒有字"
one_words = "$NUMBER 字"
many_words = "$NUMBER 字"
-last_updated_on = "最後更新於"
+last_updated_on = "更新於 $DATE"
see_changes = "修改紀錄"
# Post body.
@@ -66,6 +69,9 @@ load_comments = "載入留言"
copied = "已复制!" # Machine translated.
copy_code_to_clipboard = "复制代码到剪贴板" # Machine translated.
+# iine appreciation button.
+like_this_post = "喜歡這篇文章"
+
# Footer: Powered by Zola and tabi.
powered_by = "網站基於"
and = "和"
diff --git a/release b/release
deleted file mode 100644
index 22ed298..0000000
--- a/release
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/usr/bin/env bash
-# Bash script to prepare a release using git-cliff.
-# Inspired by https://github.com/orhun/git-cliff/blob/main/release.sh
-set -eu
-
-VERSION_FORMAT="^v[0-9]+\.[0-9]+\.[0-9]+$"
-
-# Check for a clean working directory.
-if [ -n "$(git status --porcelain)" ]; then
- echo "Your working directory is dirty. Commit or stash your changes before running this script."
- exit 1
-fi
-
-# Check if a version tag is provided.
-if [ "$#" -eq 1 ]; then
- VERSION_TAG=$1
-else
- suggested_version=$(git cliff --bumped-version)
- echo -n "No version tag provided. git-cliff suggests $suggested_version. Proceed? [Y/n] "
- read user_input
-
- # Check if input is empty or a variation of "yes".
- if [[ -z "$user_input" || "$user_input" =~ ^[Yy](es)?$ ]]; then
- echo "Proceeding with version $suggested_version."
- VERSION_TAG=$suggested_version
- else
- echo "Release preparation cancelled."
- exit 1
- fi
-fi
-
-# Verify that the version tag matches the expected format.
-if ! [[ $VERSION_TAG =~ $VERSION_FORMAT ]]; then
- echo "Version tag $VERSION_TAG does not match the expected format ${VERSION_FORMAT}."
- exit 1
-fi
-
-echo "Preparing release ${VERSION_TAG}…"
-echo
-
-# Update CHANGELOG.
-git cliff --tag "$VERSION_TAG" -o CHANGELOG.md
-sed -E 's/@([a-zA-Z0-9_-]+)/[@\1](https:\/\/github.com\/\1)/g' CHANGELOG.md > CHANGELOG.tmp && mv CHANGELOG.tmp CHANGELOG.md
-
-# Add all changes and commit.
-git add -A
-git commit -m "🔖 chore(release): prepare for $VERSION_TAG"
-
-
-# Generate the tag description.
-changelog=$(git cliff --tag "$VERSION_TAG" --unreleased --strip all)
-
-# Clean up tag's changelog; tag descriptions don't support markdown.
-# Remove PR links.
-changelog=$(echo "$changelog" | sed -E 's/\[\#([0-9]+)\]\(https:\/\/github\.com\/welpo\/[^\/]+\/(issues|pull)\/([0-9]+)\)/#\1/g')
-# Remove commit links.
-changelog=$(echo "$changelog" | sed -E 's/\[([0-9a-f]+)\]\(https:\/\/github\.com\/welpo\/[^\/]+\/commit\/([0-9a-f]+)\)/\1/g')
-# Remove scopes.
-changelog=$(echo "$changelog" | sed -E 's/\*\(([^)]+)\)\* //g')
-# Remove markdown headers.
-changelog=$(echo "$changelog" | sed -E 's/^#+ //g')
-# Remove version comparison lines.
-changelog=$(echo "$changelog" | sed '/https:\/\/github\.com\/.*\/compare\/.*/d')
-
-# Create a signed and annotated tag.
-git tag -s -a "$VERSION_TAG" -m "Release $VERSION_TAG" -m "$changelog"
-
-echo "Most recent commit:"
-git log -1
-echo
-echo "Information for tag $VERSION_TAG:"
-git show $VERSION_TAG
-echo
-
-echo "Release $VERSION_TAG is ready. Don't forget to push the changes and the tag:"
-
-remote_url=$(git remote get-url origin)
-# Check if the URL is in SSH format (git@).
-if [[ "$remote_url" == git@github.com:* ]]; then
- https_url="https://github.com/${remote_url#git@github.com:}"
- https_url="${https_url%.git}"
-else
- https_url="${remote_url%.git}"
-fi
-
-echo "git push && git push --tags && open ${https_url}/tags"
diff --git a/sass/main.scss b/sass/main.scss
index e7e426b..d1470ff 100644
--- a/sass/main.scss
+++ b/sass/main.scss
@@ -1,5 +1,6 @@
@use 'parts/_admonitions.scss';
@use 'parts/_archive.scss';
+@use 'parts/_aside.scss';
@use 'parts/_cards.scss';
@use 'parts/_code.scss';
@use 'parts/_comments.scss';
@@ -7,6 +8,7 @@
@use 'parts/_header-anchor.scss';
@use 'parts/_header.scss';
@use 'parts/_home-banner.scss';
+@use 'parts/_iine.scss';
@use 'parts/_image-hover.scss';
@use 'parts/_image-toggler.scss';
@use 'parts/_image.scss';
@@ -21,6 +23,8 @@
@use 'parts/_table.scss';
@use 'parts/_tags.scss';
@use 'parts/_theme-switch.scss';
+@use 'parts/_webmention.scss';
+@use 'parts/_zola-error.scss';
@font-face {
src: local('Inter'),
@@ -46,7 +50,46 @@
font-display: swap;
}
+@mixin theme-variables($theme) {
+ @if $theme =='light' {
+ --background-color: white;
+ --bg-0: #f0f0f0;
+ --bg-1: #e7e7e7;
+ --bg-2: #fefefe;
+ --bg-3: #d8dcdd;
+ --hover-color: white;
+ --primary-color: #087E96;
+ --divider-color: #d7d7d7;
+ --text-color: #222226;
+ --text-color-high-contrast: #313333;
+ --meta-color: #5b5b65;
+ --codeblock-bg: #26232e;
+ --codeblock-highlight: #383444;
+ --theme-switcher-svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M283.211 512c78.962 0 151.079-35.925 198.857-94.792 7.068-8.708-.639-21.43-11.562-19.35-124.203 23.654-238.262-71.576-238.262-196.954 0-72.222 38.662-138.635 101.498-174.394 9.686-5.512 7.25-20.197-3.756-22.23A258.156 258.156 0 0 0 283.211 0c-141.309 0-256 114.511-256 256 0 141.309 114.511 256 256 256z'/%3E%3C/svg%3E%0A");
+ color-scheme: light;
+ }
+
+ @else {
+ --background-color: #1f1f1f;
+ --bg-0: #2f2f2f;
+ --bg-1: #3c3c3c;
+ --bg-2: #171717;
+ --bg-3: #535555;
+ --hover-color: black;
+ --primary-color: #91e0ee;
+ --divider-color: #4a4a4a;
+ --text-color: #D4D4D4;
+ --text-color-high-contrast: #eceeef;
+ --meta-color: #B0B0B0;
+ --codeblock-bg: #19181e;
+ --codeblock-highlight: #282834;
+ --theme-switcher-svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 96 960 960' %3E%3Cpath d='M480 776q-83 0-141.5-58.5T280 576q0-83 58.5-141.5T480 376q83 0 141.5 58.5T680 576q0 83-58.5 141.5T480 776ZM80 616q-17 0-28.5-11.5T40 576q0-17 11.5-28.5T80 536h80q17 0 28.5 11.5T200 576q0 17-11.5 28.5T160 616H80Zm720 0q-17 0-28.5-11.5T760 576q0-17 11.5-28.5T800 536h80q17 0 28.5 11.5T920 576q0 17-11.5 28.5T880 616h-80ZM480 296q-17 0-28.5-11.5T440 256v-80q0-17 11.5-28.5T480 136q17 0 28.5 11.5T520 176v80q0 17-11.5 28.5T480 296Zm0 720q-17 0-28.5-11.5T440 976v-80q0-17 11.5-28.5T480 856q17 0 28.5 11.5T520 896v80q0 17-11.5 28.5T480 1016ZM226 378l-43-42q-12-11-11.5-28t11.5-29q12-12 29-12t28 12l42 43q11 12 11 28t-11 28q-11 12-27.5 11.5T226 378Zm494 495-42-43q-11-12-11-28.5t11-27.5q11-12 27.5-11.5T734 774l43 42q12 11 11.5 28T777 873q-12 12-29 12t-28-12Zm-42-495q-12-11-11.5-27.5T678 322l42-43q11-12 28-11.5t29 11.5q12 12 12 29t-12 28l-43 42q-12 11-28 11t-28-11ZM183 873q-12-12-12-29t12-28l43-42q12-11 28.5-11t27.5 11q12 11 11.5 27.5T282 830l-42 43q-11 12-28 11.5T183 873Z'/%3E%3C/svg%3E");
+ color-scheme: dark;
+ }
+}
+
:root {
+ @include theme-variables('light');
--max-layout-width: 1000px;
--normal-layout-width: 600px;
@@ -58,45 +101,15 @@
--serif-font: 'Source Serif', 'Georgia', serif;
--code-font: 'Cascadia Code';
- --background-color: white;
- --bg-0: #f0f0f0;
- --bg-1: #e7e7e7;
- --bg-2: #fefefe;
- --bg-3: #d8dcdd;
- --hover-color: white;
- --primary-color: #087E96;
- --divider-color: #d7d7d7;
- --text-color: #222226;
- --text-color-high-contrast: #313333;
- --meta-color: #5b5b65;
- --codeblock-bg: #26232e;
- --codeblock-highlight: #383444;
+ scrollbar-color: var(--primary-color) transparent;
+ accent-color: var(--primary-color);
- --theme-switcher-svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M283.211 512c78.962 0 151.079-35.925 198.857-94.792 7.068-8.708-.639-21.43-11.562-19.35-124.203 23.654-238.262-71.576-238.262-196.954 0-72.222 38.662-138.635 101.498-174.394 9.686-5.512 7.25-20.197-3.756-22.23A258.156 258.156 0 0 0 283.211 0c-141.309 0-256 114.511-256 256 0 141.309 114.511 256 256 256z'/%3E%3C/svg%3E%0A");
- color-scheme: light;
line-height: 190%;
-
font-family: var(--sans-serif-font);
}
[data-theme='dark'] {
-
- --background-color: #1f1f1f;
- --bg-0: #2f2f2f;
- --bg-1: #3c3c3c;
- --bg-2: #171717;
- --bg-3: #535555;
- --hover-color: black;
- --primary-color: #91e0ee;
- --divider-color: #4a4a4a;
- --text-color: #D4D4D4;
- --text-color-high-contrast: #eceeef;
- --meta-color: #B0B0B0;
- --codeblock-bg: #19181e;
- --codeblock-highlight: #282834;
-
- --theme-switcher-svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 96 960 960' %3E%3Cpath d='M480 776q-83 0-141.5-58.5T280 576q0-83 58.5-141.5T480 376q83 0 141.5 58.5T680 576q0 83-58.5 141.5T480 776ZM80 616q-17 0-28.5-11.5T40 576q0-17 11.5-28.5T80 536h80q17 0 28.5 11.5T200 576q0 17-11.5 28.5T160 616H80Zm720 0q-17 0-28.5-11.5T760 576q0-17 11.5-28.5T800 536h80q17 0 28.5 11.5T920 576q0 17-11.5 28.5T880 616h-80ZM480 296q-17 0-28.5-11.5T440 256v-80q0-17 11.5-28.5T480 136q17 0 28.5 11.5T520 176v80q0 17-11.5 28.5T480 296Zm0 720q-17 0-28.5-11.5T440 976v-80q0-17 11.5-28.5T480 856q17 0 28.5 11.5T520 896v80q0 17-11.5 28.5T480 1016ZM226 378l-43-42q-12-11-11.5-28t11.5-29q12-12 29-12t28 12l42 43q11 12 11 28t-11 28q-11 12-27.5 11.5T226 378Zm494 495-42-43q-11-12-11-28.5t11-27.5q11-12 27.5-11.5T734 774l43 42q12 11 11.5 28T777 873q-12 12-29 12t-28-12Zm-42-495q-12-11-11.5-27.5T678 322l42-43q11-12 28-11.5t29 11.5q12 12 12 29t-12 28l-43 42q-12 11-28 11t-28-11ZM183 873q-12-12-12-29t12-28l43-42q12-11 28.5-11t27.5 11q12 11 11.5 27.5T282 830l-42 43q-11 12-28 11.5T183 873Z'/%3E%3C/svg%3E");
- color-scheme: dark;
+ @include theme-variables('dark');
.invertible-image {
filter: invert(.88);
@@ -107,6 +120,20 @@
}
}
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme='light']) {
+ @include theme-variables('dark');
+
+ .invertible-image {
+ filter: invert(.88);
+ }
+
+ .dimmable-image {
+ filter: brightness(.8) contrast(1.2);
+ }
+ }
+}
+
html {
background-color: var(--background-color);
color: var(--text-color);
@@ -117,8 +144,8 @@ html {
body {
display: flex;
flex-direction: column;
- margin: 0 5vmin;
- padding: 0;
+ margin-inline: 5vmin;
+ margin-block: 0;
min-height: 100vh;
}
@@ -126,13 +153,18 @@ body {
word-wrap: break-word;
margin: 0 auto;
margin-top: 6vmin;
- margin-bottom: 4rem;
+ margin-block-end: 4rem;
width: 100%;
max-width: var(--max-layout-width);
}
+.use-sans-serif {
+ --serif-font: var(--sans-serif-font);
+}
+
article {
$base-margin: 6rem;
+ position: relative;
margin: 0 auto;
max-width: calc(var(--max-layout-width) - 2*$base-margin);
@@ -149,24 +181,24 @@ article {
}
.full-width {
- margin-right: -$base-margin;
- margin-left: -$base-margin;
+ margin-inline-start: -$base-margin;
+ margin-inline-end: -$base-margin;
max-width: calc(100% + 2*$base-margin);
}
li {
p:not(:last-child) {
- margin-bottom: 0;
+ margin-block-end: 0;
}
p + :last-child {
- margin-bottom: var(--paragraph-spacing);
+ margin-block-end: var(--paragraph-spacing);
}
}
}
.section-title {
- display: block;
+ display: flex;
margin: 0;
margin-top: -0.15em;
color: var(--text-color-high-contrast);
@@ -185,62 +217,44 @@ h3,
h4,
h5,
h6 {
+ display: block;
position: relative;
+ margin: 0;
}
h1 {
- display: block;
margin-top: 0.67em;
- margin-right: 0;
- margin-bottom: 0em;
- margin-left: 0;
font-weight: 550;
- font-size: 1.62em;
+ font-size: 1.62rem;
}
h2 {
- display: block;
margin-top: 0.5em;
- margin-right: 0;
- margin-bottom: 0em;
- margin-left: 0;
font-weight: 550;
- font-size: 1.4em;
+ font-size: 1.4rem;
}
h3 {
- display: block;
margin-top: 0.3em;
- margin-right: 0;
- margin-bottom: 0em;
- margin-left: 0;
font-weight: 550;
- font-size: 1.2em;
+ font-size: 1.2rem;
}
h4 {
- display: block;
margin-top: 0.83em;
- margin-right: 0;
- margin-bottom: 0em;
- margin-left: 0;
font-weight: 550;
- font-size: 1em;
+ font-size: 1rem;
}
h5 {
- display: block;
margin-top: 0.83em;
- margin-right: 0;
- margin-bottom: 0em;
- margin-left: 0;
font-weight: normal;
- font-size: 1em;
+ font-size: 1rem;
}
p {
margin-top: 0.4rem;
- margin-bottom: var(--paragraph-spacing);
+ margin-block-end: var(--paragraph-spacing);
font-size: 1em;
line-height: 2rem;
}
@@ -269,7 +283,11 @@ video {
}
.subheader {
- margin-bottom: 2rem;
+ margin-block-end: 2rem;
+}
+
+.mobile-only {
+ display: none;
}
@media only screen and (max-width: 1000px) {
@@ -283,11 +301,15 @@ video {
article .full-width {
display: block;
- margin-right: 0;
- margin-left: 0;
+ margin-inline-start: 0;
+ margin-inline-end: 0;
max-width: none;
overflow-x: auto;
}
+
+ .mobile-only {
+ display: block;
+ }
}
@media only screen and (max-width: 600px) {
@@ -301,7 +323,8 @@ video {
}
body {
- margin: 0 16px;
+ margin-inline: 16px;
+ margin-block: 0;
}
}
diff --git a/sass/parts/_admonitions.scss b/sass/parts/_admonitions.scss
index 954759a..6feec43 100644
--- a/sass/parts/_admonitions.scss
+++ b/sass/parts/_admonitions.scss
@@ -1,51 +1,26 @@
-.admonition {
- display: flex;
- align-items: flex-start;
- margin: 1em 0;
- border-left: 6px solid;
- border-radius: 10px;
- padding: 0.8rem;
- color: var(--text-color-high-contrast);
- font-family: var(--sans-serif-font);
+@mixin admonition-type($type) {
+ border-color: var(--admonition-#{$type}-border);
+ background-color: var(--admonition-#{$type}-bg);
- p {
- margin-bottom: 0;
- margin-left: -1.75rem;
- font-family: inherit;
+ > .admonition-content > p > code {
+ background-color: var(--admonition-#{$type}-code);
}
- a:hover {
- color: var(--hover-color) !important;
+ a {
+ border-bottom: 1px solid var(--admonition-#{$type}-border);
+ color: var(--admonition-#{$type}-border);
- code {
- color: var(--text-color-high-contrast) !important;
+ &:hover {
+ background-color: var(--admonition-#{$type}-border);
+ color: var(--hover-color);
}
}
-}
-.admonition-content {
- flex: 1;
- strong {
- font-weight: 580;
+ .admonition-icon {
+ background-color: var(--admonition-#{$type}-border);
}
}
-.admonition-icon {
- display: flex;
- align-items: center;
- margin: 0.3rem;
- background-size: contain;
- background-repeat: no-repeat;
- aspect-ratio: 1/1;
- width: 1.5rem;
-}
-
-.admonition-title {
- opacity: 0.92;
- font-weight: bold;
- font-size: 0.82rem;
-}
-
:root {
/* Note */
--admonition-note-border: #5b6167;
@@ -73,7 +48,7 @@
--admonition-danger-code: #fcc1c5;
}
-[data-theme='dark'] {
+@mixin dark-theme-variables {
/* Note */
--admonition-note-border: #d0d1d4;
--admonition-note-bg: #3d3e40;
@@ -87,7 +62,7 @@
/* Info */
--admonition-info-border: #50a9d5;
--admonition-info-bg: #193C47;
- --admonition-info-code: #005f00;
+ --admonition-info-code: #245e70;
/* Warning */
--admonition-warning-border: #e19d0a;
@@ -100,119 +75,85 @@
--admonition-danger-code: #8c2e00;
}
-.admonition.note {
- border-color: var(--admonition-note-border);
- background-color: var(--admonition-note-bg);
+[data-theme='dark'] {
+ @include dark-theme-variables;
+}
- code {
- background-color: var(--admonition-note-code) !important;
- }
-
- a {
- border-bottom: 1px solid var(--admonition-note-border);
- color: var(--admonition-note-border);
-
- &:hover {
- background-color: var(--admonition-note-border);
- }
- }
-
- .admonition-icon {
- -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3E%3C/svg%3E");
- background-color: var(--admonition-note-border);
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme='light']) {
+ @include dark-theme-variables;
}
}
-.admonition.tip {
- border-color: var(--admonition-tip-border);
- background-color: var(--admonition-tip-bg);
+.admonition {
+ display: flex;
+ align-items: flex-start;
+ margin-block: 1em;
+ border-radius: 10px;
+ border-inline-start: 6px solid;
+ padding: 0.8rem;
+ color: var(--text-color-high-contrast);
+ font-family: var(--sans-serif-font);
- code {
- background-color: var(--admonition-tip-code) !important;
+ p {
+ margin-inline-start: -1.75rem;
+ margin-block-end: 0;
+ font-family: inherit;
}
a {
- border-bottom: 1px solid var(--admonition-tip-border);
- color: var(--admonition-tip-border);
-
- &:hover {
- background-color: var(--admonition-tip-border);
+ code {
+ color: inherit;
}
}
-
- .admonition-icon {
- -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M480-78.258q-33.718 0-56.974-22.166-23.256-22.167-23.59-55.885h161.128q-.334 33.718-23.59 55.885Q513.718-78.258 480-78.258ZM318.257-210.515v-67.588h323.486v67.588H318.257Zm7.846-121.128q-67.692-42.487-106.896-109.134-39.205-66.648-39.205-147.479 0-123.769 88.149-211.884 88.149-88.115 211.967-88.115 123.817 0 211.849 88.115 88.031 88.115 88.031 211.884 0 80.831-38.999 147.479-39 66.647-107.102 109.134H326.103Zm21.927-67.588h264.351q46.311-32 73.17-81.681 26.859-49.68 26.859-107.144 0-96.918-68-164.765-68-67.846-164.564-67.846t-164.41 67.713q-67.846 67.712-67.846 164.725 0 57.52 26.859 107.259t73.581 81.739Zm131.97 0Z'/%3E%3C/svg%3E");
- background-color: var(--admonition-tip-border);
- }
}
-.admonition.info {
- border-color: var(--admonition-info-border);
- background-color: var(--admonition-info-bg);
-
- code {
- background-color: var(--admonition-info-code) !important;
- }
-
- a {
- border-bottom: 1px solid var(--admonition-info-border);
- color: var(--admonition-info-border);
-
- &:hover {
- background-color: var(--admonition-info-border);
- }
- }
-
- .admonition-icon {
- -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M479.789-288Q495-288 505.5-298.289q10.5-10.29 10.5-25.5Q516-339 505.711-349.5q-10.29-10.5-25.5-10.5Q465-360 454.5-349.711q-10.5 10.29-10.5 25.5Q444-309 454.289-298.5q10.29 10.5 25.5 10.5ZM444-432h72v-240h-72v240Zm36.276 336Q401-96 331-126q-70-30-122.5-82.5T126-330.958q-30-69.959-30-149.5Q96-560 126-629.5t82.5-122Q261-804 330.958-834q69.959-30 149.5-30Q560-864 629.5-834t122 82.5Q804-699 834-629.276q30 69.725 30 149Q864-401 834-331q-30 70-82.5 122.5T629.276-126q-69.725 30-149 30ZM480-168q130 0 221-91t91-221q0-130-91-221t-221-91q-130 0-221 91t-91 221q0 130 91 221t221 91Zm0-312Z'/%3E%3C/svg%3E");
- background-color: var(--admonition-info-border);
+.admonition-content {
+ flex: 1;
+ strong {
+ font-weight: 580;
}
}
-.admonition.warning {
- border-color: var(--admonition-warning-border);
- background-color: var(--admonition-warning-bg);
-
- code {
- background-color: var(--admonition-warning-code) !important;
- }
-
- a {
- border-bottom: 1px solid var(--admonition-warning-border);
- color: var(--admonition-warning-border);
-
- &:hover {
- background-color: var(--admonition-warning-border);
- }
- }
-
- .admonition-icon {
- -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M109-120q-11 0-20-5.5T75-140q-5-9-5.5-19.5T75-180l370-640q6-10 15.5-15t19.5-5q10 0 19.5 5t15.5 15l370 640q6 10 5.5 20.5T885-140q-5 9-14 14.5t-20 5.5H109Zm69-80h604L480-720 178-200Zm302-40q17 0 28.5-11.5T520-280q0-17-11.5-28.5T480-320q-17 0-28.5 11.5T440-280q0 17 11.5 28.5T480-240Zm0-120q17 0 28.5-11.5T520-400v-120q0-17-11.5-28.5T480-560q-17 0-28.5 11.5T440-520v120q0 17 11.5 28.5T480-360Zm0-100Z'/%3E%3C/svg%3E");
-
- background-color: var(--admonition-warning-border);
- }
+.admonition-icon {
+ display: flex;
+ align-items: center;
+ margin: 0.3rem;
+ background-size: contain;
+ background-repeat: no-repeat;
+ aspect-ratio: 1/1;
+ width: 1.5rem;
}
-.admonition.danger {
- border-color: var(--admonition-danger-border);
- background-color: var(--admonition-danger-bg);
-
- code {
- background-color: var(--admonition-danger-code) !important;
- }
-
- a {
- border-bottom: 1px solid var(--admonition-danger-border);
- color: var(--admonition-danger-border);
-
- &:hover {
- background-color: var(--admonition-danger-border);
- }
- }
-
- .admonition-icon {
- -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M239.256-400q0 58.091 27.975 108.995t76.13 81.237q-5.616-8.513-8.487-18.398-2.872-9.885-2.872-19.167 1.333-26.436 12.153-50.307 10.821-23.872 31.41-43.461L480-443.921l105.819 102.82q18.923 19.311 29.885 43.321 10.961 24.011 12.294 50.447 0 9.282-2.872 19.167-2.871 9.885-7.82 18.398 47.488-30.333 75.796-81.237Q721.41-341.909 721.41-400q0-47.622-19.258-93.169-19.259-45.547-53.998-82.549-19.951 13.41-42.202 19.859Q583.7-549.41 561-549.41q-62.448 0-105.108-38.039-42.661-38.038-51.225-98.628v-9.744q-39.385 31.949-69.898 67.68-30.513 35.73-51.987 74.166t-32.5 77.464Q239.256-437.483 239.256-400ZM480-349.539l-57.436 56.436q-12.154 11.821-17.731 26.029-5.577 14.208-5.577 29.074 0 32.769 23.498 55.757 23.497 22.987 57.246 22.987 33.432 0 57.421-22.906 23.989-22.906 23.989-55.561 0-16.162-6.116-30.162-6.116-13.999-17.454-25.154l-57.84-56.5Zm-11.002-469.022V-708q0 38.637 26.832 64.819 26.831 26.183 65.17 26.183 15.609 0 30.818-5.923 15.208-5.923 28.131-17.718l22.615-24.102q67.564 44.128 106.999 114.917 39.435 70.79 39.435 150.156 0 128.206-89.846 218.103Q609.307-91.668 480-91.668q-129.027 0-218.68-89.652-89.652-89.653-89.652-218.68 0-119.178 79.371-232.447t217.959-186.114Z'/%3E%3C/svg%3E");
-
- background-color: var(--admonition-danger-border);
- }
+.admonition-title {
+ opacity: 0.92;
+ font-weight: bold;
+ font-size: 0.82rem;
}
+
+
+.admonition-icon-note {
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3E%3C/svg%3E");
+}
+
+.admonition-icon-tip {
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M480-78.258q-33.718 0-56.974-22.166-23.256-22.167-23.59-55.885h161.128q-.334 33.718-23.59 55.885Q513.718-78.258 480-78.258ZM318.257-210.515v-67.588h323.486v67.588H318.257Zm7.846-121.128q-67.692-42.487-106.896-109.134-39.205-66.648-39.205-147.479 0-123.769 88.149-211.884 88.149-88.115 211.967-88.115 123.817 0 211.849 88.115 88.031 88.115 88.031 211.884 0 80.831-38.999 147.479-39 66.647-107.102 109.134H326.103Zm21.927-67.588h264.351q46.311-32 73.17-81.681 26.859-49.68 26.859-107.144 0-96.918-68-164.765-68-67.846-164.564-67.846t-164.41 67.713q-67.846 67.712-67.846 164.725 0 57.52 26.859 107.259t73.581 81.739Zm131.97 0Z'/%3E%3C/svg%3E");
+}
+
+.admonition-icon-info {
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M479.789-288Q495-288 505.5-298.289q10.5-10.29 10.5-25.5Q516-339 505.711-349.5q-10.29-10.5-25.5-10.5Q465-360 454.5-349.711q-10.5 10.29-10.5 25.5Q444-309 454.289-298.5q10.29 10.5 25.5 10.5ZM444-432h72v-240h-72v240Zm36.276 336Q401-96 331-126q-70-30-122.5-82.5T126-330.958q-30-69.959-30-149.5Q96-560 126-629.5t82.5-122Q261-804 330.958-834q69.959-30 149.5-30Q560-864 629.5-834t122 82.5Q804-699 834-629.276q30 69.725 30 149Q864-401 834-331q-30 70-82.5 122.5T629.276-126q-69.725 30-149 30ZM480-168q130 0 221-91t91-221q0-130-91-221t-221-91q-130 0-221 91t-91 221q0 130 91 221t221 91Zm0-312Z'/%3E%3C/svg%3E");
+}
+
+.admonition-icon-warning {
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M109-120q-11 0-20-5.5T75-140q-5-9-5.5-19.5T75-180l370-640q6-10 15.5-15t19.5-5q10 0 19.5 5t15.5 15l370 640q6 10 5.5 20.5T885-140q-5 9-14 14.5t-20 5.5H109Zm69-80h604L480-720 178-200Zm302-40q17 0 28.5-11.5T520-280q0-17-11.5-28.5T480-320q-17 0-28.5 11.5T440-280q0 17 11.5 28.5T480-240Zm0-120q17 0 28.5-11.5T520-400v-120q0-17-11.5-28.5T480-560q-17 0-28.5 11.5T440-520v120q0 17 11.5 28.5T480-360Zm0-100Z'/%3E%3C/svg%3E");
+}
+
+.admonition-icon-danger {
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M239.256-400q0 58.091 27.975 108.995t76.13 81.237q-5.616-8.513-8.487-18.398-2.872-9.885-2.872-19.167 1.333-26.436 12.153-50.307 10.821-23.872 31.41-43.461L480-443.921l105.819 102.82q18.923 19.311 29.885 43.321 10.961 24.011 12.294 50.447 0 9.282-2.872 19.167-2.871 9.885-7.82 18.398 47.488-30.333 75.796-81.237Q721.41-341.909 721.41-400q0-47.622-19.258-93.169-19.259-45.547-53.998-82.549-19.951 13.41-42.202 19.859Q583.7-549.41 561-549.41q-62.448 0-105.108-38.039-42.661-38.038-51.225-98.628v-9.744q-39.385 31.949-69.898 67.68-30.513 35.73-51.987 74.166t-32.5 77.464Q239.256-437.483 239.256-400ZM480-349.539l-57.436 56.436q-12.154 11.821-17.731 26.029-5.577 14.208-5.577 29.074 0 32.769 23.498 55.757 23.497 22.987 57.246 22.987 33.432 0 57.421-22.906 23.989-22.906 23.989-55.561 0-16.162-6.116-30.162-6.116-13.999-17.454-25.154l-57.84-56.5Zm-11.002-469.022V-708q0 38.637 26.832 64.819 26.831 26.183 65.17 26.183 15.609 0 30.818-5.923 15.208-5.923 28.131-17.718l22.615-24.102q67.564 44.128 106.999 114.917 39.435 70.79 39.435 150.156 0 128.206-89.846 218.103Q609.307-91.668 480-91.668q-129.027 0-218.68-89.652-89.652-89.653-89.652-218.68 0-119.178 79.371-232.447t217.959-186.114Z'/%3E%3C/svg%3E");
+}
+
+.admonition.note { @include admonition-type('note'); }
+.admonition.tip { @include admonition-type('tip'); }
+.admonition.info { @include admonition-type('info'); }
+.admonition.warning { @include admonition-type('warning'); }
+.admonition.danger { @include admonition-type('danger'); }
diff --git a/sass/parts/_archive.scss b/sass/parts/_archive.scss
index 5f4b806..6df323b 100644
--- a/sass/parts/_archive.scss
+++ b/sass/parts/_archive.scss
@@ -1,21 +1,22 @@
.archive {
- margin-top: 4vmin;
+ margin-block-start: 4vmin;
.listing-title {
- margin-bottom: 1rem;
+ margin-block-end: 1rem;
font-size: 1.5rem;
}
.listing-item {
display: flex;
gap: 1rem;
- margin-bottom: 0.5rem;
- padding: 0.2rem 1rem;
+ margin-block-end: 0.5rem;
+ padding-inline: 1rem;
+ padding-block: 0.2rem;
.post-time {
- padding-left: 1vmin;
- min-width: 5rem;
- text-align: left;
+ padding-inline-start: 1vmin;
+ min-inline-size: 5rem;
+ text-align: start;
.date {
color: var(--meta-color);
diff --git a/sass/parts/_aside.scss b/sass/parts/_aside.scss
new file mode 100644
index 0000000..4757524
--- /dev/null
+++ b/sass/parts/_aside.scss
@@ -0,0 +1,31 @@
+aside {
+ margin-block-end: var(--paragraph-spacing);
+ border-radius: 4px;
+ background: var(--bg-0);
+ padding-block: 0.8rem;
+ padding-inline: 1rem;
+ color: var(--meta-color);
+ font-size: 0.9rem;
+
+ article & p {
+ margin: 0;
+ font-family: var(--sans-serif-font);
+ }
+
+ @media only screen and (min-width: 1300px) {
+ position: absolute;
+ inset-inline-start: -14rem;
+ margin-block: 0;
+ border-radius: 0;
+ background: none;
+ padding: 0;
+ width: 12rem;
+ text-align: end;
+
+ &[data-position="right"] {
+ inset-inline-start: auto;
+ inset-inline-end: -14rem;
+ text-align: start;
+ }
+ }
+}
diff --git a/sass/parts/_cards.scss b/sass/parts/_cards.scss
index c956881..0b6c560 100644
--- a/sass/parts/_cards.scss
+++ b/sass/parts/_cards.scss
@@ -1,10 +1,51 @@
+.filter-controls {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+ gap: 12px;
+ margin-top: 1.2rem;
+ margin-bottom: -1rem;
+ padding: 0;
+ list-style: none;
+
+ #all-projects-filter {
+ display: none;
+ }
+
+ .taxonomy-item {
+ margin: 0;
+
+ a {
+ display: inline-block;
+ box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px;
+ border-radius: 1rem;
+ background: var(--bg-2);
+ padding: 0 16px;
+ color: var(--text-color);
+ font-size: 0.8rem;
+ text-decoration: none;
+
+ &:hover {
+ background: var(--primary-color);
+ color: var(--hover-color);
+ }
+
+ &.active {
+ background: var(--primary-color);
+ color: var(--hover-color);
+ }
+ }
+ }
+}
+
.cards {
display: grid;
grid-template-rows: auto;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 24px;
margin-top: 4vmin;
- padding: 12px 0;
+ padding-block: 12px;
.card {
box-shadow: rgba(50, 50, 93, 0.25) 0px 2px 5px -1px, rgba(0, 0, 0, 0.3) 0px 1px 3px -1px;
@@ -22,16 +63,17 @@
}
.card-info {
- padding: 0 24px 24px;
+ padding-inline: 24px;
+ padding-block-start: 0;
+ padding-block-end: 24px;
text-align: center;
}
-
- .card-title {
- margin-top: 0.7em;
- }
-
.card-image {
- width: 100%;
+ $margin: 1.6rem;
+ margin: $margin;
+ margin-bottom: $margin / 1.5;
+ width: calc(100% - $margin * 2);
+ height: auto;
}
.card-image-placeholder {
@@ -51,4 +93,13 @@
.cards {
gap: 18px;
}
+
+ .filter-controls {
+ gap: 8px;
+ margin: 18px 0;
+
+ .taxonomy-item a {
+ padding: 4px 12px;
+ }
+ }
}
diff --git a/sass/parts/_code.scss b/sass/parts/_code.scss
index 7fdc566..2623f50 100644
--- a/sass/parts/_code.scss
+++ b/sass/parts/_code.scss
@@ -1,7 +1,9 @@
code {
+ -webkit-text-size-adjust: 100%;
border-radius: 5px;
background-color: var(--bg-1);
- padding: 0.1em 0.2em;
+ padding-inline: 0.2em;
+ padding-block: 0.1em;
font-size: 0.9rem;
font-family: var(--code-font);
@@ -17,7 +19,7 @@ code {
border-collapse: collapse;
border-spacing: 0rem;
width: 100%;
- text-align: left;
+ text-align: start;
td,
th,
@@ -26,10 +28,13 @@ code {
padding: 0rem;
}
+ // Line number col.
tbody td:first-child {
- width: 2rem;
+ opacity: 50%;
+ padding-inline-end: 0.8rem;
+ width: 1px; // Without this, iOS Safari centres short lines.
user-select: none;
- text-align: left;
+ text-align: end;
}
tbody tr:nth-child(even) {
@@ -40,17 +45,46 @@ code {
a:hover code {
background-color: inherit;
+ padding-block: 0;
}
pre {
display: block;
position: relative;
border-radius: 5px;
- padding: 2.4rem 1rem 1rem;
+ padding-inline: 1rem;
+ padding-block-start: 2.4rem;
+ padding-block-end: 1rem;
overflow: hidden;
overflow-x: auto;
line-height: 1.4;
+ code,
+ code td {
+ font-size: 0.8rem; // Fits ~77 characters.
+ }
+
+ // Supports both native Zola way of adding src, and old shortcode-based logic.
+ // See: https://github.com/welpo/tabi/pull/489
+ &::after,
+ code .source-path {
+ display: block;
+ position: absolute;
+ top: 0;
+ inset-inline-end: 1.3rem;
+ padding-top: 0.3rem;
+ padding-inline-end: 1.3rem;
+ max-width: calc(100% - 14em);
+ height: 0.9rem;
+ overflow: hidden;
+ content: attr(data-name);
+ color: var(--hover-color);
+ font-size: 0.65rem;
+ text-align: end;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
code {
display: block;
border: 0rem;
@@ -59,42 +93,36 @@ pre {
padding: 0rem;
overflow-x: auto;
color: inherit;
- font-size: 0.8rem; // Fits ~77 characters.
white-space: pre;
&::before {
display: block;
position: absolute;
top: 0;
- left: 0;
+ inset-inline-start: 0;
background-color: var(--primary-color);
padding: 0.3rem;
- padding-left: 1rem;
+ padding-inline-start: 1rem;
width: calc(100% - 1.3rem);
height: 0.9rem;
content: attr(data-lang);
color: var(--hover-color);
font-size: 0.65rem;
- text-align: left;
+ text-align: start;
text-transform: uppercase;
}
+ }
+}
- .source-path {
- display: block;
- position: absolute;
- top: 0;
- right: 1.3rem;
- padding-top: 0.3rem;
- padding-right: 1.3rem;
- max-width: calc(100% - 14em);
- height: 0.9rem;
- overflow: hidden;
- color: var(--hover-color);
- font-size: 0.65rem;
- text-align: right;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
+// Default to LTR codeblocks.
+code, pre {
+ direction: ltr;
+}
+
+// Allows RTL codeblocks if `force_codeblock_ltr` is set to false.
+html[data-code-direction="inherit"] {
+ code, pre {
+ direction: inherit;
}
}
@@ -102,10 +130,10 @@ pre {
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M217.002-67.694q-37.732 0-64.02-26.288-26.287-26.287-26.287-64.019V-707.69h77.999v549.689q0 4.615 3.846 8.462 3.846 3.846 8.462 3.846h451.689v77.999H217.002Zm175.999-175.999q-37.733 0-64.02-26.287T302.694-334v-463.383q0-37.732 26.287-64.02 26.287-26.287 64.02-26.287h365.383q37.732 0 64.019 26.287 26.288 26.288 26.288 64.02V-334q0 37.733-26.288 64.02-26.287 26.287-64.019 26.287H393.001Zm0-77.998h365.383q4.615 0 8.462-3.847 3.846-3.846 3.846-8.462v-463.383q0-4.616-3.846-8.462-3.847-3.846-8.462-3.846H393.001q-4.616 0-8.462 3.846-3.847 3.846-3.847 8.462V-334q0 4.616 3.847 8.462 3.846 3.847 8.462 3.847Zm-12.309 0v-488V-321.691Z'/%3E%3C/svg%3E");
position: absolute;
top: 0.3rem;
- right: 0.7rem;
align-self: center;
z-index: 1;
cursor: pointer;
+ inset-inline-end: 0.7rem;
background: var(--hover-color);
background-size: contain;
width: 0.9rem;
diff --git a/sass/parts/_comments.scss b/sass/parts/_comments.scss
index 2b3d8d2..aab54d9 100644
--- a/sass/parts/_comments.scss
+++ b/sass/parts/_comments.scss
@@ -23,7 +23,8 @@
margin: 0.5em auto;
border: none;
background: none;
- padding: 0.5em 1em;
+ padding-block: 0.5em;
+ padding-inline: 1em;
color: inherit;
font-size: 0.95rem;
font-family: var(--sans-serif-font);
diff --git a/sass/parts/_footer.scss b/sass/parts/_footer.scss
index 920cd2d..2b49c3d 100644
--- a/sass/parts/_footer.scss
+++ b/sass/parts/_footer.scss
@@ -1,6 +1,6 @@
footer {
margin-top: auto;
- margin-bottom: 1.4rem;
+ margin-block-end: 1.4rem;
color: var(--meta-color);
font-size: 0.88rem;
font-family: var(--post-font-family);
@@ -66,7 +66,7 @@ footer nav {
}
}
-[data-theme="dark"] {
+@mixin dark-theme-social {
.social {
&:hover {
& > img {
@@ -79,3 +79,13 @@ footer nav {
}
}
}
+
+[data-theme="dark"] {
+ @include dark-theme-social;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme="light"]) {
+ @include dark-theme-social;
+ }
+}
diff --git a/sass/parts/_header-anchor.scss b/sass/parts/_header-anchor.scss
index 9d49833..8a06200 100644
--- a/sass/parts/_header-anchor.scss
+++ b/sass/parts/_header-anchor.scss
@@ -4,8 +4,8 @@
justify-content: center;
align-items: center;
opacity: 0;
- margin-left: -2rem;
- padding-right: 0.3rem;
+ margin-inline-start: -2rem;
+ padding-inline-end: 0.3rem;
width: 1.9rem;
height: 100%;
user-select: none;
@@ -15,11 +15,6 @@
}
}
-:dir(rtl) .header-anchor {
- margin-right: -2rem;
- padding-left: 0.3rem;
-}
-
.link-icon {
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M14.78 3.653a3.936 3.936 0 1 1 5.567 5.567l-3.627 3.627a3.936 3.936 0 0 1-5.88-.353.75.75 0 0 0-1.18.928 5.436 5.436 0 0 0 8.12.486l3.628-3.628a5.436 5.436 0 1 0-7.688-7.688l-3 3a.75.75 0 0 0 1.06 1.061l3-3Z'%3E%3C/path%3E%3Cpath d='M7.28 11.153a3.936 3.936 0 0 1 5.88.353.75.75 0 0 0 1.18-.928 5.436 5.436 0 0 0-8.12-.486L2.592 13.72a5.436 5.436 0 1 0 7.688 7.688l3-3a.75.75 0 1 0-1.06-1.06l-3 3a3.936 3.936 0 0 1-5.567-5.568l3.627-3.627Z'%3E%3C/path%3E%3C/svg%3E");
align-self: center;
diff --git a/sass/parts/_header.scss b/sass/parts/_header.scss
index 9282187..d88bfe3 100644
--- a/sass/parts/_header.scss
+++ b/sass/parts/_header.scss
@@ -4,7 +4,7 @@ header {
}
.page-header {
- margin: 4rem 0px 1rem 0px;
+ margin-block: 4rem 1rem;
font-size: 3em;
line-height: 100%;
font-family: var(--header-font);
@@ -17,19 +17,20 @@ header {
justify-content: space-between;
align-items: center;
margin: 0 auto;
- padding: 1em 0;
+ padding-block: 1em;
max-width: var(--max-layout-width);
}
.nav-navs {
display: flex;
flex-wrap: wrap;
+ align-items: center;
ul {
display: flex;
- flex-wrap: wrap;
- justify-content: center;
- align-items: center;
+ flex-wrap: inherit;
+ justify-content: inherit;
+ align-items: inherit;
gap: 1px;
margin: 0;
padding: 0;
@@ -37,6 +38,18 @@ header {
}
}
+.menu-icons-container {
+ display: flex;
+ align-items: center;
+ margin-left: auto;
+}
+
+.menu-icons-group {
+ gap: 1px;
+ margin: 0;
+ padding: 0;
+}
+
.nav-links {
justify-content: right;
padding: 0.66rem;
@@ -48,7 +61,7 @@ header {
}
.home-title {
- margin-left: -0.12rem;
+ margin-inline-start: -0.12rem;
border: none;
padding: 0.12rem;
color: var(--primary-color);
@@ -76,17 +89,28 @@ header {
ul,
li {
- display: inline;
+ display: inline-block;
+ margin-inline-end: 0.2rem;
font-family: var(--sans-serif-font);
list-style-type: none;
}
+
+ .tag {
+ margin-inline-end: 0;
+ }
}
+
+.separator {
+ margin-inline-end: 0.2rem;
+ user-select: none;
+}
+
.language-switcher {
display: flex;
justify-content: center;
align-items: center;
- margin-right: 0.5rem;
- margin-left: 0.5rem;
+ margin-inline-start: 0.5rem;
+ margin-inline-end: 0.5rem;
.language-switcher-icon {
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-width='1.8' d='M1 12a11 11 90 0 0 22 0 11 11 90 0 0-22 0m1-4h20M2 16h20M11 1a21 21 90 0 0 0 22m2-22a21 21 90 0 1 0 22'/%3E%3C/svg%3E%0A");
@@ -101,6 +125,28 @@ header {
background: var(--meta-color);
}
}
+
+ .language-switcher-icon-with-code {
+ margin-inline-end: 0.3rem;
+ width: 0.7rem;
+ height: 0.7rem;
+ }
+}
+
+.language-switcher-icon-code {
+ position: absolute;
+ top: -0.15rem;
+ z-index: 10;
+ inset-inline-start: 0.7rem;
+ width: 100%;
+ height: 100%;
+ color: var(--text-color);
+ font-size: 0.5rem;
+ text-transform: uppercase;
+
+ &:hover {
+ color: var(--meta-color);
+ }
}
.dropdown {
@@ -129,8 +175,8 @@ header {
transform: translateX(-50%);
z-index: 1;
background: var(--background-color);
- padding-right: 0.5rem;
- padding-left: 0.5rem;
+ padding-inline-start: 0.5rem;
+ padding-inline-end: 0.5rem;
text-align: center;
white-space: nowrap;
@@ -147,21 +193,21 @@ header {
.nav-navs {
display: flex;
- justify-content: flex-end;
+ justify-content: center;
+ }
+
+ .menu-icons-container {
+ margin-left: 0;
}
}
@media only screen and (max-width: 600px) {
.nav-navs {
- flex-wrap: wrap;
- justify-content: center;
margin-top: 0.8rem;
- width: 100%;
}
.navbar {
flex-direction: column;
- justify-content: center;
align-items: center;
}
}
diff --git a/sass/parts/_home-banner.scss b/sass/parts/_home-banner.scss
index 9b63566..ce6b9c1 100644
--- a/sass/parts/_home-banner.scss
+++ b/sass/parts/_home-banner.scss
@@ -1,29 +1,34 @@
#banner-container-home {
display: flex;
- justify-content: center;
- align-items: center;
+ justify-content: space-between;
+ align-items: flex-start;
margin: 0.2rem auto;
width: 100%;
@media only screen and (max-width: 600px) {
display: block;
- margin-bottom: 2rem;
+ margin-block-end: 2rem;
}
#home-banner-text {
- margin-bottom: 1.5rem;
+ flex: 1;
+ margin-block-end: 1.5rem;
color: var(--primary-color);
font-size: 1.875rem;
line-height: 3rem;
+ li {
+ font-size: 1rem;
+ }
+
#home-banner-header {
margin: 0;
- margin-bottom: 1rem;
+ margin-block-end: 1rem;
font-weight: 550;
font-size: 2.8rem;
@media only screen and (max-width: 600px) {
- margin-bottom: 0;
+ margin-block-end: 0;
font-size: 2.2rem;
}
}
@@ -49,9 +54,9 @@
#image-container-home {
position: relative;
- padding-left: 2rem;
- min-width: 11rem;
- min-height: 11rem;
+ margin: auto 0;
+ padding-inline-start: 2rem;
+ max-width: 11rem;
overflow: hidden;
text-align: center;
@@ -59,9 +64,8 @@
border: none;
aspect-ratio: 1 / 1;
width: 100%;
- max-width: 15rem;
- height: auto;
- max-height: 15rem;
+ height: 100%;
+ object-fit: cover;
@media only screen and (max-width: 600px) {
max-width: 12rem;
@@ -70,7 +74,9 @@
}
@media only screen and (max-width: 600px) {
- padding-left: 0;
+ padding-inline-start: 0;
+ width: 100%;
+ max-width: none;
}
}
}
diff --git a/sass/parts/_iine.scss b/sass/parts/_iine.scss
new file mode 100644
index 0000000..9ac95c4
--- /dev/null
+++ b/sass/parts/_iine.scss
@@ -0,0 +1,37 @@
+.iine-button {
+ display: inline-flex;
+ align-items: center;
+ gap: 5px;
+ transition: background-color 0.2s ease, color 0.2s ease, border-color 0.2s ease;
+ cursor: pointer;
+ border: none;
+ background: transparent;
+ color: inherit;
+ font-family: var(--sans-serif-font);
+ -webkit-tap-highlight-color: transparent;
+ appearance: none;
+ margin: 0;
+ padding: 0;
+ font-size: inherit;
+ line-height: inherit;
+
+ .icon {
+ display: inline-flex;
+ align-items: center;
+ }
+
+ .counter {
+ margin-left: .2rem;
+ font-size: 0.8rem;
+ }
+
+ svg {
+ width: 1em;
+ height: 1em;
+ }
+}
+
+.iine-auto-buttons {
+ margin-top: 2rem;
+ padding: 1rem 0;
+}
diff --git a/sass/parts/_image.scss b/sass/parts/_image.scss
index 6960b89..e8bae01 100644
--- a/sass/parts/_image.scss
+++ b/sass/parts/_image.scss
@@ -27,7 +27,7 @@ img.inline {
figure h4 {
margin: 0;
- margin-bottom: 1em;
+ margin-block-end: 1em;
font-size: 1rem;
}
diff --git a/sass/parts/_misc.scss b/sass/parts/_misc.scss
index 7a7c486..52fec23 100644
--- a/sass/parts/_misc.scss
+++ b/sass/parts/_misc.scss
@@ -1,7 +1,16 @@
+kbd {
+ border: 1px solid var(--divider-color);
+ border-radius: 5px;
+ background-color: var(--bg-0);
+ padding: 0.1rem 0.3rem;
+ font-size: 0.8rem;
+}
+
.draft-label {
- margin-right: 0.3rem;
+ margin-inline-end: 0.3rem;
background-color: var(--primary-color);
- padding: 2px 4px;
+ padding-inline: 4px;
+ padding-block: 2px;
color: var(--hover-color);
}
@@ -16,9 +25,9 @@
iframe {
display: block;
- margin-right: 15%;
- margin-bottom: 3vmin;
- margin-left: 15%;
+ margin-inline-start: 15%;
+ margin-inline-end: 15%;
+ margin-block-end: 3vmin;
border: none;
aspect-ratio: 16/9;
width: 100vmin;
@@ -30,7 +39,7 @@ ul {
}
.toc-container {
- margin-bottom: 4vmin;
+ margin-block-end: 4vmin;
}
.padding-top {
@@ -39,6 +48,9 @@ ul {
.title-container {
padding-bottom: 8px;
+ .social {
+ margin-inline-start: 0.5rem;
+ }
}
.bottom-divider {
@@ -62,8 +74,8 @@ ul {
blockquote {
margin: 0;
- border-left: 0.3rem solid var(--primary-color);
- padding-left: 1em;
+ border-inline-start: 0.3rem solid var(--primary-color);
+ padding-inline-start: 1em;
}
a {
@@ -73,21 +85,54 @@ a {
text-decoration: inherit;
}
+// External link styles with `external_links_class = "external"`.
+main {
+ --external-link-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M11 5h-6v14h14v-6'/%3E%3Cpath d='M13 11l7 -7'/%3E%3Cpath d='M21 3h-6M21 3v6'/%3E%3C/g%3E%3C/svg%3E");
+
+ a.external:not(:has(img, svg, video, picture, figure))::after {
+ display: inline-block;
+ vertical-align: -0.05em;
+ margin-inline-start: 0.1em;
+ background-color: currentColor;
+ width: 0.8em;
+ height: 0.8em;
+ content: '';
+ -webkit-mask-image: var(--external-link-icon);
+ -webkit-mask-size: 100% 100%;
+ }
+
+ &:dir(rtl) a.external:not(:has(img, svg, video, picture, figure))::after {
+ transform: rotate(-90deg);
+ }
+
+ .meta a.external:not(:has(img, svg, video, picture, figure))::after {
+ background-color: var(--meta-color);
+ }
+
+ a.external:not(:has(img, svg, video, picture, figure)):hover::after {
+ background-color: var(--hover-color);
+ }
+}
+
a:hover {
background-color: var(--primary-color);
color: var(--hover-color);
}
-a:not(.no-hover-padding):hover::after {
+a:hover rt {
+ color: var(--text-color);
+}
+
+a:not(.no-hover-padding):hover::before {
display: inline-block;
position: absolute;
- top: 0;
- right: -0.15em;
- bottom: 0;
- left: -0.15em;
z-index: -1;
+ inset-block-end: 0;
+ inset-block-start: 0;
+ inset-inline-end: -0.15em;
+ inset-inline-start: -0.15em;
background-color: var(--primary-color);
- max-width: 105%; // This fixes multi-line links (see #225)
+ max-inline-size: 105%;
content: "";
}
@@ -105,16 +150,21 @@ hr {
height: 1px;
}
+.footnotes-list,
+.footnotes {
+ text-align: start;
+}
+
.footnote-reference {
font-size: 0.7rem;
font-family: var(--serif-font);
}
.footnote-definition {
- margin-bottom: 0.6rem;
+ margin-block-end: 0.6rem;
sup {
- margin-right: 0.15rem;
+ margin-inline-end: 0.15rem;
font-size: 0.75rem;
font-family: var(--serif-font);
}
@@ -125,21 +175,30 @@ hr {
}
.footnote-backlink {
- margin-left: 0.2rem;
+ margin-inline-start: 0.2rem;
+ font-size: 0.8rem;
+}
+
+.footnotes-list a[href^="#fr-"],
+.footnotes a[href^="#fr-"] {
+ font-size: 0.8rem;
+}
+
+.footnotes code {
font-size: 0.8rem;
}
.references p {
- margin-left: 2.4rem;
+ margin-inline-start: 2.4rem;
text-indent: -2.4rem;
}
.info-box {
margin-top: 1rem;
- margin-bottom: 1rem;
+ margin-block-end: 1rem;
border: 1px solid var(--primary-color);
- border-left-width: 0.3rem;
border-radius: 10px;
+ border-inline-start-width: 0.3rem;
padding: 1rem;
text-align: center;
}
@@ -183,18 +242,18 @@ details summary {
.article-navigation {
display: flex;
- margin-top: 2rem;
- border-top: var(--divider-color) solid 0.5px;
- padding-top: 2rem;
+ margin-block-start: 2rem;
+ border-block-start: var(--divider-color) solid 0.5px;
+ padding-block-start: 2rem;
div:first-child {
flex: 1;
- text-align: left;
+ text-align: start;
}
div:last-child {
flex: 1;
- text-align: right;
+ text-align: end;
}
div p {
@@ -214,23 +273,83 @@ details summary {
}
}
-:dir(rtl) .article-navigation {
- div:first-child {
- text-align: right;
- }
-
- div:last-child {
- text-align: left;
- }
-}
-
:dir(rtl) .arrow {
display: inline-block;
- transform: rotate(180deg);
+ transform: scaleX(-1);
}
// This for the arrows that point to a corner, (e.g. '↗', '↘', '↙', '↖')
:dir(rtl) .arrow-corner {
display: inline-block;
- transform: rotate(270deg);
+ transform: rotate(-90deg);
+}
+
+.mermaid p {
+ font-family: var(--sans-serif-font) !important;
+}
+
+.mermaid .node .label {
+ max-width: none !important;
+}
+
+// For the `force_text_direction` shortcode.
+[data-force-text-direction="ltr"] {
+ direction: ltr;
+ unicode-bidi: bidi-override;
+}
+
+[data-force-text-direction="rtl"] {
+ direction: rtl;
+ unicode-bidi: bidi-override;
+}
+
+[data-force-text-direction="ltr"] *,
+[data-force-text-direction="rtl"] * {
+ direction: inherit;
+}
+
+.title-with-jump {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.title-with-jump h1 {
+ flex: 1;
+}
+
+.jump-link {
+ flex-shrink: 0;
+ font-size: 0.9rem;
+}
+
+@media (max-width: 500px) {
+ .title-with-jump {
+ flex-direction: column;
+ }
+}
+
+#skip-link {
+ position: absolute;
+ top: -40px;
+ left: 0;
+ transform: translateY(-100%);
+ opacity: 0;
+ z-index: 9999;
+ transition: all 0.1s ease;
+ border-radius: 0 0 5px 0;
+ background-color: var(--primary-color);
+ padding: 4px 8px;
+ color: var(--hover-color);
+ font-weight: 500;
+ font-size: 0.9rem;
+ text-decoration: none;
+}
+
+#skip-link:focus {
+ top: 0;
+ transform: translateY(0);
+ opacity: 1;
+ outline: 2px solid var(--text-color);
+ outline-offset: 2px;
}
diff --git a/sass/parts/_posts_list.scss b/sass/parts/_posts_list.scss
index 1a9243a..e74f89c 100644
--- a/sass/parts/_posts_list.scss
+++ b/sass/parts/_posts_list.scss
@@ -1,23 +1,40 @@
.bloglist-container {
display: grid;
- grid-template-columns: 1fr;
+ grid-template-columns: 1fr 8fr;
}
-.bloglist-row {
+
+$padding: 2.5rem;
+
+.bloglist-meta {
display: flex;
align-items: flex-start;
background-color: var(--navbar-color);
- padding: 2.5rem 0;
+ padding-block: $padding;
+ min-width: 13.5rem;
- .bloglist-meta {
+ .thumbnail-image {
+ margin: 0;
+ margin-inline: auto; // Centred by default.
+ max-width: 70%;
+ }
+
+ li.date + li.post-thumbnail .thumbnail-image {
+ // Styles for the thumbnail when there's a date above (either date or updated).
+ margin-inline: 0; // Since metadata is left aligned, the image looks weird when centred.
+ margin-block-start: 0.7rem;
+ }
+
+ ul {
+ margin-inline-end: 0.7rem;
padding: 0;
- width: 13.5rem;
color: var(--meta-color);
font-weight: 300;
font-size: 0.9rem;
li {
list-style-type: none;
+ white-space: nowrap;
}
li.draft-label {
@@ -25,22 +42,33 @@
line-height: 1.2rem;
}
}
+}
- .bloglist-tags {
- margin-top: 0.1rem;
+.bloglist-content {
+ display: flex;
+ position: relative;
+ align-items: flex-start;
+ background-color: var(--navbar-color);
+ padding: $padding 0;
- .tag {
- display: inline-block;
- margin-right: 0.7rem;
- font-weight: 400;
- font-size: 0.75rem;
- text-transform: uppercase;
- }
+ .pinned-label {
+ display: flex;
+ position: absolute;
+ top: 0.8rem;
+ align-items: center;
+ gap: 0.3rem;
+ color: var(--meta-color);
+ font-weight: 300;
+ font-size: 0.8rem;
}
- .bloglist-content {
- flex: 1;
+ .pinned-label svg {
+ width: 0.8rem;
+ height: 0.8rem;
+ }
+ div {
+ flex: 1;
.bloglist-title {
margin: 0;
@@ -57,6 +85,18 @@
}
}
+ .bloglist-tags {
+ margin-top: 0.1rem;
+
+ .tag {
+ display: inline-block;
+ margin-inline-end: 0.7rem;
+ font-weight: 400;
+ font-size: 0.75rem;
+ text-transform: uppercase;
+ }
+ }
+
.description p {
margin: 0.5rem 0 1rem;
color: var(--text-color);
@@ -85,22 +125,47 @@
}
@media only screen and (max-width: 1100px) {
- .bloglist-row {
- flex-direction: column;
- align-items: flex-start;
- padding: 2rem 0;
+ .bloglist-container {
+ display: block;
+ }
- .bloglist-meta {
- margin-bottom: 0;
+ .pinned-label svg {
+ margin-bottom: -2px;
+ }
+
+ .bloglist-meta {
+ border-bottom: 0;
+ padding-block: 2rem;
+
+ ul {
+ margin-block-end: 0;
width: 100%;
li {
display: inline;
- margin-right: 0.3rem;
+ margin-inline-end: 0.3rem;
}
}
- .bloglist-content {
+ .post-thumbnail {
+ display: none;
+ }
+ }
+
+ .bloglist-content {
+ flex-direction: column;
+ align-items: flex-start;
+ padding: 0;
+ padding-bottom: 2rem;
+
+
+ .pinned-label {
+ position: static;
+ margin: 0;
+ margin-top: -1.9rem;
+ }
+
+ div {
width: 100%;
}
}
diff --git a/sass/parts/_quick_navigation_buttons.scss b/sass/parts/_quick_navigation_buttons.scss
index 59ef653..768592f 100644
--- a/sass/parts/_quick_navigation_buttons.scss
+++ b/sass/parts/_quick_navigation_buttons.scss
@@ -64,20 +64,20 @@
right: 0;
bottom: 100%;
z-index: 2;
- margin-bottom: $padding-vertical;
+ margin-block-end: $padding-vertical;
box-shadow: rgba(0, 0, 0, 0.15) 1.95px 1.95px 2.6px;
border: 1px solid var(--divider-color);
border-radius: 5px;
background-color: var(--background-color);
- padding-right: $padding-horizontal;
+ padding-inline-end: $padding-horizontal;
max-height: 70vh;
overflow-y: auto;
font-size: 0.8rem;
- text-align: left;
+ text-align: start;
white-space: nowrap; // Prevents wrapping, allowing content to define width.
ul {
- padding-left: $padding-horizontal;
+ padding-inline-start: $padding-horizontal;
list-style: none;
}
}
diff --git a/sass/parts/_search.scss b/sass/parts/_search.scss
index 05caf75..df820e4 100644
--- a/sass/parts/_search.scss
+++ b/sass/parts/_search.scss
@@ -2,7 +2,7 @@ $icon-size: 1.3rem;
#searchModal {
background: color-mix(in srgb, var(--primary-color) 5%, transparent);
- text-align: left;
+ text-align: start;
#searchContainer {
padding: 1rem;
@@ -18,7 +18,7 @@ $icon-size: 1.3rem;
.search-icon {
position: absolute;
- left: 1rem;
+ inset-inline-start: 1rem;
width: $icon-size;
height: $icon-size;
@@ -28,10 +28,11 @@ $icon-size: 1.3rem;
}
.close-icon {
+ display: none;
position: absolute;
right: $icon-size;
- margin-right: 0.5rem;
- margin-left: 1rem;
+ margin-inline-start: 1rem;
+ margin-inline-end: 0.5rem;
width: $icon-size;
height: $icon-size;
}
@@ -41,7 +42,8 @@ $icon-size: 1.3rem;
border: 1px solid var(--divider-color);
border-radius: 20px;
background-color: var(--input-background-color);
- padding: 0.75rem 1rem 0.75rem 3rem;
+ padding-inline: 3rem 1rem;
+ padding-block: 0.75rem;
width: calc(100% - 2rem);
color: var(--text-color);
font-size: 1rem;
@@ -82,7 +84,8 @@ $icon-size: 1.3rem;
> div {
cursor: pointer;
- padding: 0.5rem 1rem;
+ padding-inline: 1rem;
+ padding-block: 0.5rem;
&[aria-selected="true"] {
background-color: var(--primary-color);
@@ -113,8 +116,8 @@ $icon-size: 1.3rem;
display: block;
position: relative;
align-self: center;
- margin-right: 0.5rem;
- margin-left: 1rem;
+ margin-inline-start: 1rem;
+ margin-inline-end: 0.5rem;
width: $icon-size;
height: $icon-size;
}
diff --git a/sass/parts/_table.scss b/sass/parts/_table.scss
index 3a35a9c..d6e5326 100644
--- a/sass/parts/_table.scss
+++ b/sass/parts/_table.scss
@@ -11,7 +11,8 @@ table {
th,
td {
border: 1px solid var(--bg-1);
- padding: 6px 13px;
+ padding-inline: 13px;
+ padding-block: 6px;
font-size: large;
}
diff --git a/sass/parts/_tags.scss b/sass/parts/_tags.scss
index 077ac5f..ae28d0a 100644
--- a/sass/parts/_tags.scss
+++ b/sass/parts/_tags.scss
@@ -8,7 +8,7 @@
}
.tags-item {
- margin-bottom: 1rem;
+ margin-block-end: 1rem;
}
}
diff --git a/sass/parts/_theme-switch.scss b/sass/parts/_theme-switch.scss
index 6751a78..9c5bd4f 100644
--- a/sass/parts/_theme-switch.scss
+++ b/sass/parts/_theme-switch.scss
@@ -3,7 +3,7 @@
position: relative;
align-self: center;
cursor: pointer;
- margin-left: 0.5rem;
+ margin-inline-start: 0.5rem;
background: var(--text-color);
width: 1rem;
height: 1rem;
@@ -19,13 +19,13 @@
.theme-resetter {
-webkit-mask: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960" %3E%3Cpath d="M295.87-193.869v-78.001h291.152q43.63 0 72.369-33.424 28.739-33.423 28.739-79.271t-28.739-79.391Q630.652-497.5 587.022-497.5H343.913l87.478 87.478-55.652 55.153L193.869-536.5l181.87-181.631 55.652 55.653-87.478 86.978h243.109q75.435 0 127.272 56.522 51.837 56.521 51.837 134.174 0 77.652-51.837 134.293-51.837 56.642-127.272 56.642H295.87Z"/%3E%3C/svg%3E');
position: absolute;
- top: -0.6rem;
- right: -0.6rem;
visibility: hidden;
opacity: 0;
transition: opacity 0.3s ease, visibility 0.3s ease;
transition-delay: 0.5s;
cursor: pointer;
+ inset-block-start: -0.6rem;
+ inset-inline-end: -0.6rem;
background: var(--text-color);
width: 0.8rem;
height: 0.8rem;
diff --git a/sass/parts/_webmention.scss b/sass/parts/_webmention.scss
new file mode 100644
index 0000000..b6d6338
--- /dev/null
+++ b/sass/parts/_webmention.scss
@@ -0,0 +1,149 @@
+#webmentions {
+ position: relative;
+ z-index: 100;
+ margin: 0;
+ background-color: var(--background-color);
+ color: var(--text-color);
+ line-height: 1.2em;
+
+ h2 {
+ margin-bottom: 1.5em;
+ font-size: 1.1em;
+ }
+
+ h3 {
+ display: flex;
+ align-items: center;
+ font-size: 0.9em;
+
+ svg {
+ margin-inline-end: 0.2rem;
+ }
+
+ .svg-icon,
+ span {
+ margin-inline-end: .3rem;
+ }
+ }
+
+ ol {
+ padding: 0;
+ }
+
+ li,
+ p {
+ font-family: inherit;
+ }
+
+
+.likes {
+ display: flex;
+ flex-wrap: wrap;
+ margin-top: 0.5rem;
+ padding: 0;
+ list-style: none;
+
+ li {
+ position: relative;
+ transition: transform 0.8s ease-out, z-index 0s linear 0.4s;
+ margin-bottom: .375rem;
+ margin-inline-start: -.75rem;
+
+ &:first-child {
+ margin-inline-start: 0;
+ }
+
+ &:hover {
+ transform: scale(1.3) translateY(-4px);
+ z-index: 10;
+ transition: transform 0.05s ease-out, z-index 0s linear 0s;
+ }
+
+ img {
+ display: block;
+ border: 2px solid var(--background-color, white);
+ border-radius: 50%;
+ aspect-ratio: 1/1;
+ width: 2.5rem;
+ height: 2.5rem;
+ object-fit: cover;
+ }
+ }
+ }
+
+ .comment {
+ margin-bottom: 1rem;
+ border-radius: 10px;
+ background: var(--bg-0);
+ padding: 1rem;
+ overflow: hidden;
+ font-size: 80%;
+
+ div {
+ display: flex;
+ flex-wrap: nowrap;
+ justify-content: space-between;
+ align-items: center;
+ }
+
+ p {
+ margin-bottom: 0;
+ line-height: 1.5em;
+ }
+
+ .p-author {
+ font-style: bold;
+ font-size: 1.3em;
+ }
+
+ .u-url {
+ font-style: italic;
+ text-decoration: underline;
+ }
+
+ .u-author {
+ display: flex;
+ align-items: center;
+
+ img {
+ display: block;
+ margin-inline-end: .625rem;
+ width: 2rem;
+ max-width: 100%;
+ height: 2rem;
+ }
+ }
+ }
+
+ form {
+ input {
+ flex: 1;
+ border: 1px solid var(--divider-color);
+ border-radius: 20px 0px 0px 20px;
+ background-color: var(--input-background-color);
+ padding-inline: 1rem 1rem;
+ padding-block: .75rem;
+ width: calc(60% - 2rem);
+ color: var(--text-color);
+ font-size: 1rem;
+ }
+
+ button {
+ flex: 1;
+ border: 1px solid var(--divider-color);
+ border-radius: 0px 20px 20px 0px;
+ background-color: var(--input-background-color);
+ padding-inline: 0.7rem 0.7rem;
+ padding-block: .75rem;
+ width: 7rem;
+ color: var(--text-color);
+ font-size: 1rem;
+ }
+
+ button:hover {
+ cursor: pointer;
+ background-color: var(--primary-color);
+ color: var(--hover-color);
+ }
+ }
+}
diff --git a/sass/parts/_zola-error.scss b/sass/parts/_zola-error.scss
new file mode 100644
index 0000000..3bdbcbc
--- /dev/null
+++ b/sass/parts/_zola-error.scss
@@ -0,0 +1,28 @@
+// Styles Zola error messages. See https://github.com/welpo/tabi/pull/359
+body > div:last-child > div:last-child[style]:not([class]):not([id]) {
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ z-index: 9999;
+ box-shadow: rgba(50, 50, 93, 0.25) 0px 50px 100px -20px, rgba(0, 0, 0, 0.3) 0px 30px 60px -30px;
+ border: 2px solid var(--admonition-danger-border);
+ border-radius: 5px;
+ background-color: var(--admonition-danger-bg);
+ padding: 15px;
+ width: fit-content;
+ max-width: 80%;
+}
+
+body > div:last-child > div:last-child[style]:not([class]):not([id]) > p[style]:first-child {
+ margin: 0;
+ color: var(--admonition-danger-border);
+ font-weight: bold;
+}
+
+body > div:last-child > div:last-child[style]:not([class]):not([id]) > pre[style]:last-child {
+ margin-block-end: 0;
+ background-color: var(--admonition-danger-code);
+ padding: 10px;
+ overflow-x: auto;
+}
diff --git a/sass/skins/blue.scss b/sass/skins/blue.scss
index 8b3225b..d135219 100644
--- a/sass/skins/blue.scss
+++ b/sass/skins/blue.scss
@@ -1,7 +1,22 @@
+@mixin theme-variables($theme) {
+ @if $theme =='light' {
+ --primary-color: #3271E7; // Contrast ratio: 4.51:1
+ }
+ @else if $theme == 'dark' {
+ --primary-color: #6cacff; // Contrast ratio: 7.05:1
+ }
+}
+
:root {
- --primary-color: #3271E7; // Contrast ratio: 4.51:1
+ @include theme-variables('light');
}
[data-theme='dark'] {
- --primary-color: #6cacff; // Contrast ratio: 7.05:1
+ @include theme-variables('dark');
+}
+
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme='light']) {
+ @include theme-variables('dark');
+ }
}
diff --git a/sass/skins/evangelion.scss b/sass/skins/evangelion.scss
index d2506fb..d0350a5 100644
--- a/sass/skins/evangelion.scss
+++ b/sass/skins/evangelion.scss
@@ -1,9 +1,24 @@
-// Evangelion Unit-02.
-:root {
- --primary-color: #d12e36; // Contrast ratio: 5.05:1
+@mixin theme-variables($theme) {
+ @if $theme =='light' {
+ // Evangelion Unit-02.
+ --primary-color: #d12e36; // Contrast ratio: 5.05:1
+ }
+ @else if $theme == 'dark' {
+ // Evangelion Unit-01.
+ --primary-color: #c09bd9; // Contrast ratio: 7.01:1
+ }
}
-// Evangelion Unit-01.
-[data-theme='dark'] {
- --primary-color: #c09bd9; // Contrast
+:root {
+ @include theme-variables('light');
+}
+
+[data-theme='dark'] {
+ @include theme-variables('dark');
+}
+
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme='light']) {
+ @include theme-variables('dark');
+ }
}
diff --git a/sass/skins/indigo_ingot.scss b/sass/skins/indigo_ingot.scss
index 5ffb588..11a6370 100644
--- a/sass/skins/indigo_ingot.scss
+++ b/sass/skins/indigo_ingot.scss
@@ -1,7 +1,22 @@
+@mixin theme-variables($theme) {
+ @if $theme =='light' {
+ --primary-color: #1460bd; // Contrast ratio: 6.1:1
+ }
+ @else if $theme == 'dark' {
+ --primary-color: #e6c212; // Contrast ratio: 9.48:1
+ }
+}
+
:root {
- --primary-color: #1460bd; // Contrast ratio: 6.1:1
+ @include theme-variables('light');
}
[data-theme='dark'] {
- --primary-color: #e6c212; // Contrast ratio: 9.48:1
+ @include theme-variables('dark');
+}
+
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme='light']) {
+ @include theme-variables('dark');
+ }
}
diff --git a/sass/skins/lavender.scss b/sass/skins/lavender.scss
index b772953..97a40df 100644
--- a/sass/skins/lavender.scss
+++ b/sass/skins/lavender.scss
@@ -1,7 +1,22 @@
+@mixin theme-variables($theme) {
+ @if $theme =='light' {
+ --primary-color: #9055d8; // Contrast ratio: 4.69:1
+ }
+ @else if $theme == 'dark' {
+ --primary-color: #cba2e8; // Contrast ratio: 7.74:1
+ }
+}
+
:root {
- --primary-color: #9055d8; // Contrast ratio: 4.69:1
+ @include theme-variables('light');
}
[data-theme='dark'] {
- --primary-color: #cba2e8; // Contrast ratio: 7.74:1
+ @include theme-variables('dark');
+}
+
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme='light']) {
+ @include theme-variables('dark');
+ }
}
diff --git a/sass/skins/lowcontrast_orange.scss b/sass/skins/lowcontrast_orange.scss
index c374ddd..ad84bf4 100644
--- a/sass/skins/lowcontrast_orange.scss
+++ b/sass/skins/lowcontrast_orange.scss
@@ -2,11 +2,25 @@
// and might not be suitable for users with certain types of visual impairment.
// Furthermore, low contrast will affect your Google Lighthouse rating.
// For more information on web accessibility: https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html
+@mixin theme-variables($theme) {
+ @if $theme =='light' {
+ --primary-color: #f56a00; // Contrast ratio: 3.02:1. Not very accessible.
+ }
+ @else if $theme == 'dark' {
+ --primary-color: #ec984f; // Contrast ratio: 7.19:1. Accessible.
+ }
+}
:root {
- --primary-color: #f56a00; // Contrast ratio: 3.02:1. Not very accessible.
+ @include theme-variables('light');
}
[data-theme='dark'] {
- --primary-color: #ec984f; // Contrast ratio: 7.19:1. Accessible.
+ @include theme-variables('dark');
+}
+
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme='light']) {
+ @include theme-variables('dark');
+ }
}
diff --git a/sass/skins/lowcontrast_peach.scss b/sass/skins/lowcontrast_peach.scss
index 5b9a51c..328a4da 100644
--- a/sass/skins/lowcontrast_peach.scss
+++ b/sass/skins/lowcontrast_peach.scss
@@ -2,11 +2,25 @@
// and might not be suitable for users with certain types of visual impairment.
// Furthermore, low contrast will affect your Google Lighthouse rating.
// For more information on web accessibility: https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html
+@mixin theme-variables($theme) {
+ @if $theme =='light' {
+ --primary-color: #ffa057; // Contrast ratio: 2.01:1. Not very accessible.
+ }
+ @else if $theme == 'dark' {
+ --primary-color: #ffab7f; // Contrast ratio: 8.93:1. Accessible.
+ }
+}
:root {
- --primary-color: #ffa057; // Contrast ratio: 2.01:1. Not very accessible.
+ @include theme-variables('light');
}
[data-theme='dark'] {
- --primary-color: #ffab7f; // Contrast ratio: 8.93:1. Accessible.
+ @include theme-variables('dark');
+}
+
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme='light']) {
+ @include theme-variables('dark');
+ }
}
diff --git a/sass/skins/lowcontrast_pink.scss b/sass/skins/lowcontrast_pink.scss
index b6b7378..3f96d1d 100644
--- a/sass/skins/lowcontrast_pink.scss
+++ b/sass/skins/lowcontrast_pink.scss
@@ -2,11 +2,25 @@
// and might not be suitable for users with certain types of visual impairment.
// Furthermore, low contrast will affect your Google Lighthouse rating.
// For more information on web accessibility: https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html
+@mixin theme-variables($theme) {
+ @if $theme =='light' {
+ --primary-color: #ee59d2; // Contrast ratio: 3:1. Not very accessible.
+ }
+ @else if $theme == 'dark' {
+ --primary-color: #f49ee9; // Contrast ratio: 9.87:1. Accessible.
+ }
+}
:root {
- --primary-color: #ee59d2; // Contrast ratio: 3:1. Not very accessible.
+ @include theme-variables('light');
}
[data-theme='dark'] {
- --primary-color: #f49ee9; // Contrast ratio: 9.87:1. Accessible.
+ @include theme-variables('dark');
+}
+
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme='light']) {
+ @include theme-variables('dark');
+ }
}
diff --git a/sass/skins/mint.scss b/sass/skins/mint.scss
index 692872f..e598c24 100644
--- a/sass/skins/mint.scss
+++ b/sass/skins/mint.scss
@@ -1,7 +1,22 @@
+@mixin theme-variables($theme) {
+ @if $theme =='light' {
+ --primary-color: #00804d; // Contrast ratio: 5:1
+ }
+ @else if $theme == 'dark' {
+ --primary-color: #00b86e; // Contrast ratio: 6.34:1
+ }
+}
+
:root {
- --primary-color: #00804d; // Contrast ratio: 5:1
+ @include theme-variables('light');
}
[data-theme='dark'] {
- --primary-color: #00b86e; // Contrast ratio: 6.34:1
+ @include theme-variables('dark');
+}
+
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme='light']) {
+ @include theme-variables('dark');
+ }
}
diff --git a/sass/skins/monochrome.scss b/sass/skins/monochrome.scss
index a616695..976e12e 100644
--- a/sass/skins/monochrome.scss
+++ b/sass/skins/monochrome.scss
@@ -1,7 +1,22 @@
+@mixin theme-variables($theme) {
+ @if $theme =='light' {
+ --primary-color: #727272; // Contrast ratio: 4.81:1
+ }
+ @else if $theme == 'dark' {
+ --primary-color: #b3b3b3; // Contrast ratio: 7.86:1
+ }
+}
+
:root {
- --primary-color: #727272; // Contrast ratio: 4.81:1
+ @include theme-variables('light');
}
[data-theme='dark'] {
- --primary-color: #b3b3b3; // Contrast ratio: 7.86:1
+ @include theme-variables('dark');
+}
+
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme='light']) {
+ @include theme-variables('dark');
+ }
}
diff --git a/sass/skins/red.scss b/sass/skins/red.scss
index 844f8b4..169340f 100644
--- a/sass/skins/red.scss
+++ b/sass/skins/red.scss
@@ -1,7 +1,22 @@
+@mixin theme-variables($theme) {
+ @if $theme =='light' {
+ --primary-color: #ca4963; // Contrast ratio: 4.52:1.
+ }
+ @else if $theme == 'dark' {
+ --primary-color: #ea535f; // Contrast ratio: 4.63:1.
+ }
+}
+
:root {
- --primary-color: #ca4963; // Contrast ratio: 4.52:1.
+ @include theme-variables('light');
}
[data-theme='dark'] {
- --primary-color: #ea535f; // Contrast ratio: 4.63:1.
+ @include theme-variables('dark');
+}
+
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme='light']) {
+ @include theme-variables('dark');
+ }
}
diff --git a/sass/skins/sakura.scss b/sass/skins/sakura.scss
index db00861..4e418eb 100644
--- a/sass/skins/sakura.scss
+++ b/sass/skins/sakura.scss
@@ -1,7 +1,22 @@
+@mixin theme-variables($theme) {
+ @if $theme =='light' {
+ --primary-color: #D33C5C; // Contrast ratio: 4.61:1
+ }
+ @else if $theme == 'dark' {
+ --primary-color: #fabed2; // Contrast ratio: 10.48:1
+ }
+}
+
:root {
- --primary-color: #D33C5C; // Contrast ratio: 4.61:1
+ @include theme-variables('light');
}
[data-theme='dark'] {
- --primary-color: #fabed2; // Contrast ratio: 10.48:1
+ @include theme-variables('dark');
+}
+
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme='light']) {
+ @include theme-variables('dark');
+ }
}
diff --git a/sass/skins/teal.scss b/sass/skins/teal.scss
index 7ecdc0c..3a1fbcd 100644
--- a/sass/skins/teal.scss
+++ b/sass/skins/teal.scss
@@ -1,12 +1,33 @@
-// This file is never loaded; it's serves as reference for the default skin (in main.scss).
// When creating your own skin, you can use https://webaim.org/resources/contrastchecker/
// to verify the accessibility and readability of your colourscheme.
-// The light background is #fff and the dark background is #1f1f1f.
+// The default light background is #fff and the dark background is #1f1f1f.
+// This defines theme-specific variables.
+@mixin theme-variables($theme) {
+ @if $theme =='light' {
+ // Light theme colours.
+ --primary-color: #087e96; // Contrast ratio: 4.73:1
+ }
+ @else if $theme == 'dark' {
+ // Dark theme colours.
+ --primary-color: #91e0ee; // Contrast ratio: 11.06:1
+ }
+}
+
+// Apply light theme variables by default.
:root {
- --primary-color: #087e96; // Contrast ratio: 4.73:1
+ @include theme-variables('light');
}
+// Apply dark theme variables when dark theme is explicitly set.
[data-theme='dark'] {
- --primary-color: #91e0ee; // Contrast ratio: 11.06:1
+ @include theme-variables('dark');
+}
+
+// Apply dark theme variables when user's system prefers dark mode
+// and the theme is not explicitly set to light.
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme='light']) {
+ @include theme-variables('dark');
+ }
}
diff --git a/scripts/release b/scripts/release
new file mode 160000
index 0000000..8e0a56e
--- /dev/null
+++ b/scripts/release
@@ -0,0 +1 @@
+Subproject commit 8e0a56e333ad53b01a6036744facaab21404d329
diff --git a/scripts/upgrade-deps b/scripts/upgrade-deps
new file mode 100755
index 0000000..62a5d52
--- /dev/null
+++ b/scripts/upgrade-deps
@@ -0,0 +1,411 @@
+#!/usr/bin/env bash
+set -eu
+
+MERMAID_DIR="static/js"
+MERMAID_FILE="mermaid.min.js"
+MERMAID_PATH="${MERMAID_DIR}/${MERMAID_FILE}"
+KATEX_JS_DIR="static/js"
+KATEX_CSS_DIR="static"
+KATEX_FONTS_DIR="static/fonts/KaTeX"
+KATEX_JS_FILE="katex.min.js"
+KATEX_CSS_FILE="katex.min.css"
+KATEX_JS_PATH="${KATEX_JS_DIR}/${KATEX_JS_FILE}"
+KATEX_CSS_PATH="${KATEX_CSS_DIR}/${KATEX_CSS_FILE}"
+UGLIFY_ITERATIONS=5
+CURL_RETRIES=3
+
+cleanup() {
+ rm -rf "$TEMP_DIR"
+}
+
+exit_with_message() {
+ echo "$1" >&2
+ exit 1
+}
+
+print_usage() {
+ echo "Usage: $0 [options]"
+ echo "Options:"
+ echo " --mermaid Upgrade Mermaid.js"
+ echo " --katex Upgrade KaTeX"
+ echo " --all Upgrade all dependencies (default)"
+ echo " --help Display this help message"
+}
+
+check_dependency() {
+ if ! command -v "$1" &> /dev/null; then
+ exit_with_message "$1 is required but not installed."
+ fi
+}
+
+curl_with_retry() {
+ local url="$1"
+ local output="$2"
+ local retries="$CURL_RETRIES"
+ local wait_time=5
+
+ while [ $retries -gt 0 ]; do
+ if curl -L "$url" -o "$output"; then
+ return 0
+ else
+ echo "Curl failed. Retrying in $wait_time seconds…"
+ sleep $wait_time
+ retries=$((retries - 1))
+ wait_time=$((wait_time * 2))
+ fi
+ done
+
+ echo "Failed to download after $CURL_RETRIES attempts." >&2
+ return 1
+}
+
+get_latest_version_jsdelivr() {
+ local package="$1"
+ local temp_file="${TEMP_DIR}/jsdelivr_response.json"
+ if curl_with_retry "https://data.jsdelivr.com/v1/package/npm/${package}" "$temp_file"; then
+ jq -r '.tags.latest' "$temp_file"
+ else
+ return 1
+ fi
+}
+
+get_latest_version_github() {
+ local repo="$1"
+ local temp_file="${TEMP_DIR}/github_response.json"
+ if curl_with_retry "https://api.github.com/repos/${repo}/releases/latest" "$temp_file"; then
+ jq -r '.tag_name' "$temp_file" | sed -E 's/^v?//'
+ else
+ return 1
+ fi
+}
+
+get_local_mermaid_version() {
+ local version
+ # Old format.
+ version=$(grep -o '[A-Za-z]\+t="[0-9]\+\.[0-9]\+\.[0-9]\+"' "$MERMAID_PATH" | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+' || true)
+
+ # New format.
+ if [ -z "$version" ]; then
+ version=$(grep -o 'version:"[0-9]\+\.[0-9]\+\.[0-9]\+"' "$MERMAID_PATH" | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+' || true)
+ fi
+
+ if [ -z "$version" ]; then
+ exit_with_message "Could not detect local Mermaid.js version"
+ fi
+ echo "$version"
+}
+
+
+get_local_katex_version() {
+ local version
+ version=$(sed -n 's/.*version:"\([^"]*\)".*/\1/p' "$KATEX_JS_PATH" | head -n 1)
+ if [ -z "$version" ]; then
+ echo "Could not detect local KaTeX version" >&2
+ return 1
+ fi
+ echo "$version"
+}
+
+compare_md5() {
+ local new_file="$1"
+ local current_file="$2"
+ local new_md5
+ new_md5=$(md5sum "$new_file" | awk '{ print $1 }')
+
+ if [ -f "$current_file" ]; then
+ local current_md5
+ current_md5=$(md5sum "$current_file" | awk '{ print $1 }')
+ if [ "$new_md5" = "$current_md5" ]; then
+ echo "same"
+ else
+ echo "different"
+ fi
+ else
+ echo "new"
+ fi
+}
+
+uglify_file() {
+ local file="$1"
+ local iterations="$2"
+
+ for i in $(seq 1 "$iterations"); do
+ echo "Running UglifyJS iteration $i"
+ uglifyjs --compress --mangle -- "$file" > "${file}.tmp"
+ mv "${file}.tmp" "$file"
+ done
+}
+
+generate_commit_message() {
+ local template="$1"
+ local version="$2"
+ echo "${template//\{VERSION\}/${version}}"
+}
+
+
+safe_file_manipulation() {
+ local file="$1"
+ local manipulation_command="$2"
+ local temp_file="${file}.tmp"
+ awk "${manipulation_command}" "$file" > "$temp_file"
+ mv "$temp_file" "$file"
+}
+
+append_autorender_extension() {
+ local file="$1"
+ # Auto-render Extension (https://katex.org/docs/autorender) with a slight modification to add `$` inline delimiters.
+ local extension_code='
+,function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,function(e){return function(){"use strict";var t={771:function(t){t.exports=e}},$={};function r(e){var _=$[e];if(void 0!==_)return _.exports;var n=$[e]={exports:{}};return t[e](n,n.exports,r),n.exports}r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,{a:t}),t},r.d=function(e,t){for(var $ in t)r.o(t,$)&&!r.o(e,$)&&Object.defineProperty(e,$,{enumerable:!0,get:t[$]})},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var _,n,a,i,o,s,l,h,m={};return r.d(m,{default:function(){return h}}),_=r(771),n=r.n(_),a=function(e,t,$){for(var r=$,_=0,n=e.length;r0&&(r.push({type:"text",data:e.slice(0,$)}),e=e.slice($));var n=t.findIndex(function(t){return e.startsWith(t.left)});if(-1===($=a(t[n].right,e,t[n].left.length)))break;var o=e.slice(0,$+t[n].right.length),s=i.test(o)?o:e.slice(t[n].left.length,$);r.push({type:"math",data:s,rawData:o,display:t[n].display}),e=e.slice($+t[n].right.length)}return""!==e&&r.push({type:"text",data:e}),r},s=function(e,t){var $=o(e,t.delimiters);if(1===$.length&&"text"===$[0].type)return null;for(var r=document.createDocumentFragment(),_=0;_<$.length;_++)if("text"===$[_].type)r.appendChild(document.createTextNode($[_].data));else{var a=document.createElement("span"),i=$[_].data;t.displayMode=$[_].display;try{t.preProcess&&(i=t.preProcess(i)),n().render(i,a,t)}catch(s){if(!(s instanceof n().ParseError))throw s;t.errorCallback("KaTeX auto-render: Failed to parse `"+$[_].data+"` with ",s),r.appendChild(document.createTextNode($[_].rawData));continue}r.appendChild(a)}return r},l=function e(t,$){for(var r=0;r> "$file"
+ echo ";" >> "$file"
+}
+
+modify_katex_css() {
+ local file="$1"
+ safe_file_manipulation "$file" '{gsub(/url\(fonts\/KaTeX/, "url(fonts/KaTeX/KaTeX"); print $0}'
+}
+
+upgrade_mermaid() {
+ echo
+ echo "Starting Mermaid.js update…"
+ if [ ! -d "$MERMAID_DIR" ]; then
+ exit_with_message "Directory ${MERMAID_DIR} does not exist. Are you running this script from the root of the repository?"
+ fi
+
+ local commit_msg_template
+ commit_msg_template=$(cat << EOM
+⬆️ chore(deps): upgrade mermaid to v{VERSION}
+
+Changelog: https://github.com/mermaid-js/mermaid/releases/tag/mermaid%40{VERSION}
+
+Source: https://cdn.jsdelivr.net/npm/mermaid@{VERSION}/dist/mermaid.min.js
+EOM
+)
+
+ local latest_version
+ latest_version=$(get_latest_version_jsdelivr "mermaid" || get_latest_version_github "mermaid-js/mermaid")
+ if [ -z "$latest_version" ]; then
+ exit_with_message "Unable to determine the latest Mermaid.js version."
+ fi
+
+ local local_version
+ local_version=$(get_local_mermaid_version)
+ echo "Latest Mermaid.js version: ${latest_version}"
+ echo "Local Mermaid.js version: ${local_version}"
+ if [ "$latest_version" = "$local_version" ]; then
+ echo "Mermaid.js is already up to date. Skipping update."
+ return 0
+ fi
+
+ local download_url
+ download_url="https://cdn.jsdelivr.net/npm/mermaid@${latest_version}/dist/mermaid.min.js"
+ if ! curl_with_retry "${download_url}" "${TEMP_DIR}/${MERMAID_FILE}"; then
+ exit_with_message "Failed to download Mermaid.js"
+ fi
+
+ uglify_file "${TEMP_DIR}/${MERMAID_FILE}" "$UGLIFY_ITERATIONS"
+ local comparison_result
+ comparison_result=$(compare_md5 "${TEMP_DIR}/${MERMAID_FILE}" "${MERMAID_PATH}")
+
+ case "$comparison_result" in
+ "same")
+ echo "Mermaid: New version is the same as current version. No update needed."
+ return 0
+ ;;
+ "different")
+ echo "Mermaid: New version differs from current version. Proceeding with update."
+ mv "${TEMP_DIR}/${MERMAID_FILE}" "${MERMAID_PATH}"
+ ;;
+ "new")
+ echo "Mermaid: Creating new file: ${MERMAID_PATH}"
+ mv "${TEMP_DIR}/${MERMAID_FILE}" "${MERMAID_PATH}"
+ ;;
+ esac
+
+ echo "Mermaid.js updated and minified successfully!"
+ echo "Preparing to commit changes…"
+ git add "${MERMAID_PATH}"
+ local commit_msg
+ commit_msg=$(generate_commit_message "$commit_msg_template" "$latest_version")
+ git commit -m "${commit_msg}"
+
+ echo "Most recent commit:"
+ git log -1
+}
+
+upgrade_katex() {
+ echo
+ echo "Starting KaTeX update…"
+ if [ ! -d "$KATEX_JS_DIR" ] || [ ! -d "$KATEX_CSS_DIR" ]; then
+ exit_with_message "KaTeX directories do not exist. Are you running this script from the root of the repository?"
+ fi
+
+ local commit_msg_template
+ commit_msg_template=$(cat << EOM
+⬆️ chore(deps): upgrade KaTeX to v{VERSION}
+
+Changelog: https://github.com/KaTeX/KaTeX/releases/tag/v{VERSION}
+
+Source: https://github.com/KaTeX/KaTeX/releases/download/v{VERSION}/katex.tar.gz
+EOM
+)
+
+ local latest_version
+ latest_version=$(get_latest_version_github "KaTeX/KaTeX")
+ local local_version
+ local_version=$(get_local_katex_version)
+ if [ -z "$local_version" ]; then
+ exit_with_message "Unable to determine the local KaTeX version."
+ fi
+
+ echo "Latest KaTeX version: ${latest_version}"
+ echo "Local KaTeX version: ${local_version}"
+ if [ "$latest_version" = "$local_version" ]; then
+ echo "KaTeX is already up to date. Skipping update."
+ return 0
+ fi
+
+ local download_url="https://github.com/KaTeX/KaTeX/releases/download/v${latest_version}/katex.tar.gz"
+ if ! curl_with_retry "${download_url}" "${TEMP_DIR}/katex.tar.gz"; then
+ exit_with_message "Failed to download KaTeX"
+ fi
+
+ tar -xzf "${TEMP_DIR}/katex.tar.gz" -C "${TEMP_DIR}"
+
+ # JS.
+ cp "${TEMP_DIR}/katex/katex.min.js" "${TEMP_DIR}/${KATEX_JS_FILE}"
+ append_autorender_extension "${TEMP_DIR}/${KATEX_JS_FILE}"
+ uglify_file "${TEMP_DIR}/${KATEX_JS_FILE}" "$UGLIFY_ITERATIONS"
+ local js_comparison_result
+ js_comparison_result=$(compare_md5 "${TEMP_DIR}/${KATEX_JS_FILE}" "${KATEX_JS_PATH}")
+
+ # CSS.
+ cp "${TEMP_DIR}/katex/katex.min.css" "${TEMP_DIR}/${KATEX_CSS_FILE}"
+ modify_katex_css "${TEMP_DIR}/${KATEX_CSS_FILE}"
+ local css_comparison_result
+ css_comparison_result=$(compare_md5 "${TEMP_DIR}/${KATEX_CSS_FILE}" "${KATEX_CSS_PATH}")
+
+ if [ "$js_comparison_result" = "same" ] && [ "$css_comparison_result" = "same" ]; then
+ echo "KaTeX: New version is the same as current version. No update needed."
+ return 0
+ fi
+
+ local changes_made
+ changes_made=false
+ if [ "$js_comparison_result" != "same" ]; then
+ echo "KaTeX JS: New version differs from current version. Proceeding with update."
+ mv "${TEMP_DIR}/${KATEX_JS_FILE}" "${KATEX_JS_PATH}"
+ changes_made=true
+ fi
+
+ if [ "$css_comparison_result" != "same" ]; then
+ echo "KaTeX CSS: New version differs from current version. Proceeding with update."
+ mv "${TEMP_DIR}/${KATEX_CSS_FILE}" "${KATEX_CSS_PATH}"
+ changes_made=true
+ fi
+
+ rm -rf "${KATEX_FONTS_DIR}"
+ mkdir -p "${KATEX_FONTS_DIR}"
+ cp -r "${TEMP_DIR}/katex/fonts"/* "${KATEX_FONTS_DIR}/"
+
+ if [ "$changes_made" = false ]; then
+ echo "No changes detected in KaTeX files. Skipping commit."
+ return 0
+ fi
+
+ echo "KaTeX updated successfully!"
+ echo "Preparing to commit changes…"
+ git add "${KATEX_JS_PATH}" "${KATEX_CSS_PATH}" "${KATEX_FONTS_DIR}"
+ local commit_msg
+ commit_msg=$(generate_commit_message "$commit_msg_template" "$latest_version")
+ git commit -m "${commit_msg}"
+
+ echo "Most recent commit:"
+ git log -1
+}
+
+main() {
+ local upgrade_mermaid=false
+ local upgrade_katex=false
+ # No args = default to upgrading all dependencies.
+ if [ $# -eq 0 ]; then
+ upgrade_mermaid=true
+ upgrade_katex=true
+ else
+ while [[ $# -gt 0 ]]; do
+ case $1 in
+ --mermaid)
+ upgrade_mermaid=true
+ shift
+ ;;
+ --katex)
+ upgrade_katex=true
+ shift
+ ;;
+ --all)
+ upgrade_mermaid=true
+ upgrade_katex=true
+ shift
+ ;;
+ --help)
+ print_usage
+ exit 0
+ ;;
+ *)
+ echo "Unknown option: $1"
+ print_usage
+ exit 1
+ ;;
+ esac
+ done
+ fi
+
+ check_dependency "jq"
+ check_dependency "uglifyjs"
+ check_dependency "curl"
+ check_dependency "git"
+ check_dependency "sed"
+ check_dependency "awk"
+ check_dependency "md5sum"
+ check_dependency "tar"
+ TEMP_DIR=$(mktemp -d)
+ trap cleanup EXIT
+
+
+ if ! git diff --cached --quiet; then
+ exit_with_message "There are staged changes. Unstage them before running this script."
+ fi
+
+ echo "Updating local repository…"
+ git fetch origin
+ current_branch=$(git rev-parse --abbrev-ref HEAD)
+ echo "Current branch: $current_branch"
+ # Check if the branch exists on the remote
+ if git ls-remote --exit-code --heads origin "$current_branch" >/dev/null 2>&1; then
+ # Branch exists on remote, compare with local.
+ local_commit=$(git rev-parse HEAD)
+ remote_commit=$(git rev-parse origin/"$current_branch")
+ if [ "$local_commit" = "$remote_commit" ]; then
+ echo "Branch is up to date with origin/$current_branch"
+ elif git merge-base --is-ancestor "$remote_commit" "$local_commit"; then
+ echo "Local branch is ahead of origin/$current_branch"
+ else
+ exit_with_message "Your local branch is behind origin/$current_branch. Pull the latest changes before running this script."
+ fi
+ else
+ echo "Branch $current_branch does not exist on remote. Assuming it's a new branch."
+ fi
+ echo "Local repository is ready."
+
+ if [ "$upgrade_mermaid" = true ]; then
+ upgrade_mermaid
+ fi
+
+ if [ "$upgrade_katex" = true ]; then
+ upgrade_katex
+ fi
+}
+
+main "$@"
diff --git a/static/custom_subset.css b/static/custom_subset.css
index 884f59f..13ac96e 100644
--- a/static/custom_subset.css
+++ b/static/custom_subset.css
@@ -1 +1 @@
-@font-face{font-family:"Inter Subset";src:url(data:application/font-woff2;base64,d09GMgABAAAAABz4ABMAAAAAL2QAAByIAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoJzG4cOHIE+P0hWQVKCCT9NVkFSgSgGYD9TVEFUgVwnNAB8L4E2CoxUinYwr1oBNgIkA1QLLAAEIAWJQAcgGw8tA+4wbByADNxWJoqSwVku+Q8DNhmy0PY+TKh6FCkS03B3WS7p12Wzm+u49uVK8A6JoyQtDpPxO1pLqNhe6iySjJXg2MMrQfmGRByeHj5PVeeHld7R4whJZn14fpt/7gvAhx8LjMSOH61O0XW5qGAGOqOHkRNz9oyFVct2XboM+eG3+X9UjCZKQhvBZLgqXZWrcO5GBvO+6L+q+MyowzW9lEgoFKYOkEfq6R4oKaGecXNTM2I8fL/G79z7dr9lN8wTiSE0U59OiFYin1DEQjONEtm/3Pp6dDfQiH5YO3ONNb0gusoHJkgu2iS9SDRecRkDBmttAIGBfwlAADilW//7vqlPb1J502hRfeeVpoYGDxAxok5CMD94Hu73npcp9IVjgbw+q8C1+nSE1///tdTuTdjlB/kFXONESbdCL/w/s7sz/0wAeBoCUgWN4ADYEjpbIevqf798Z/ekbhyJyqAe/f6oJgyDUEiU/G2YzaclfdP7S+2S0oQqzX+HurufcumXvjITi3AohLYIC0iMacmpHRMHziL/23BG5s7RHEsVmopR9joQBE3X6Q6wYkQh+P5vQjoMCMCDA7AWYAdAAiAH0AQ4ArgBeAOkAyB9jFjwVQfUowecCH4nVFOldwMGQFAtGsLkSFzb6N+c+LckI4Xp+OT/zSJpuCPzUewYEL9RYQafuNI+XcuhEyCIcIL+rW6HEBTmXyfu3dy0AilCTlPz8p6PfK8YAK3woB74/rR0AiJTKXrwSaMVGtkdn4SgjQWQgz3lSqtvLK1vMBTUH7g+6Gof+PSbuXjAvSZ2nMr9NNt/7CUEwLGhMa6VjdcQOT7vYEMEA0CDXHts0c6ORJHEY2iQ5PqXUgABKqU6AbUkZyFI06nMPOMmx4XLFGBV4sxorqXr4NS6edJTD5sBy91RjViLy30csmXbs+ua2XgQ52HAblHP0VWa59Wy/bl2azQfANR3jVfq+A/6tN/SFKivxxsAgCuaWUxrXgybLnOA0ZPsNfE5Aey0glMQvcSeo1fZe/Rqe5peA1dVNgGOXs4IAiNfQqOKgUrwYILFR+PhCPAwGxQVBBUAV941OsBowjjEQARwZIxGMw0MowACLgVbxkOewQe4piclGQQg+VOpAQb/DjBoFQCKP4OSAE82CIDkTUEbRF+yU08CgOYAeu41cv9988zD9+QBeHQFqQrmOE7EYsRcAIBGmeADMUF2TzR/TX2EP4AuJjws8ttioBUjKzJU6zJpGI4VvExl1lOHTyDGG3EScmYIwTSEXNh6wJHGGeQIgFl3y/dblNmblgPpD8jD98/v/+iLzwvu8dv0+qVdsm0vXt7zueHLl79475P3rnm77zR/bVNw+va9J/84Kd97fnKvxP0Hlu+QHzrzyZFY6mAGZDQBwTnfN7uJYSyEOij+iPprMv7v7gEaFLAUQZOMz8dxPpxCMTXICxQCIABAgOVzbveOAoDk2NdSF1ZLMo1WQPvlpcoBjMU0kY0e1XMtIab5jk0fANQCAICS7Yg6813myn64asvYhQV2eXUGQN59OuoVkrIwFzsxqKo5+fTYCesmK/jn7mhrzxAOyArJK1w8s5O9CENafXMFaJiY611cGE+t3d+II9hySD0QfYZ/hWrk6IcwFKVq1mtNwjx8y1CEAEDm8cBz0HxBkLAeq8P6PMEGwgV0PBVmsauImlVXjcQHCBvLaYsncGFTRVo2U3bSgSp1BeCyyeEUmoNMvuSFmq+E0X0XMg67g+HUXM6jjFFQyrTMhNwHIZZ+P5QJw90qSGdiDk5ejRqAuxWQwkTtFIPUD99zIRgnXPDu889kCSLXaQRYPHwc4m7ajChidiIuBBoiSEtBunipBQnYTGS7DaQ7DHBcVdEbRhIcD+4PE3+yIGQwzPAgZDgs8Cd4NCz9qc0h42GN2eDJsPWnR0Omwx732RwgJXdwGm0IyFeA+v+8FeIuRieT6EYNMkWhnG//LXLQZVBJllAGcTPaUYySqe52IsRUc0VCfz+xntxTr9XnSKLYSMM9U5ddpqqvCl/o6IQ4wtVu+k1JrCZJBqVmM2bjQ21V9UgnB3ByISOs0ai/jq8FFu9y7epvEAXC4smTVIeuuVv4uz0xi8nLU5H9QJtgk2icaN175l7X1vX7T62ShpOEqwSXT0xwJ0enQSiIaJcLSUbuCiahOjcTmcpjFdNsYVPhlt8tV0q5lrw1+3RbqTMxs8qSe3rVEmRZcqbYDlkR1F/Y8FlLXgJZRxV6VsufMjX5bheZUw7cNvq+haPNnjw5svFriBwiMlMoiDhRW7SfLAvLJMN24ezHXzzum2PqHOFW+VZOPrOfon3ymTO0jd0Vk/hTzp7N2qjJ8qqMiP9m+HK/0cbasYtyV88duSUsINdytMYCzdBfeh0t3d5zl3iPGbfOUzZCv/YPpzXK9fXuU/5IMd45dsruqPuNOZp2EydE//7/pQvjRwftCMivHS4O0ZrGpX3MX2s3bITvX38PLbFHmcFyRXDgLDfxLXVgLx6wF6WHzQgPWpV0OXEr1XhuC305ubxoWdJaWdemjYFtSauWL0lcImvZsSOoM2k5FhrkPEoNp2tPhzOPUnPGpzpuHjN5vX5wrUebZ5DMZ6bp79tTNwZ2rl0d2JG6Ye0fs82Cf/Mc6KjxkPRP2bhlgtIJGwxKXqSGkdoTcvZBes702r+SIideyR+5MIee+PvqgOrYuYsWpc4fqZq5aMfk2rxpi/1X2I4eFbzX3WhcHt4UhPmtOw78t2WJi3J2uGz01t/mx9SGJ9zTyXZOjfBfGXMlTP6+fu+2of7ExJURssCZrjp31ct3KZpuTU5asThxVlDd9i2yA4mLlyxPXik7uHZDUH3yfIwvUB0Ae/FAlIXXhR2K8HXVs0LaUo4ebFbEKDeNCw8cHg1VyIEQaFwOOViHZcOzlWNX2ZRbjgmaNhES25e0E+NehqnLfbwkTP2JcPrx3xetU24I7Fi9JrBLuXGdeV4cBcXgoW6/2PyXk/h5LNHI7048/JtUIXW1muaTVIsXiue9Objus00xzD9o46gOGBns2ue/IUpvTrWDwfzOyQs3JSwI/GvcqAm6rc7Z1ulZm+euSGubsGVDUcDCrYZjShxXLJ+3cuHOmbL/po+Yp19pn22tzNowf3XO0amwXRiS559XoXHgy5H/BATpBE20yW6VaVgri3PicZ+7O+TIYJbtYp/TQtnfdI7P6ejawawjB6vgLDM0t/xRPkbCdU1EPiEzxn/EiG3/jpON/mjX2j19ahnZPjEz+hVhlNx3lH/II7vGgfEIgdYmiXdfoKdXX4C3j3Venss1oOwgADDOSUKBxiABIvWlGbKFR6tttRib80EQwA1JtPkSTDpEkCDKk8bns6k1HzX/z966xWD9ZPnTspe/2Pa9jb/9rTs2Ocp3fHfnYWcWQCs87pIYX3r4t5SFI+YgBKcl8lpmtGk0fem3uxRb3bQdVyZEFCE4Xg6Cwr6Gq1PjaoE1KFqva75uB5lNuhN2vREpuDo4pAHnor6eOwaVTFPXLA7HGLx0TeGrD1d7jqM8u6dvOKGHFtp0MYa/xVWvGQUeXNhmBi7/Hpz6GbHflKlbfxSZ+BcFZc/mpouZ84WiKVxIYbWODmOb6Qg1cIXjjlxd6Jm1yaoLu9CklEKqW+282Msrgtlunmkv74TuWV9UHI4O4rZ2c16nR/RLDvpV2cQfMT05VhweKISM8fxpZZT4WAFhiYWvN3W31pZ8QfPTe+o35yGBzOJaouLi4zOdy/YUIrbc2traWVfa6PTh+rURUnxs/kS6bU8BCkCfhQ9AsD4B1W1XCzfHnAnt9i4dTfAgy4/AF/de/p9+iDpP6/o8a9GjP69rc4a/Hi+jBE6wvc3a5LpKk1otdWK7lmckQUkUCfRPVfXdbio6L+u3a6xWlJgiWCySFayIon+HUWfuqR4SwHXp0GJsO2zpdTto0z5rhh3o0QsNV3sGsxIRnlY/Z6VSprk6Ky71y1De7/G+Gs3ybz3C6xIbbWIpQpTFlJqREtlosK08mUstWzKsZRgCdwfbCD6ITVvJBoW5VWcctOrSj32mFajnfGRj34ycQUecKb1VZOX9mnfvf/pfRn2h14+9zWLO7vGiPg5E/b5clkiMYRS7MYZRlfx8n58ssKyqMgzMTccDSDGdSKGGZaEKyUAYjcMajAR7ZBlyie42pXCdG9wsIcCM2TOIEFcZvXUVJ0pd1p2uKOULWu1gXmWlg8OVJXll52yifLEccvBEMN6SJcwfgRQvU7TdAGkVNHlq06aKkJl5eZkRoWukuDkkJ1fdGgpNb0I13mjIqE+OkiEVNdiHEqhQ2cWQ48dlKA9WoRiNqEOG9pZlqzVy/cfXxK4ve6TfHYBIqCCiggpAAAegZs5tK88r6dfRHd6C1ReMzei+BwVUz1dE4P1ff70lYr7xKnhzVzsU3Njyjydv9G+4qur77ZPxi7fY7q2XhBxWJqWPxSmL7PqHCRiapvzxGncw+tzL4RMFJ4QfWuL7sQt1qwpLUcSRr4Z/0787QNMoyrIB4a/gFr8iSeJCJJuNEVWNBPxBTSAEtTr7rnbTP8elyzpiHgnCzAK3k3ri0mOMt9whCzqBTDzlFUWMYU1hcTT+LCmoygJZYxQJzxfKKI7XeIFGLXA1rJpLdvVWOYECO1VY/Wxf45AqlVM1Ocq+QhUjY6zIFp0xz5XxfNbvntoPLiM5ZNIwHzcnzhfZuubi9rlzTYm+7Wl4W1xLx67Yf60zwEFtBTQMbSkQc2+pdwyuLbRwaa2osk8fzVTadwra3vRNCtpKscm/CsM3KfM7WjcePbjlhluPmHeGFjpBRev8sFTDrJB7MXOsbNkvB9e3QF4LQ0xCDF1Yr5ADSTGxkcP0odgjauan3lm2znVCqhyPopQf2lvK5Uhp/97TVGXN655jGvcrIeJX0+he0hp4Wv41V+zZ1qiMfc2q4BFdYfVtxI18XZkGfr9w4dVlhmUQx58GsVUYxofX9Js4Y7m9RPChyD6BcrmxECYpAscZh59jufzNBCN+o0gxnsCgUef9EANTxCxMeGFOC161XkoUY7aJc2/2UHM9CDq9qJmYwARKGMfkqPLoEVq1okwWRRVPV4VqtXymiJBEUDHeebRazqULueRzhcJmqH9Dwquyl8sbL4Sh4wS+TEFVFQ2m8C0Eu/TVuGfq+OEmJmex1ka0V0qCrrSYzlqoNZurl9Pi60rPdLc25Nvvf+BiE/gqbDRCS6m85Fj7zubml4hBNrxbOmwsv4Y9uSqo8fCJvuCmEwbcePFpW+DhpvmlOT/yxhtL27cfePV4ZxfEUD1/R1T3H/YHerZy1ne9Eqj5qZHSsklhNsCL7QvqS9EM8ntM0JZv2Gu3TRwN3TaUeybgIqVwIHIN8VZvfMNqT9mv7WqU422nqXYOg3/mLZ47mb9sYGovoKoThugIih6VvW3LOVLtr3Yw8uor3VAe3TnRmoMtytE6GUShFC8YuX9vUCIRFcVIPBLwsYSFkqlYKCqnsvFAUukPgbAQipUk0sKPbc5lU62ly/m2b8K+Wre+7TeHUpRMYif24Th2Ygdf9yqPodayP2RzlIOtxBcO1l5EGZVhMeRw6dF6sZiEdB9HYIQitTIiybQkiWCXv3Ju1rTWFnUwdBPxMnmp6waxPZGAS4zXPYBB0NOYw921WIHlGFyV6bMwTMZ+vz1NGPG+lqsN6RaBSnHxO67TOtsYR7sQW5vDDHMu5EA/pd/IEeQKVTyiDK48BpIqzN5Hs9/Ojt6yT06/+MLjNSUzPFQ94uGV90wFzfoU8nG4s/vtF3pZcY/WFL/GtvmuKm4Qo38qV059gjziNuu6meaQlfJyErOajpAMI1TPZGfsqSwsDINsKaRU5sD6nvmT5U4opHMqqdIQkKnri16YSj09ukPaQzXd08bsh2fuZAu9TIvcZfQfF9S4FQ6ezAU6YkObrSu2XR9sHj9YqWMvSb6cL1w+czOZsVKktdztue9PlRkneGepID1X1QipCeJCJErCHI7Ut6UOAU63YM0tPPLtXI0Pjc1PpScKNDExGtvYFxwsduoJ8f3exHyXSLv9QFdohL8lIFZ+t3feofFsmCYUmqFSpHp0KHM3jjLurWpfyzac56MQrZZifSzhfJTVTgQbhWpdYaYxHJpt451QcHqoPW2PkhqV/D68qa41loKux0oBw3YNjwUxk3ZRC9Km3o72Aho0DECD1s6+xnTgdgZKdjS1HwkHeytF0HUGHBSnbwQX8HwJWob/452hkTlMPWZYUtJB2wfLu7p6cmWd72xmLV4uwdsqZ1yvRQBB+ip4VP/34b32rxmr5DtdOzle+ha7eYZXkk88ZVRTR72oKy6Gf3NmqNDZyV5hi9B/Q72tjv4/Wb+4QSedqcP0wnTuPupuDF/4Hau9pBBxTZ6clT1rNjwfCGePfCpt9ZJJx2Fi+Tjvlc8aMUMORcNhjM/UNsWcOMi2Aj9hga9y3vQOBDci+l5I9dXr2qa5XythhRVWWGG1j6c/ocnoaZkUniq7A/64zEhKCcgX9V2HFLZ4XouM7SaMhilrLjCX0CdYGyZOtsfiuHn6V18Dm7KUNMP28nUgL1JkCLh+QNz1Q0Q/mOC5zzC03KOX9OlC08AlmT4ofmNYIG+S/iwTE7lfX1lRfbyFUDM8k4UXVFB1J5oFXpxzCuuicGKbI1/NnnajjI5Qmlgugz/UKSfDuihA5PaLkslaKbrr+w29euWOnCcUBcBFVoDkFIx2UxdJFLxLh+N4tVX1hIkjwSAh3MatnqGPW91bARsWDJU5wAsF94qowgTsrh3EJQWwY9wOE8xlNfEPDbFsEUyaK2XWzLuFa+yPSPMLvwBwkvGkCS9hji50YQHd6LoWcnH8YqIlkc5jtXS8ryXeM9CZBltUmDk3b0Y4uy3h63hdsltXhjitZWhg49Wr44kcYsPuXZ1NQu3c9Lc+AUx9HfUIYygENhLPgbPe9ty4KbW4hxylJDl1MDlK1/Q/V2Z0cWfD5KJrJhvufH+Lvz44z5FtufvUdCfk0yqey0+ngs9Qpt1UG4/+e5Aai/PZorU85j+kIcde3SKW2ltvLIcwvrJpIpZssK2aKHFjBN0ErhYCqrkiujNYm4prGkWZWy0bDdtoqTDzlpbSmIhKxFhQiFcfjwtBRT2qBH1UOwedvZ2u7RS1Cwmfqq4VUZS7xS07dLnVmIW5t3RVMIo9GEPRk28zLFugx2OH7NC+PAszjAfxYIRtH7RPexTXAR8iHvHPLkj5FPcrKfEh7ooUeg8Nhdij2GeSGjWcV0llYbnLu3jMcsqbUcTlZe+hQDPtUdw4TOJxxnX7Z5PZ2cfj/e1bPtwdaQ3pMcV1YBKPC2g6ImZnvRncF2ZZeC5S11GxQvZ17YZVVWyQRhbdSCLpUTeRoqrw0cqa/MzM9Lzc+pNM4sBaI3T6oFIpD2HSqZOV6jgnIssleSaU1HSfza5LTEw5rNTOlVgZ2UbyvzGhKgPxgzhiirAcG3u1KTle+gZFc66QaLYTQSjRhGRrZko7OyCdcsFcYZPL/H5mpFw/VB/rYszGHOjXx1ESbiX31CCIWptZKpZMpqQ49ptvZRAZqfXUaQ+G8dWy6Wty8LtCG+U41pft7ByZnFyaHW+8j7UeBuzVRq21RpgxwrpuKbZVsIAF7MIiFtn0KwxOqhJSJCop+1oOU5x8JdG8rwc6UdXd0NR6UlM6t39/feiBw2C9Cgf+tjSC+jAujHzH0DWZxaqSZGF0/THS4CRdF2XTsjrT9J3m7YJwWVH3vdnDGEet8iiP/qhmj5SUGYmuKYndmMae4tFcvuo4uKrCQT1Uh6/sor3j5W2/xTJqmHMiEm0hqlZuiZRnFAYXKpRi96fI/9wnxdInUJI8zx/3HcAYvRtMehyfP9xT6LLDUOV3vdlTpQLkbXMkK3q7IIos9gopOZ0FckmGbNbah9btDU3txp9EJZs8zUeLgviiwZl4MvrDzl3JurqW9rr7nKSMcBk0LLfhDFHMYhjLXJN4f8l9MBmVFDnlhC8xg2izKAsSDR6FM+dmrPepKE2YX+T/nCp9wfDa1ht1Q5QJ1bcWwW1my34kFmMdpasJSVCokoyZ/c2YsOBKWV6MKY05WVUCdZoSxqS0bDJG0wpU6c5fzVLCrKVASoRUinVtM0iOWRvC35M3KoENbFpuah/LWoEWdCGdl076FXWRGbU8j8KPsZrfjSJ4X34fDEMsKwf/C76sGQm1ZnzMT2/tKqaDrn5fb/5t6YbSvGF6X2yIkVhZbGq40KnBN4Y9TlZuXnbvz4vIyslMH7J4zoLJxPxAhUo8OcZhoThOEskUkEZBuTGfwdfsepcM30/vdfjaELjF+/V22VtqwL8tE2cqEmJwfr2NcFG1p9a95O+G5zjg7koN+TIUbokgWIjtINb2Kec78YVBPeabc1EU5Zb24fHe7auH1JyCHtyBwP834g0Thj3QTXHQSghBRBIixIjeK66Al4pZkasjmbOHwVYjhH3QOOsrlfrIcfGnLtdyy1zQX8OI2xyB+f4tt+Cmkfz4squNRv1AfAxp7f8YzfWMieLgSH9X27lP0MrlK19INdIPcknN1nR1bctDCrn3mu+PW+FY41thH4SmOt5Plvn82eXS0uaBW0/W4tPISbjQF82hlo4PWABSHRQEvLOHc3I2Sq6xuEKKisRiuDvAD5JIyu7I4Jed+meu5y5BctuC8fEYgAQINeliBsNAGbJ0sRFvbZx8oMqKetMYmiDKiigJ/PUI7Z8zwTjX0ggZBGsDiGyENaxGXJTTuBo9ptxTVneGs5aFU972xKkSnNHE88dL1yZwePUlS/ldIpwkvmNjE93BaBsnEMkKzL5xxfARd+KVdX2BpX+evrKYfDaZaR4emd+4Gfzke/lnJwgvl7dtsSwGdP3/VDiUvrhvcGtvTOeeqmtqVEuKZc7uahqWnf9XmybEMh2WZqW0kJEWdFAUx9Bqd5STcSaSoOgYUtgHOAiwwDuJQRO1oeWrxyH7rGrbKkeSt77JMdQ0l6qb4TdnDk2IzpO8euOlPWgx77WwIIUQhpn6h+iPTe3wU7c/NWj597798N6NG/eeDg7yf0pkoSk1hJ31jxTOiiddd7WJcnY+6z7x0qUPv3iiuzMKBMBA8C39r6z1z18BLQAA3H9i8v37nmDMz5VZte02ABoFAAj81J8tOV/g93mp2E85vYmk9iXBTBi+qidQVWmWVtUjnqVtp4o3cJ3f52sbHGU47SjPKfTy3/SnzakirsKRzQdwq0fiF7AdAUicoGktb7SKbKg0YtBIpREh4wARpopEEVlJtFluixkcsX7zWjKPcWj2IRJs2AHpc8V/ZMAWI8hQNCaQETI2kzE1EsiEI9rIlBSHyYzHysXmUZMFV7wgKTk+kSU0zclKKt3Imi1nkI1ozidbeMaQnUzmkD1HHiUHUp4nR2x+Iie2IiJnnqJPLlzF5su4chQPHSjmakejUB0kaVRVagVNbAKH9rEdoF3cq2iH0iFRw8w7OpSeSu3sl2VTeOo78wQmtISURpqqlrQM9Ty0yTqag5RdMzRVcm9WoyF9kzErk0Ul+ukXy6VAviG1fdF5oGzJ6GYbhTnDHLaYiJdJ8v436B3aTtjLHqu2E+rCsY5L+w5vTDFr3Zl15r6fDOYEkjaO+cjaT8Vqqzesq91EmSTdafFznrjAlcW5a06vYVdwf+wiY+9CTs+p9zjWnF5rN2yPmbyrQXAs1zGXKGujzuZ0OtBQmSQA);}
+@font-face{font-family:"Inter Subset";src:url(data:application/font-woff2;base64,d09GMgABAAAAABzEABMAAAAALzgAABxWAAQAQgAAAAAAAAAAAAAAAAAAAAAAAAAAGoJjG4gGHCo/SFZBUoIJP01WQVKBKAZgP1NUQVSBXCc0AHwvgTYKjFSKdjCvWgE2AiQDVAssAAQgBYlAByAb4ywzo8HGAQTB7wEj+T8ccFME86LTO1iwBhRNtzeaN4zFsemn0TDWYsm9p6RthgWjFSUK/mPvRjzNKtorVwg/tIZur9XWgup3iqPA/pp8tgX/3zgNCQIRRyFYAP91SrXlCElmISKc2uydJNsnxSE5zVPqAmAKmBKDSyoQugDwSOR/9sWcfkokCVRdFdAAwQU+AKR3fkKXJ75737uz758PlFJVYo1Kx4S4GEQgFqsaDc8A3ewaKF/NkbsG+ikMj2d9r3KgBoVTT4ZK2zGKoZbsfsC6W+P/dJZ/QIQrL9ABYHlB6JKKqjS1Jb8+qTqEeuEAybbYgtEMEbra9A1PSApGIS3OdTmCuyE7+58voCmFyk37i/pUf7F7AHO5ZONNFpqFZqWQSLE75pKQo1bAUepvmv//NtNWd1HqPAtUjeEfPzkkJ0WTk6IC7JOi4tGMshpY27O7Ot6xZBizZPxmaRUEqvhrTD/8zRPkHqtUbcoUTZmiDYiITsm0nOstpOWZbNfSliXXCo6DGSQrbiqElMZh/3kBBE0OeG1JCoUQ8t/kkk0QoLIIMBEwF7ASbAdXwJPgY5CGRFHY0MwxYA95CIMIU7BUF5VGgQUIyom4ZfF4Xq2/M1J/kukVlkl5hRxPQ0PrE99857+VwMUOm+rSsvzR60pXNOakUv6Pbe7nocnCfGP43EdW5edhw/i87wBL2aSU7vmwmI+eU+tJo0yin6QEBMzFvkkNkRBgMyQH+6P01Zq06v+2vJ3P3hlHvnNdqfI7y8MFft1PfdcZk/cJiW5oZLC0VdH9O3TP55kyTK6noxR9D8Ns1SrDi5NOG0iyHtSEUaYKDeY2ZZaiBJboiZQ65IlAivCmCuguE1cU5bXyDamuPoWGW7qVHLmkg5iiplBFpeIkp1lVz0CqeJ0FWf24GLURP0v52d6bU8KpS38Shk1Usm8zmqw9x6gryufW89W7vTl58r3lx+AnSD3DuvG8lL6f673zXqt8AuorEz98IKQv5jf8/E18kr43vwVGe3U8eMHM77gVHEqX7vlZ8ZbS62Eeunp8+9XFTzrdyImtW5AfMypgyA1NEChzj8gCC4bf9gWbEBoHQxgPe4aiQqQERhpqNAELbsJevASWoGm0FsbSFDSHmp2SjULAmYFms/IsADMcEotZbIZDDlVUCJyDgzSjWVACoNmGKgnow4aYSTBDA3RuIphcVnnKawz+9naedyA81Qc/yXN4p68Y/MJeBI+PupC7gYyR7bez5bl63EjcaLTNX67nffV234r7tMPNuz7zVrfui3I2t76Ofnbw+Kc1t5gTq36+y9OnF077blxcOO2/tVyw4rv3XPUxN4Jgoy7bYdPrnQMwgmpwF8UPmm7x/2nwJUtM/gZKYKTZTNNmBIfgqI1hAQJAGJva/wF4IQDSw1qkZk1mZI7WgjVzx3I2GEvzkBu644J0FTHNaPr15mp59zMdOYW+9e/hIwGQs4uPzWyway3PA3vFNPU863PIx9408WRAYAu7Hz28zbSaRev9/xGjmy3vcbo12L6MF6/RIiEMjebz9qQyNWWqFRIGmHPN2wQM+aPn90YYU+QrrbpG2nrH0MX+bJckAFJJFJKdlcUhvYqRvRZPaY5UhtaVhGXzmLpPvcDIb9Drqb5XjuJ6s2a8lDOX00EVqwLyNrmrQrtgZkjygd7zbsfOXllT9qok1rJW9E6HQuXikkbEToux310WjUU1IyCRTGdzpS1UMwziyDSmoqq/7S8b7QLtK6vMkp2EaJ7XYeMQwiCisigUvghRV1hoRBEfRdyyCBhgM6veqxERhTNV87RYEjzVZYuTEvzebgWp+L5bQzryLgOZKemX3Ray8W+Xg9yUbGO3J/Ex0KYA8HAB/jIFkDy1IOW7mwJsPHclsbUGseAiityTeCdCQh6fByLlFnUjgLDgLDLSRf2359PWGxKIaffZhS+KBE+IWcu/Vrl3+Ka7TgiObsSce5rsvS4U2c7rlG4++60zabi+omESruWe1VjyNltKbb1X/rLkHQlUwgf16nmwXrfdz43UivfiL4rcDEue7zSDaLfWxp42LX6jRZ/T0j4RcwqmIEGJuQpuccNLpqsbXI6RCVZJXbOxajVqB7HvRgbsxCHxetEYeVc/Ma86WJpLVSe739BVqLNnTHFzfULalBsxNysrMShVhdutVujdp/x2sJrZ+2baxr2yy05+r17hs881CWwZ4IaXfLGoVq7XkawqkjHfHXS0zW0rfYa4cxNzTWLAGxTFXs8TtKPu6yYJer9AdnP4XokhN0D8b8bm31Br+YIHQ0fRS4YG1rZ40dWbNZn6ZsOBPk88d+ikZee2cvOiBplzRf7syyoumvYUbaR3tPZmIT5eoHmeHh0dtpXQ2JrgNk1ezOl2/mBTnJbgFirztGxwcygMntTlmOzMNr/WSSb+zMNwv7Ksawy1HGj1LUZdRdaphcU5+ip6NDlufVnRbvVM703UpPG5yNyi9aYFvjuo8WTJ7v4T26qn5xZbT7G0bpv0V7dEV8i0fdDs+ZxE3GoAW6/skqrWO2WTvbexM6baDeLaFtQIfHGqOh7QU1UbgTcAM2SP/A/bItPTCfsxkdbvnMOF23u8zgwcSePsLJwsTnYNHZWNzegAJY5qip5m9B3tUajdqclvxtQcuaF11ZeMjaZrLmsmjbakFvsE19kMP3t68dqH4qZevW0eEzuvtSS+zM3M+/86EjlxiU/rROPspUcSm8Eb70WvLxyNTGoz2zDHZxk5ekwBuqhopWyG7xx6OOF90DW4X1lGFBcYLwaLp00mDd7EPLGyFqzcMqtrq7d/BwClXEuB/7WU67Pk+1PxXSZpnbC3JOIiAWnty9rZdnGG8fd8vibW3PRi/ezvJ6dtqWy9XTLFexc/c5p5Xjt9A/BwYck3/xDKPY8q2lpY0Q3/TVDKhWnP0vPmnJFSw/aulP+h1bbZw7cqaBuQl6183GMGQjJzvx6ZuCN6ZHVvZmuHrk0REncHrnFecfXsoYWEze5zKvu9RtbJdb5df3YmvSirPbHIpV9Duswp7zXOy66eMbyEdjwW7aw0w2PvWORJnw5OrRLibTq1dj1XFNHcctvuNTyil9OPv6NoT+Q9x6bWKA3Je86Vs4ty7E0Nhj5UAc/RXYsFY6uyoYPc2aJ9QL1z13jwN50Kn/7YYdj6TnLHOUZQo1uQR8pTHYfAdiAFEJ2F1/KPmdf0Fy1r61vUWEcCHGUJAw4+R9QSqYYBiQMLgD5zjpKzPk+RmiUE/JDs1CyNnt8g0kZqrr/QfVkh7VT8b/94r0T+SrlAeTg0oe6mfueB7x+c1T794O6HNuoeBTAGXvVJ9GZ5KEs0ik36+gicl+0dq/EaSr+Oe2WmJy/8IDRYKUWysmKkafXQ/I0FelJlHEWJohXbfpp1uXDePEs6SkIbnIisVseTdBg4ZLiubXkyQwuY+i3QrRuV5FMoXhw5nPTzTq+FpBMCJ9iTqN1JI0RZr0EkKty1MAPSdzb4+/axQHqcx0oX6UQp+b1qzVWvYKgVh0n1a5vkx1ZpF3IL7R/+ilaZvQusRk2KeRmvXj1QTNXtZQeqMsuhq6baeK3FX8Ur657qbURDg0fDP2xZ5W3o7e5oa2mssaP63nk8QuqdKimRjt9e3duYHtyFtRePFs1Vg7XI49v9scsv9InrIkbbWfR67u6d2aEFg4O3T0TEwInVnlDlqhpwANTblkbQllmtiqJMmd6DdR5hMB6e7PWrHD2GX525usP5BxW8si1PKY+G6neTlVr110MNimVYaTgjdE9mS8/wsU36QDaQZ/NIORQ6hlAcDnxO98h+QKCW5908q5RpUKhyQSeyTn8YqTyhgATx0+u6KIks8qISknLHzfrQK1fmbwxRw3kc+IBML+w4l6T4jrY5Ms4Ux8N2ktRSVIiiJp10Z5rCUc4nDUbDHn/EZavMdOf6ytkw40kSRQzWPMqk4QkVncJhg8oBDSqC+KFRIziItm3d1JOsbhtoTQK+LodWbxZMZ7Zljk4nRXvSwmy0ag5GaWELSFyGog6JDrRjJTrQruR7cdTeqEoSQhDi8qI+T9YKSaoEXcKapIjRAoOr0BxIhltOHwqDLLrzO3n8oo4Eh+4QUcaeQLv7hCGOaNjBgEXlP7OIo4zxcT3f7UcYwxd8tnF1FLJyKp3NRgh5NNVzwwqbt8FDQE7JvtnZLHvVjqt3SJGUGVg6XHRO3F1v6l2FUruZO+fRCB+bTFk0CDI+p5V365850RgyYMEs0lozvaC+gXhytKt++OmzcREsBUFMsIqgFYVWLxLDiPSezoOm0CZYaVbrb4ADHL7POuGX59H5mHTHm6DSjCpw4NBWXcvfHj0PEYrj3o3c5XvVG4skdq0ceEITvbiyKxdVfeRM07c732CV/4vKzFyJZsPegpqmq8dlnMBxFbfYVEX1In7EShAQRFFW9nh6r4X3GHhZ59l2S6JRp9ViU7HaQUFg7091/9gs8pxORU2RvPZABKV9DyWlL8MJG5UMS2TgVrShA+OtbWXv85yKlKscAU2dqVQbFMMQiiqgrMoE3Srndw9assqDAwE1TvWeymSLzIMpGv6w2qK5NK/ja8FM3HJ0OGIxDMrtugOjkWOS4Sy7frlfO5Tr1QyDW3jUN19k93uFkPu2qzf7FfwWbbVq20rHMOu/RA82TdSUu5IbzlFunSQrWzyD/b/6e7tNHfnMKROyR+ZqoWJm8/r5+x4+5j5kT4rgoI3tNwU9knb9QfHUcP7T+qlyqKaUU4lSJEJnN3kE1dkF9+wGsSo6Ir3wizw3IIJN8h7g3LBhdSq3J4/KHYgspNyKBndh8gRvRw+5zuChlWBb/e489pdzLh/8fwmBvCDQOD5tUbNW+9YjV/beuEMyDhLEC8tVSap6+3iD7G1nTxdnzRByM4vrdZd1YDiKIKTW7MHpzRmU5G5xPG4GhUFJ4JxkVcOpFN6htHsEa+L5WGI6y2nacF4DZ8/StD9hAxNd6EIKnegu8w88LiCnNbiahpjC9BhBVIo1kmMb1XI7x1uNcqFazp+qQK3To+c601J4fXThUpYFQRobPBQhKl1AE0F09aTXOKhw8G5HrkOpMlY8rjS6sa6UTBZI2ZPrhNi9oXODueLqqmefu9wG3wC1NLbMeVOKJP+hsrLP2XHQslLaIn36ffi9nxotHD1zmN69o5i2fnDiPRArHBwa8AO+lTbX7Fp+/4IYAytNbt8Fca+Aj1IXx5OO6zwQbU6VrpMVGt61U9F699HbrrD895VB1397X9/ftTlysTn3gFVPI3dnJzTEO0az515vkH+sl9Rd/Spoq7qCYbn3GhfJ4z74jK5a5SVDrETo7PSZiqJtMS9G0HRqpI8HthgvdlX0gDqq4AzYICjOsNLW3NjI73dxnNPrtJopouyBoNvu8gUjXmtZ6UmGCWNciPtD7L5e23ZZkkvHq/md2YjX5a/i9qRjkSOxHGuwFcuxTFz4ukJT3h1Hu+yKjJuhVI9OX6YgEkg0eXzouFir5SF7J0mc5AnRIHVDkOkaOBhrrR6UTqh/7BPoNPoFd233NvEjjcXrgmhwnsawV2Ct/pKTVEmGjEpuLOE4t2v708IjuWdu3Uj0e1kyvNxuuV9o8wJtMdK6Mw6SvBqyfJ2376KJ/DFfO4FvPH4CPBBQ+UBn+ePGjmf86cVHHxm/bkuWpEomWAxfXjLIqTBVqP4bZ97c9/IwaFsl18Pk9H9uDxUiuflk88aZD+3V/V4WJ7NjZjBoSMrqMQ4K1NYFKmlknM1ugczXBHnxSP3+am9GBIfsxDKopkGRbTLGIz3B/e3LpAk8G9xylvv8OpzPEtu1UR93tgUSJXNg/RywluwfU7aatPft8Uzn+myh4qEeG5Xq9XP3YGEznBWZuDHrGBLMPERM1XgO5ZRA8m0I63QRB43I01eyPgU6KK6QZhn55wP5JtRV7At11RBE1qiuutmFC7V+2s898ZinWOIIg2mJBBVmzlq5bD2vbkFgKAeB8gRJhjOvvTm8jEACw1y0vnweYRgXRCjAKTNFaDOuUjyJWoW8IFDWVBeX84wOCrqD0UTlTpIfxfZkd/sFWku25So6Bm/14l02WCbcpICNhXW10wUECGiEAKFIvQFncL6I5bdXt45Fgn5HnhVECI4HOHv4PmMqdWgD3+b5SCDXg+Ku3O1HZmh+ZXR3d7/cMPE1T+ba9UHg01AiLLRa5diAWzsNCltWu2i8I1s9665T3q1/Zf8pehxTj2GTZs1F/vg8gnvCzcXE8j3dQC1w/XDsS67scOwb3blNXtrk2SRbfw1cOOT+F8+s/OY0prrUZiLmX7eTKAbvfjvhexQe7hppXfWdQ8Nh3+tkV04EQQ4HzIQLSt06EpiXLdOjADOU+BjuTO+SGxi2anAmTy0M40EJFVRQQQUVv7Wegt/Tcd9hA+93/AwmD8klmgR8g/pJ7Uaojd6Rt6KM4HXKuPvwGnAI4LZh9stiF3DSPItKNuCumCV1uRd5H/hWFhmsSQvwJi3EtCAD4wMIBWOoPrQXI8sCN8L1Opa7PQmtval+B+6KRO49NTZ5sotxVh2IgE+BHA8/3S7Y51rDnkUAp5oTc+OR20ofvsxbWqMBJn+2vl+Shy0shV0q3UIU/SWOE7t1475RYU0TPFPiRI8WWlD6Tn+hCqZpJloRNS5WaD0Y+CFZMmdT+Wjz6rLAhi2nO3zg05Zf26StfmiSGiD6jQBoYIUGZKDoqtl/GOniboOmuSyzuqdaV+XHr+J/cQHPmA43TegBW8QQQxJxxGbZfZygtr+eZOcEUcgdzs7tr3TWgN0Blb2bnZOy3+ugrp/pfvfxGmcsKrGyscVhI8kRKRssiQU29W4WbTwHbwzXskGbBoekqamhwUXnyO27g+lVbCUVoDePohES7GlfprxeLO5OO667ePGXfzy6frsVsvvDl3tFsM9G9CRm7QW11zJF+wx6GbwBNsWmPcXJ41Meaxpy5od7uVTV2KG+hgm4oiaRu4wovKBSP0Ziu+ArqmpVtJyK0sZC4q1QHScw8HGyESZdbgemqITNzUESzm1jvXmTvKyNjw7wNjNepIG42KkVJVeVMKZSeVkwx+kZ2Es/c0svWdo9U+SroB2r0IE227dfK0lVYfbo8MqoUXcHhzCAeGib9uvYNRdQXAOEEEYY14uAFVLc0uBgCHETuGDwMBL6AcUlMOuh4WinjLfOiwQXj3LU6PUhYmh78NDi5QKKaw/MiKlhOLqTf2XKtdz13ssYbrpUE3KPFNcAzIiTEYSTe2WqF+njDoqCJy2V4HkVvPI01e0kCU8IIYI4AgjY+F7K8y385PgUk0wmMuhzp2GKwJa0ib+O1esVDL1wcLrZWiFr5J50k0kGp/bOl35DIjFHTeLSoJkANXDe4w3jmYDeAKt1js1bmakTBvJu/UvJbTVbh4Ys0dwbRrTFvtTyWrDNaCTYQLXtvF/DKc/6KnlXtIl+MQDqU2IzrP1J/4rStNOdoXB3IBD0eOHDsZngR3DRf4JepTdtPG4HlpF+rgBBNE2ZI6LY2t091N9ZsolyGDQaQpAqVWeSK2/mvTR9qyCJJFYgjbQw9BpkOKSTNbZ54ML1o7ysuLm/triPnZnYm1/dOK1ev7S0NBe5fBRsC6inmg/J8RImyjpx4NiWIdEtSZ7dMXeC0xlOEDW563n9QZWf2w+w7C3JvYfL7ejalPdcYmgfKp0YHJY3PjX3WegL+7WTdPHESXB3QL0zVXLpBo7i9pv7f16lRx20DhNnFs0ZmY9VTXIarzZ50x8NrEr6z1r9Q1ug10in+Ty6M3wOCyuY1fZEzZwdBeq/RMt9qRqw97yVMlsXA8tQzEQydE2CBExOZ4Sq5snVoVIwdYxtlvJnlc46zD1q4cUcGvWjwcOBwsLyqsJNOhotMdrleGESTLBLoZPKoaWL4412a8Dl4X1BHfyHPnZmOJ/EQwBjv5JWDyjTPhdBlIVjji24uO9EPeuVw4yCmerdUXq/QlZ2uN2UNqrCYCgO8QG3wpxBd7B6nxJzbr4k1xflrYUC70APCpGAm4Z4kBNUOqaPddrbNFQp6zhvyiKrOibKU+yJ+U45I4hIsu5r6mhQoBwxhJpCZljhO1I4bR+nvSpZ8cBx4Be8r+M4JklGusN3NG+oLfda2XXvwjwtTpXpm2LuV8PbjzI8u0ZMi1YxIu28dKmfwqnf0t8Km5vbbnhibxuFRib+lw1tBIu77g6CAjwfHosUzkJB60PQN1dWh8lTfzyZ7YF7V7sslMTmg18bZzg1cCoFbjgbk6C2fdZD8gD5C3kjdsSJggBkDMaBHa3CDJxllVTRcFNMfNqcjSUSCrvH+Q6+8qqWzrqlseZoDweJL5I706DcaVK37QmQgmuzEuzgEAAHLqbpSqgy9VpJk0WyePEo2JM2wdexWVCfStVj9eqvuicaDl/3BkGz92st6c2HHgLugPOed+xGkohHejphz73xgZuXga62ptaGWOXdD93t6nKzKXB3e2DbYiy2WA02ov+FDlzzspkgL7MRGIvb+NJfyqt6fX1oaO3tfWdnqlRH82j7v+2J6DQT4BQkuaCqTP9ivJMjQ+q6hFvk1qQUBp5s4G49VPvZAONfDP8betRPwZOsjBttIgAe5FTmwxKEsEuFJEHViBDvV2SY6Bw6lqrdxJquKrfbxE4tWdO2N05gjCgJHgCX76QkD2OOGgUGdZ7nnzo2e0727nAETcX1c4PAOYo5+66dyL7JK54p1/A8rKqjoytuc+ZpFg1k/yLmd6GWPWvwTF2a3peEHz4jbYGDgXBZS+vgzBxoTvia8lqXfZnM4nwiPSF25v0+rHB1sXrjYFf8V2RbaA5103MXka7j+ZUtMRmlsuSxlDkXrAsKXhaEwFBocHpYPBOG4oQbadkHCFBQQDguLlMVmMyDDCt3kO8jmePu+06G/P0IL5rhJyYIeXc070pxh/79hkqd0gYJQYjSL4rsk71V4NB44V7Z8vLf7vsDKQoKsuy+Ux1gQrAAN1Cw7JMCVyjTlXVL+/63vVOfX/n8l0/t7SAAASxaHDrPvZcRdfoP6zAAn56RLMS9BX+T/00MJvneBzQKAIHv+v3YYyH1x9irg+9KbNVM/KwWfpfnHFy2GrtMNrykWw6On1hgioW0D9kansvWh6de/2MamBiIvyxmmU+ouurADsxHADHLeUxVROA5WW18rKQRKxLdXQET7tSVKaJMZJqBwitbOGZT1xtTHG4f3iYC+aMsMMGTJkwRlvZMU3p0Zxb+mM1sqo+1zMHIPSxE2fEYCxNl4pUjeTODJ98wl/IjxTyyUsAyqJyqLEpY9WeZlM5wliUnK1m2qtnNchj1BMtVNi+xivKTYpWEdZRVFtV5rApPl45fldHVtaTRBUwCDs82VlN1NdQ9D+v5FFhpR2X7XqaxrkwaEaI1guacPlt1tHdXta6l3kjqWhJFhl4j4DhrC1bOVVU9N6fwXCuwTTVQ82diDcNhI8ZMoe7ePLQr7dFf/O7qpuB9Ih2r9DxoVOP8Lm0elSc6+5lGI70x+eYh9AVtZ9nLiGutljSP0y74a0yke4pLrXvJOpf9emHwHmr6rAUO5XpRrPN2gfJqn9LIGN2LxV9mlod8HS+75sVrGFquv/c06ZpHXrxLW3vg3aR3zjeaRa+QAjdhYk2dyiuN8mSxKgs/pf+HrQc=);}
diff --git a/static/feed_style.xsl b/static/feed_style.xsl
index 6068bd2..1e413bb 100644
--- a/static/feed_style.xsl
+++ b/static/feed_style.xsl
@@ -1,9 +1,12 @@
+ xmlns:atom="http://www.w3.org/2005/Atom" xmlns:tabi="https://github.com/welpo/tabi">
+
+
+
• Feed
@@ -11,7 +14,8 @@
-
+
+
@@ -19,42 +23,74 @@
-
-
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
diff --git a/static/fonts/Inter4.woff2 b/static/fonts/Inter4.woff2
index 1f5bfa1..2da2691 100644
Binary files a/static/fonts/Inter4.woff2 and b/static/fonts/Inter4.woff2 differ
diff --git a/static/isso.css b/static/isso.css
index 26d26c5..c5a7329 100644
--- a/static/isso.css
+++ b/static/isso.css
@@ -27,8 +27,8 @@ h4.isso-thread-heading {
}
.isso-feedlink {
- float: right;
- padding-left: 1em;
+ float: inline-end;
+ padding-inline-start: 1em;
}
.isso-feedlink a {
@@ -52,13 +52,13 @@ h4.isso-thread-heading {
.isso-comment:not(:first-of-type),
.isso-follow-up .isso-comment {
- margin-bottom: 0.5em;
+ margin-block-end: 0.5em;
border-top: 1px solid var(--divider-color);
}
.isso-avatar {
display: block;
- float: left;
+ float: inline-start;
margin: 0.95em 0.95em 0;
}
@@ -77,7 +77,7 @@ h4.isso-thread-heading {
}
.isso-follow-up {
- padding-left: calc(7% + 20px);
+ padding-inline-start: calc(7% + 20px);
}
.isso-comment-footer {
@@ -94,7 +94,7 @@ h4.isso-thread-heading {
/* Only for comment header, spacer between up-/downvote should have no padding */
.isso-comment-header .isso-spacer {
- padding: 0 6px;
+ padding-inline: 6px;
}
.isso-spacer,
@@ -113,7 +113,7 @@ h4.isso-thread-heading {
}
.isso-note {
- float: right;
+ float: inline-end;
}
.isso-author {
@@ -146,7 +146,7 @@ h4.isso-thread-heading {
}
.isso-text p:last-child {
- margin-bottom: 0.2em;
+ margin-block-end: 0.2em;
}
.isso-text h1,
@@ -228,7 +228,7 @@ h4.isso-thread-heading {
position: relative;
bottom: 1px;
vertical-align: middle;
- margin-left: 0;
+ margin-inline-end: 0;
}
.isso-notification-section {
@@ -257,7 +257,7 @@ h4.isso-thread-heading {
}
.isso-input-wrapper {
- margin-right: 0.5em;
+ margin-inline-end: 0.5em;
}
.isso-input-wrapper input,
@@ -289,7 +289,8 @@ h4.isso-thread-heading {
border: none;
border-radius: 5px;
background-color: var(--primary-color);
- padding: 0.6em 1em;
+ padding-inline: 1em;
+ padding-block: 0.6em;
color: var(--background-color);
font-size: 0.8rem;
}
diff --git a/static/isso.min.css b/static/isso.min.css
index 7d106d1..2d7b16c 100644
--- a/static/isso.min.css
+++ b/static/isso.min.css
@@ -1 +1 @@
-.isso-avatar svg,.isso-preview,.isso-textarea{border:1px solid var(--divider-color);width:100%}#isso-thread *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#isso-thread{margin:0 auto;padding:0;width:100%;color:var(--text-color);font-size:.9em;font-family:var(--sans-serif-font)}h4.isso-thread-heading{padding-bottom:.2em;color:var(--text-color);font-size:1.2rem}.isso-feedlink,.isso-note{float:right}.isso-feedlink a{vertical-align:bottom;font-size:.8em}.isso-comment{margin:0 auto;max-width:68em}.isso-preview .isso-comment{margin:0;padding-top:0}.isso-comment:not(:first-of-type),.isso-follow-up .isso-comment{margin-bottom:.5em;border-top:1px solid var(--divider-color)}.isso-avatar{display:block;float:left;margin:.95em .95em 0}.isso-avatar svg{border-radius:3px;max-width:48px;height:100%;max-height:48px}.isso-text-wrapper{display:block;padding:.3em}.isso-follow-up{padding-left:calc(7% + 20px)}.isso-comment-header{font-size:.85em}.isso-comment-header a{text-decoration:none}.isso-comment-header .isso-spacer{padding:0 6px}.isso-note,.isso-parent,.isso-permalink,.isso-spacer{color:var(--meta-color);font-weight:400;text-shadow:none}.isso-note:hover,.isso-parent:hover,.isso-permalink:hover{color:var(--hover-color)}.isso-author{color:var(--text-color);font-weight:500}.isso-page-author-suffix{color:var(--text-color-high-contrast);font-weight:700}.isso-input-wrapper input,.isso-preview,.isso-textarea{background-color:var(--bg-2);color:var(--text-color);font-family:var(--sans-serif-font)}.isso-is-page-author>.isso-text-wrapper{background-color:var(--bg-1)}.isso-preview,.isso-textarea{padding:10px;font-size:.8em}.isso-comment-footer,.isso-comment-footer .isso-votes{color:var(--meta-color)}.isso-text p{margin-top:-.4em}.isso-text p:last-child{margin-bottom:.2em}.isso-text h1,.isso-text h2,.isso-text h3,.isso-text h4,.isso-text h5,.isso-text h6{font-weight:700;font-size:130%}.isso-comment-footer{clear:left;font-size:.8em}.isso-comment-footer a,.isso-feedlink{margin:.4em;padding:.1em;font-weight:700;text-decoration:none}.isso-downvote svg,.isso-upvote svg{position:relative;top:.2em}.isso-downvote:hover svg,.isso-upvote:hover svg{fill:var(--hover-color)}.isso-comment .isso-postbox{margin-top:.8em}.isso-comment.isso-no-votes>*>.isso-comment-footer .isso-votes,.isso-post-action input[name=edit],.isso-postbox.isso-preview-mode>.isso-form-wrapper .isso-textarea,.isso-postbox.isso-preview-mode>.isso-form-wrapper input[name=preview],.isso-preview{display:none}.isso-postbox{clear:right;margin:0 auto 2em}.isso-form-wrapper{display:flex;flex-direction:column}.isso-preview,.isso-textarea{margin-top:.2em;border-radius:5px}.isso-textarea{outline:0;width:100%;resize:none}.isso-form-wrapper input[type=checkbox]{position:relative;bottom:1px;vertical-align:middle;margin-left:0}.isso-notification-section{display:none;padding-top:.3em;padding-bottom:10px;font-size:.9em}.isso-auth-section{display:flex;flex-direction:row}.isso-input-wrapper,.isso-post-action{display:flex;flex-direction:column;justify-content:flex-end;align-items:center;margin:0 auto;max-width:35%;font-size:.8em;font-family:var(--sans-serif-font);text-align:center}.isso-input-wrapper{margin-right:.5em}.isso-input-wrapper input,.isso-post-action input{margin-top:auto}.isso-input-wrapper label{display:inline-block;margin-top:auto;height:auto;line-height:1.4em}.isso-input-wrapper input{border:1px solid var(--divider-color);border-radius:5px;padding:.3em;width:100%;line-height:1.2em}.isso-post-action input{cursor:pointer;margin:.1em;border:none;border-radius:5px;background-color:var(--primary-color);padding:.6em 1em;color:var(--background-color);font-size:.8rem}.isso-post-action{display:block;align-self:flex-end;margin:0 auto}.isso-post-action>input:hover{opacity:.8}.isso-postbox.isso-preview-mode>.isso-form-wrapper .isso-preview{display:block}.isso-postbox.isso-preview-mode>.isso-form-wrapper input[name=edit]{display:inline}.isso-preview{background:repeating-linear-gradient(-45deg,var(--bg-0),var(--bg-0) 10px,var(--bg-2) 10px,var(--bg-2) 20px);background-color:var(--bg-0)}.isso-target{animation:5s ease-out isso-target-fade}@keyframes isso-target-fade{0%{background-color:var(--divider-color)}}@media screen and (max-width:600px){.isso-auth-section{flex-direction:column;text-align:center}.isso-input-wrapper{display:block;margin:0 0 .4em;max-width:100%}.isso-input-wrapper input{width:100%}.isso-post-action{margin:.4em auto;width:60%}}
+.isso-avatar svg,.isso-preview,.isso-textarea{border:1px solid var(--divider-color);width:100%}#isso-thread *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#isso-thread{margin:0 auto;padding:0;width:100%;color:var(--text-color);font-size:.9em;font-family:var(--sans-serif-font)}h4.isso-thread-heading{padding-bottom:.2em;color:var(--text-color);font-size:1.2rem}.isso-feedlink,.isso-note{float:right}.isso-feedlink a{vertical-align:bottom;font-size:.8em}.isso-comment{margin:0 auto;max-width:68em}.isso-preview .isso-comment{margin:0;padding-top:0}.isso-comment:not(:first-of-type),.isso-follow-up .isso-comment{margin-bottom:.5em;border-top:1px solid var(--divider-color)}.isso-avatar{display:block;float:left;margin:.95em .95em 0}.isso-avatar svg{border-radius:3px;max-width:48px;height:100%;max-height:48px}.isso-text-wrapper{display:block;padding:.3em}.isso-follow-up{padding-inline-start:calc(7% + 20px)}.isso-comment-header{font-size:.85em}.isso-comment-header a{text-decoration:none}.isso-comment-header .isso-spacer{padding:0 6px}.isso-note,.isso-parent,.isso-permalink,.isso-spacer{color:var(--meta-color);font-weight:400;text-shadow:none}.isso-note:hover,.isso-parent:hover,.isso-permalink:hover{color:var(--hover-color)}.isso-author{color:var(--text-color);font-weight:500}.isso-page-author-suffix{color:var(--text-color-high-contrast);font-weight:700}.isso-input-wrapper input,.isso-preview,.isso-textarea{background-color:var(--bg-2);color:var(--text-color);font-family:var(--sans-serif-font)}.isso-is-page-author>.isso-text-wrapper{background-color:var(--bg-1)}.isso-preview,.isso-textarea{padding:10px;font-size:.8em}.isso-comment-footer,.isso-comment-footer .isso-votes{color:var(--meta-color)}.isso-text p{margin-top:-.4em}.isso-text p:last-child{margin-bottom:.2em}.isso-text h1,.isso-text h2,.isso-text h3,.isso-text h4,.isso-text h5,.isso-text h6{font-weight:700;font-size:130%}.isso-comment-footer{clear:left;font-size:.8em}.isso-comment-footer a,.isso-feedlink{margin:.4em;padding:.1em;font-weight:700;text-decoration:none}.isso-downvote svg,.isso-upvote svg{position:relative;top:.2em}.isso-downvote:hover svg,.isso-upvote:hover svg{fill:var(--hover-color)}.isso-comment .isso-postbox{margin-top:.8em}.isso-comment.isso-no-votes>*>.isso-comment-footer .isso-votes,.isso-post-action input[name=edit],.isso-postbox.isso-preview-mode>.isso-form-wrapper .isso-textarea,.isso-postbox.isso-preview-mode>.isso-form-wrapper input[name=preview],.isso-preview{display:none}.isso-postbox{clear:right;margin:0 auto 2em}.isso-form-wrapper{display:flex;flex-direction:column}.isso-preview,.isso-textarea{margin-top:.2em;border-radius:5px}.isso-textarea{outline:0;width:100%;resize:none}.isso-form-wrapper input[type=checkbox]{position:relative;bottom:1px;vertical-align:middle;margin-inline-end:0}.isso-notification-section{display:none;padding-top:.3em;padding-bottom:10px;font-size:.9em}.isso-auth-section{display:flex;flex-direction:row}.isso-input-wrapper,.isso-post-action{display:flex;flex-direction:column;justify-content:flex-end;align-items:center;margin:0 auto;max-width:35%;font-size:.8em;font-family:var(--sans-serif-font);text-align:center}.isso-input-wrapper{margin-inline-end:.5em}.isso-input-wrapper input,.isso-post-action input{margin-top:auto}.isso-input-wrapper label{display:inline-block;margin-top:auto;height:auto;line-height:1.4em}.isso-input-wrapper input{border:1px solid var(--divider-color);border-radius:5px;padding:.3em;width:100%;line-height:1.2em}.isso-post-action input{cursor:pointer;margin:.1em;border:none;border-radius:5px;background-color:var(--primary-color);padding:.6em 1em;color:var(--background-color);font-size:.8rem}.isso-post-action{display:block;align-self:flex-end;margin:0 auto}.isso-post-action>input:hover{opacity:.8}.isso-postbox.isso-preview-mode>.isso-form-wrapper .isso-preview{display:block}.isso-postbox.isso-preview-mode>.isso-form-wrapper input[name=edit]{display:inline}.isso-preview{background:repeating-linear-gradient(-45deg,var(--bg-0),var(--bg-0) 10px,var(--bg-2) 10px,var(--bg-2) 20px);background-color:var(--bg-0)}.isso-target{animation:5s ease-out isso-target-fade}@keyframes isso-target-fade{0%{background-color:var(--divider-color)}}@media screen and (max-width:600px){.isso-auth-section{flex-direction:column;text-align:center}.isso-input-wrapper{display:block;margin:0 0 .4em;max-width:100%}.isso-input-wrapper input{width:100%}.isso-post-action{margin:.4em auto;width:60%}}
diff --git a/static/js/addSrcToCodeBlock.js b/static/js/addSrcToCodeBlock.js
deleted file mode 100644
index 9b4cb9e..0000000
--- a/static/js/addSrcToCodeBlock.js
+++ /dev/null
@@ -1,20 +0,0 @@
-document.addEventListener("DOMContentLoaded", function() {
- document.querySelectorAll('.code-source').forEach(function(marker) {
- let sourceUrl = marker.getAttribute('data-source');
- let nextPre = marker.nextElementSibling;
-
- if (nextPre && nextPre.tagName === 'PRE') {
- let codeElement = nextPre.querySelector('code');
- if (codeElement) {
- // Use a span element for the source path if it's not a link.
- let sourceElement = document.createElement(sourceUrl.startsWith('http') ? 'a' : 'span');
- sourceElement.textContent = sourceUrl;
- sourceElement.className = 'source-path';
- if (sourceUrl.startsWith('http')) {
- sourceElement.href = sourceUrl;
- }
- codeElement.prepend(sourceElement);
- }
- }
- });
-});
diff --git a/static/js/addSrcToCodeBlock.min.js b/static/js/addSrcToCodeBlock.min.js
deleted file mode 100644
index ddd04ae..0000000
--- a/static/js/addSrcToCodeBlock.min.js
+++ /dev/null
@@ -1 +0,0 @@
-document.addEventListener("DOMContentLoaded",function(){document.querySelectorAll(".code-source").forEach(function(t){var e,n=t.getAttribute("data-source"),t=t.nextElementSibling;t&&"PRE"===t.tagName&&(t=t.querySelector("code"))&&((e=document.createElement(n.startsWith("http")?"a":"span")).textContent=n,e.className="source-path",n.startsWith("http")&&(e.href=n),t.prepend(e))})});
diff --git a/static/js/codeBlockNameLinks.js b/static/js/codeBlockNameLinks.js
new file mode 100644
index 0000000..ea0b678
--- /dev/null
+++ b/static/js/codeBlockNameLinks.js
@@ -0,0 +1,36 @@
+document.addEventListener("DOMContentLoaded", function() {
+ // Convert URLs in data-name to links.
+ document.querySelectorAll('code[data-name]').forEach(function(code) {
+ const name = code.getAttribute('data-name');
+ if (name.startsWith('http')) {
+ const link = document.createElement('a');
+ link.href = name;
+ link.className = 'source-path';
+ link.textContent = name;
+ code.insertBefore(link, code.firstChild);
+ // Remove data-name to avoid overlap with Zola's native display.
+ code.removeAttribute('data-name');
+ code.parentElement?.removeAttribute('data-name');
+ }
+ });
+
+ // Legacy support for old shortcode. https://github.com/welpo/tabi/pull/489
+ document.querySelectorAll('.code-source').forEach(function(marker) {
+ const sourceUrl = marker.getAttribute('data-source');
+ const nextPre = marker.nextElementSibling;
+ if (nextPre?.tagName === 'PRE') {
+ const code = nextPre.querySelector('code');
+ if (code) {
+ if (sourceUrl.startsWith('http')) {
+ const link = document.createElement('a');
+ link.href = sourceUrl;
+ link.className = 'source-path';
+ link.textContent = sourceUrl;
+ code.insertBefore(link, code.firstChild);
+ } else {
+ code.setAttribute('data-name', sourceUrl);
+ }
+ }
+ }
+ });
+});
diff --git a/static/js/codeBlockNameLinks.min.js b/static/js/codeBlockNameLinks.min.js
new file mode 100644
index 0000000..df1f999
--- /dev/null
+++ b/static/js/codeBlockNameLinks.min.js
@@ -0,0 +1 @@
+document.addEventListener("DOMContentLoaded",function(){document.querySelectorAll("code[data-name]").forEach(function(e){var t,a=e.getAttribute("data-name");a.startsWith("http")&&((t=document.createElement("a")).href=a,t.className="source-path",t.textContent=a,e.insertBefore(t,e.firstChild),e.removeAttribute("data-name"),e.parentElement?.removeAttribute("data-name"))}),document.querySelectorAll(".code-source").forEach(function(e){var t,a=e.getAttribute("data-source");"PRE"===(e=e.nextElementSibling)?.tagName&&(e=e.querySelector("code"))&&(a.startsWith("http")?((t=document.createElement("a")).href=a,t.className="source-path",t.textContent=a,e.insertBefore(t,e.firstChild)):e.setAttribute("data-name",a))})});
diff --git a/static/js/copyCodeToClipboard.js b/static/js/copyCodeToClipboard.js
index e22debe..805eb59 100644
--- a/static/js/copyCodeToClipboard.js
+++ b/static/js/copyCodeToClipboard.js
@@ -36,7 +36,7 @@ const getTableCode = (block) => {
.join('');
};
-document.querySelectorAll('pre').forEach((block) => {
+document.querySelectorAll('pre:not(.mermaid)').forEach((block) => {
const copyDiv = document.createElement('div');
copyDiv.setAttribute('role', 'button');
copyDiv.setAttribute('aria-label', initCopyText);
diff --git a/static/js/copyCodeToClipboard.min.js b/static/js/copyCodeToClipboard.min.js
index f27628a..240d4ff 100644
--- a/static/js/copyCodeToClipboard.min.js
+++ b/static/js/copyCodeToClipboard.min.js
@@ -1 +1 @@
-const copiedText=document.getElementById("copy-success").textContent,initCopyText=document.getElementById("copy-init").textContent,changeIcon=(e,t)=>{e.classList.add(t),e.setAttribute("aria-label",copiedText),setTimeout(()=>{e.classList.remove(t),e.setAttribute("aria-label",initCopyText)},2500)},addCopyEventListenerToDiv=(e,t)=>{e.addEventListener("click",()=>copyCodeAndChangeIcon(e,t))},copyCodeAndChangeIcon=async(t,e)=>{e=(e.querySelector("table")?getTableCode:getNonTableCode)(e);try{await navigator.clipboard.writeText(e),changeIcon(t,"checked")}catch(e){changeIcon(t,"error")}},getNonTableCode=e=>[...e.querySelectorAll("code")].map(e=>e.textContent).join(""),getTableCode=e=>[...e.querySelectorAll("tr")].map(e=>e.querySelector("td:last-child")?.innerText??"").join("");document.querySelectorAll("pre").forEach(e=>{var t=document.createElement("div");t.setAttribute("role","button"),t.setAttribute("aria-label",initCopyText),t.setAttribute("title",initCopyText),t.className="copy-code",e.prepend(t),addCopyEventListenerToDiv(t,e)});
+const copiedText=document.getElementById("copy-success").textContent,initCopyText=document.getElementById("copy-init").textContent,changeIcon=(e,t)=>{e.classList.add(t),e.setAttribute("aria-label",copiedText),setTimeout(()=>{e.classList.remove(t),e.setAttribute("aria-label",initCopyText)},2500)},addCopyEventListenerToDiv=(e,t)=>{e.addEventListener("click",()=>copyCodeAndChangeIcon(e,t))},copyCodeAndChangeIcon=async(t,e)=>{e=(e.querySelector("table")?getTableCode:getNonTableCode)(e);try{await navigator.clipboard.writeText(e),changeIcon(t,"checked")}catch(e){changeIcon(t,"error")}},getNonTableCode=e=>[...e.querySelectorAll("code")].map(e=>e.textContent).join(""),getTableCode=e=>[...e.querySelectorAll("tr")].map(e=>e.querySelector("td:last-child")?.innerText??"").join("");document.querySelectorAll("pre:not(.mermaid)").forEach(e=>{var t=document.createElement("div");t.setAttribute("role","button"),t.setAttribute("aria-label",initCopyText),t.setAttribute("title",initCopyText),t.className="copy-code",e.prepend(t),addCopyEventListenerToDiv(t,e)});
diff --git a/static/js/filterCards.js b/static/js/filterCards.js
new file mode 100644
index 0000000..a24137f
--- /dev/null
+++ b/static/js/filterCards.js
@@ -0,0 +1,99 @@
+document.addEventListener('DOMContentLoaded', () => {
+ const cards = document.querySelectorAll('.card');
+ const filterLinks = document.querySelectorAll('.filter-controls a');
+ const allProjectsFilter = document.querySelector('#all-projects-filter');
+ if (!cards.length || !filterLinks.length) return;
+ allProjectsFilter.style.display = 'block';
+
+ // Create a Map for O(1) lookups of links by filter value.
+ const linkMap = new Map(
+ Array.from(filterLinks).map(link => [link.dataset.filter, link])
+ );
+
+ // Pre-process cards data for faster filtering.
+ const cardData = Array.from(cards).map(card => ({
+ element: card,
+ tags: card.dataset.tags?.toLowerCase().split(',').filter(Boolean) ?? []
+ }));
+
+ function getTagSlugFromUrl(url) {
+ return url.split('/').filter(Boolean).pop();
+ }
+
+ function getFilterFromHash() {
+ if (!window.location.hash) return 'all';
+ const hash = decodeURIComponent(window.location.hash.slice(1));
+ const matchingLink = Array.from(filterLinks).find(link =>
+ getTagSlugFromUrl(link.getAttribute('href')) === hash
+ );
+ return matchingLink?.dataset.filter ?? 'all';
+ }
+
+ function setActiveFilter(filterValue, updateHash = true) {
+ if (updateHash) {
+ if (filterValue === 'all') {
+ history.pushState(null, '', window.location.pathname);
+ } else {
+ const activeLink = linkMap.get(filterValue);
+ if (activeLink) {
+ const tagSlug = getTagSlugFromUrl(activeLink.getAttribute('href'));
+ history.pushState(null, '', `#${tagSlug}`);
+ }
+ }
+ }
+ const isAll = filterValue === 'all';
+ const display = isAll ? '' : 'none';
+ const ariaHidden = isAll ? 'false' : 'true';
+ requestAnimationFrame(() => {
+ filterLinks.forEach(link => {
+ const isActive = link.dataset.filter === filterValue;
+ link.classList.toggle('active', isActive);
+ link.setAttribute('aria-pressed', isActive);
+ });
+ if (isAll) {
+ cardData.forEach(({ element }) => {
+ element.style.display = display;
+ element.setAttribute('aria-hidden', ariaHidden);
+ });
+ } else {
+ cardData.forEach(({ element, tags }) => {
+ const shouldShow = tags.includes(filterValue);
+ element.style.display = shouldShow ? '' : 'none';
+ element.setAttribute('aria-hidden', !shouldShow);
+ });
+ }
+ });
+ }
+
+ const filterContainer = filterLinks[0].parentElement.parentElement;
+ filterContainer.addEventListener('click', e => {
+ const link = e.target.closest('a');
+ if (!link) return;
+ e.preventDefault();
+ const filterValue = link.dataset.filter;
+ if (filterValue) setActiveFilter(filterValue);
+ });
+
+ filterContainer.addEventListener('keydown', e => {
+ const link = e.target.closest('a');
+ if (!link) return;
+ if (e.key === ' ' || e.key === 'Enter') {
+ e.preventDefault();
+ link.click();
+ }
+ });
+
+ filterLinks.forEach(link => {
+ link.setAttribute('role', 'button');
+ link.setAttribute('aria-pressed', link.classList.contains('active'));
+ });
+
+ window.addEventListener('popstate', () => {
+ setActiveFilter(getFilterFromHash(), false);
+ });
+
+ const initialFilter = getFilterFromHash();
+ if (initialFilter !== 'all') {
+ setActiveFilter(initialFilter, false);
+ }
+});
diff --git a/static/js/filterCards.min.js b/static/js/filterCards.min.js
new file mode 100644
index 0000000..b150e70
--- /dev/null
+++ b/static/js/filterCards.min.js
@@ -0,0 +1 @@
+document.addEventListener("DOMContentLoaded",()=>{var t=document.querySelectorAll(".card");const l=document.querySelectorAll(".filter-controls a");var e=document.querySelector("#all-projects-filter");if(t.length&&l.length){e.style.display="block";const s=new Map(Array.from(l).map(t=>[t.dataset.filter,t])),i=Array.from(t).map(t=>({element:t,tags:t.dataset.tags?.toLowerCase().split(",").filter(Boolean)??[]}));function o(t){return t.split("/").filter(Boolean).pop()}function a(){if(!window.location.hash)return"all";const e=decodeURIComponent(window.location.hash.slice(1));return Array.from(l).find(t=>o(t.getAttribute("href"))===e)?.dataset.filter??"all"}function r(a,t=!0){t&&("all"===a?history.pushState(null,"",window.location.pathname):(t=s.get(a))&&(t=o(t.getAttribute("href")),history.pushState(null,"","#"+t)));const e="all"===a,r=e?"":"none",n=e?"false":"true";requestAnimationFrame(()=>{l.forEach(t=>{var e=t.dataset.filter===a;t.classList.toggle("active",e),t.setAttribute("aria-pressed",e)}),e?i.forEach(({element:t})=>{t.style.display=r,t.setAttribute("aria-hidden",n)}):i.forEach(({element:t,tags:e})=>{e=e.includes(a),t.style.display=e?"":"none",t.setAttribute("aria-hidden",!e)})})}(e=l[0].parentElement.parentElement).addEventListener("click",t=>{var e=t.target.closest("a");e&&(t.preventDefault(),t=e.dataset.filter)&&r(t)}),e.addEventListener("keydown",t=>{var e=t.target.closest("a");!e||" "!==t.key&&"Enter"!==t.key||(t.preventDefault(),e.click())}),l.forEach(t=>{t.setAttribute("role","button"),t.setAttribute("aria-pressed",t.classList.contains("active"))}),window.addEventListener("popstate",()=>{r(a(),!1)}),"all"!==(t=a())&&r(t,!1)}});
diff --git a/static/js/katex.min.js b/static/js/katex.min.js
index 839742f..dc9d5ed 100644
--- a/static/js/katex.min.js
+++ b/static/js/katex.min.js
@@ -1 +1 @@
-!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.katex=t():e.katex=t()}("undefined"!=typeof self?self:this,function(){"use strict";var E={d:function(e,t){for(var r in t)E.o(t,r)&&!E.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};E.d(t,{default:function(){return zr}});class L{constructor(e,t){this.name=void 0,this.position=void 0,this.length=void 0,this.rawMessage=void 0;let r,n,a="KaTeX parse error: "+e;if((o=t&&t.loc)&&o.start<=o.end){const e=o.lexer.input,t=(r=o.start,n=o.end,r===e.length?a+=" at end of input: ":a+=" at position "+(r+1)+": ",e.slice(r,n).replace(/[^]/g,"$&̲"));var o=15":">","<":"<",'"':""","'":"'"},F=/[&><"']/g;var A={contains:function(e,t){return-1!==e.indexOf(t)},deflt:function(e,t){return void 0===e?t:e},escape:function(e){return String(e).replace(F,e=>V[e])},hyphenate:function(e){return e.replace(P,"-$1").toLowerCase()},getBaseElem:D,isCharacterBox:function(e){return"mathord"===(e=D(e)).type||"textord"===e.type||"atom"===e.type},protocolFromUrl:function(e){return(e=/^[\x00-\x20]*([^\\/#?]*?)(:|*58|*3a|&colon)/i.exec(e))?":"===e[2]&&/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(e[1])?e[1].toLowerCase():null:"_relative"}};const G={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:e=>"#"+e},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:(e,t)=>(t.push(e),t)},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:e=>Math.max(0,e),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:e=>Math.max(0,e),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:e=>Math.max(0,e),cli:"-e, --max-expand ",cliProcessor:e=>"Infinity"===e?1/0:parseInt(e)},globalGroup:{type:"boolean",cli:!1}};class U{constructor(e){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{};for(const r in G){var t;G.hasOwnProperty(r)&&(t=G[r],this[r]=void 0!==e[r]?t.processor?t.processor(e[r]):e[r]:function(e){if(e.default)return e.default;if(e=e.type,"string"!=typeof(e=Array.isArray(e)?e[0]:e))return e.enum[0];switch(e){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}(t))}}reportNonstrict(e,t,r){let n=this.strict;if((n="function"==typeof n?n(e,t,r):n)&&"ignore"!==n){if(!0===n||"error"===n)throw new z("LaTeX-incompatible input and strict mode is set to 'error': "+t+" ["+e+"]",r);"warn"===n?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+n+"': "+t+" ["+e+"]")}}useStrictBehavior(e,t,r){let n=this.strict;if("function"==typeof n)try{n=n(e,t,r)}catch(e){n="error"}return!(!n||"ignore"===n||!0!==n&&"error"!==n&&("warn"===n?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+n+"': "+t+" ["+e+"]"),1))}isTrusted(e){if(e.url&&!e.protocol){const t=A.protocolFromUrl(e.url);if(null==t)return!1;e.protocol=t}const t="function"==typeof this.trust?this.trust(e):this.trust;return Boolean(t)}}class Y{constructor(e,t,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=t,this.cramped=r}sup(){return X[W[this.id]]}sub(){return X[j[this.id]]}fracNum(){return X[_[this.id]]}fracDen(){return X[$[this.id]]}cramp(){return X[Z[this.id]]}text(){return X[K[this.id]]}isTight(){return 2<=this.size}}const X=[new Y(0,0,!1),new Y(1,0,!0),new Y(2,1,!1),new Y(3,1,!0),new Y(4,2,!1),new Y(5,2,!0),new Y(6,3,!1),new Y(7,3,!0)],W=[4,5,4,5,6,7,6,7],j=[5,5,5,5,7,7,7,7],_=[2,3,4,5,6,7,6,7],$=[3,3,5,5,7,7,7,7],Z=[1,1,3,3,5,5,7,7],K=[0,1,2,3,2,3,2,3];var T={DISPLAY:X[0],TEXT:X[2],SCRIPT:X[4],SCRIPTSCRIPT:X[6]};const J=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}],Q=[];function ee(t){for(let e=0;e=Q[e]&&t<=Q[e+1])return 1}J.forEach(e=>e.blocks.forEach(e=>Q.push(...e)));const te=80,re={doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"};class ne{constructor(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return A.contains(this.classes,e)}toNode(){var t=document.createDocumentFragment();for(let e=0;ee.toText()).join("")}}var ae={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}};const oe={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},ie={"Å":"A","Ð":"D","Þ":"o","å":"a","ð":"d","þ":"o","А":"A","Б":"B","В":"B","Г":"F","Д":"A","Е":"E","Ж":"K","З":"3","И":"N","Й":"N","К":"K","Л":"N","М":"M","Н":"H","О":"O","П":"N","Р":"P","С":"C","Т":"T","У":"y","Ф":"O","Х":"X","Ц":"U","Ч":"h","Ш":"W","Щ":"W","Ъ":"B","Ы":"X","Ь":"B","Э":"3","Ю":"X","Я":"R","а":"a","б":"b","в":"a","г":"r","д":"y","е":"e","ж":"m","з":"e","и":"n","й":"n","к":"n","л":"n","м":"m","н":"n","о":"o","п":"n","р":"p","с":"c","т":"o","у":"y","ф":"b","х":"x","ц":"n","ч":"n","ш":"w","щ":"w","ъ":"a","ы":"m","ь":"a","э":"e","ю":"m","я":"r"};function se(e,t,r){if(!ae[t])throw new Error("Font metrics not found for font: "+t+".");let n=e.charCodeAt(0),a=ae[t][n];if(!a&&e[0]in ie&&(n=ie[e[0]].charCodeAt(0),a=ae[t][n]),a||"text"!==r||ee(n)&&(a=ae[t][77]),a)return{depth:a[0],height:a[1],italic:a[2],skew:a[3],width:a[4]}}function le(e,t){return t.size<2?e:me[e-1][t.size-1]}const he={},me=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],ce=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488];class pe{constructor(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||pe.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=ce[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}extend(e){var t={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(const r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);return new pe(t)}havingStyle(e){return this.style===e?this:this.extend({style:e,size:le(this.textSize,e)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(e){return this.size===e&&this.textSize===e?this:this.extend({style:this.style.text(),size:e,textSize:e,sizeMultiplier:ce[e-1]})}havingBaseStyle(e){e=e||this.style.text();var t=le(pe.BASESIZE,e);return this.size===t&&this.textSize===pe.BASESIZE&&this.style===e?this:this.extend({style:e,size:t})}havingBaseSizing(){let e;switch(this.style.id){case 4:case 5:e=3;break;case 6:case 7:e=1;break;default:e=6}return this.extend({style:this.style.text(),size:e})}withColor(e){return this.extend({color:e})}withPhantom(){return this.extend({phantom:!0})}withFont(e){return this.extend({font:e})}withTextFontFamily(e){return this.extend({fontFamily:e,font:""})}withTextFontWeight(e){return this.extend({fontWeight:e,font:""})}withTextFontShape(e){return this.extend({fontShape:e,font:""})}sizingClasses(e){return e.size!==this.size?["sizing","reset-size"+e.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==pe.BASESIZE?["sizing","reset-size"+this.size,"size"+pe.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=function(e){var t=5<=e?0:3<=e?1:2;if(!he[t]){const e=he[t]={cssEmPerMu:oe.quad[t]/18};for(const r in oe)oe.hasOwnProperty(r)&&(e[r]=oe[r][t])}return he[t]}(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}}pe.BASESIZE=6;var ue=pe;function de(e){return(e="string"!=typeof e?e.unit:e)in xe||e in we||"ex"===e}function B(e,t){let r;if(e.unit in xe)r=xe[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if("mu"===e.unit)r=t.fontMetrics().cssEmPerMu;else{var n=t.style.isTight()?t.havingStyle(t.style.text()):t;if("ex"===e.unit)r=n.fontMetrics().xHeight;else{if("em"!==e.unit)throw new z("Invalid unit: '"+e.unit+"'");r=n.fontMetrics().quad}n!==t&&(r*=n.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*r,t.maxSize)}function ge(e){return e.filter(e=>e).join(" ")}function fe(e,t,r){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},t){t.style.isTight()&&this.classes.push("mtight");const e=t.getColor();e&&(this.style.color=e)}}function be(e){var t=document.createElement(e);t.className=ge(this.classes);for(const e in this.style)this.style.hasOwnProperty(e)&&(t.style[e]=this.style[e]);for(const e in this.attributes)this.attributes.hasOwnProperty(e)&&t.setAttribute(e,this.attributes[e]);for(let e=0;e";for(let e=0;e"}const xe={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},we={ex:!0,em:!0,mu:!0},C=function(e){return+e.toFixed(4)+"em"};class ve{constructor(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,fe.call(this,e,r,n),this.children=t||[]}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return A.contains(this.classes,e)}toNode(){return be.call(this,"span")}toMarkup(){return ye.call(this,"span")}}class ke{constructor(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,fe.call(this,t,n),this.children=r||[],this.setAttribute("href",e)}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return A.contains(this.classes,e)}toNode(){return be.call(this,"a")}toMarkup(){return ye.call(this,"a")}}class Se{constructor(e,t,r){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=t,this.src=e,this.classes=["mord"],this.style=r}hasClass(e){return A.contains(this.classes,e)}toNode(){var e=document.createElement("img");e.src=this.src,e.alt=this.alt,e.className="mord";for(const t in this.style)this.style.hasOwnProperty(t)&&(e.style[t]=this.style[t]);return e}toMarkup(){let e=' "}}const Me={"î":"ı̂","ï":"ı̈","í":"ı́","ì":"ı̀"};class d{constructor(e,t,r,n,a,o,i,s){this.text=void 0,this.height=void 0,this.depth=void 0,this.italic=void 0,this.skew=void 0,this.width=void 0,this.maxFontSize=void 0,this.classes=void 0,this.style=void 0,this.text=e,this.height=t||0,this.depth=r||0,this.italic=n||0,this.skew=a||0,this.width=o||0,this.classes=i||[],this.style=s||{},this.maxFontSize=0,(e=function(t){for(let e=0;e=n[0]&&t<=n[1])return r.name}}return null}(this.text.charCodeAt(0)))&&this.classes.push(e+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=Me[this.text])}hasClass(e){return A.contains(this.classes,e)}toNode(){const e=document.createTextNode(this.text);let t=null;0")+n+"":n}}class ze{constructor(e,t){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=t||{}}toNode(){var t=document.createElementNS("http://www.w3.org/2000/svg","svg");for(const e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);for(let e=0;e";for(let e=0;e"}}class Ae{constructor(e,t){this.pathName=void 0,this.alternate=void 0,this.pathName=e,this.alternate=t}toNode(){var e=document.createElementNS("http://www.w3.org/2000/svg","path");return this.alternate?e.setAttribute("d",this.alternate):e.setAttribute("d",re[this.pathName]),e}toMarkup(){return this.alternate?' ':' '}}class Te{constructor(e){this.attributes=void 0,this.attributes=e||{}}toNode(){var e=document.createElementNS("http://www.w3.org/2000/svg","line");for(const t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);return e}toMarkup(){let e=" "}}function Be(e){if(e instanceof d)return e;throw new Error("Expected symbolNode but got "+String(e)+".")}const Ce={bin:1,close:1,inner:1,open:1,punct:1,rel:1},Ne={"accent-token":1,mathord:1,"op-token":1,spacing:1,textord:1},qe={math:{},text:{}};var h=qe;function r(e,t,r,n,a,o){qe[e][a]={font:t,group:r,replace:n},o&&n&&(qe[e][n]=qe[e][a])}var n="math",a="text",o="main",e="ams",i="accent-token",s="bin",l="close",Ie="inner",m="mathord",c="op-token",p="open",Re="punct",u="rel",He="spacing",g="textord";r(n,o,u,"≡","\\equiv",!0),r(n,o,u,"≺","\\prec",!0),r(n,o,u,"≻","\\succ",!0),r(n,o,u,"∼","\\sim",!0),r(n,o,u,"⊥","\\perp"),r(n,o,u,"⪯","\\preceq",!0),r(n,o,u,"⪰","\\succeq",!0),r(n,o,u,"≃","\\simeq",!0),r(n,o,u,"∣","\\mid",!0),r(n,o,u,"≪","\\ll",!0),r(n,o,u,"≫","\\gg",!0),r(n,o,u,"≍","\\asymp",!0),r(n,o,u,"∥","\\parallel"),r(n,o,u,"⋈","\\bowtie",!0),r(n,o,u,"⌣","\\smile",!0),r(n,o,u,"⊑","\\sqsubseteq",!0),r(n,o,u,"⊒","\\sqsupseteq",!0),r(n,o,u,"≐","\\doteq",!0),r(n,o,u,"⌢","\\frown",!0),r(n,o,u,"∋","\\ni",!0),r(n,o,u,"∝","\\propto",!0),r(n,o,u,"⊢","\\vdash",!0),r(n,o,u,"⊣","\\dashv",!0),r(n,o,u,"∋","\\owns"),r(n,o,Re,".","\\ldotp"),r(n,o,Re,"⋅","\\cdotp"),r(n,o,g,"#","\\#"),r(a,o,g,"#","\\#"),r(n,o,g,"&","\\&"),r(a,o,g,"&","\\&"),r(n,o,g,"ℵ","\\aleph",!0),r(n,o,g,"∀","\\forall",!0),r(n,o,g,"ℏ","\\hbar",!0),r(n,o,g,"∃","\\exists",!0),r(n,o,g,"∇","\\nabla",!0),r(n,o,g,"♭","\\flat",!0),r(n,o,g,"ℓ","\\ell",!0),r(n,o,g,"♮","\\natural",!0),r(n,o,g,"♣","\\clubsuit",!0),r(n,o,g,"℘","\\wp",!0),r(n,o,g,"♯","\\sharp",!0),r(n,o,g,"♢","\\diamondsuit",!0),r(n,o,g,"ℜ","\\Re",!0),r(n,o,g,"♡","\\heartsuit",!0),r(n,o,g,"ℑ","\\Im",!0),r(n,o,g,"♠","\\spadesuit",!0),r(n,o,g,"§","\\S",!0),r(a,o,g,"§","\\S"),r(n,o,g,"¶","\\P",!0),r(a,o,g,"¶","\\P"),r(n,o,g,"†","\\dag"),r(a,o,g,"†","\\dag"),r(a,o,g,"†","\\textdagger"),r(n,o,g,"‡","\\ddag"),r(a,o,g,"‡","\\ddag"),r(a,o,g,"‡","\\textdaggerdbl"),r(n,o,l,"⎱","\\rmoustache",!0),r(n,o,p,"⎰","\\lmoustache",!0),r(n,o,l,"⟯","\\rgroup",!0),r(n,o,p,"⟮","\\lgroup",!0),r(n,o,s,"∓","\\mp",!0),r(n,o,s,"⊖","\\ominus",!0),r(n,o,s,"⊎","\\uplus",!0),r(n,o,s,"⊓","\\sqcap",!0),r(n,o,s,"∗","\\ast"),r(n,o,s,"⊔","\\sqcup",!0),r(n,o,s,"◯","\\bigcirc",!0),r(n,o,s,"∙","\\bullet",!0),r(n,o,s,"‡","\\ddagger"),r(n,o,s,"≀","\\wr",!0),r(n,o,s,"⨿","\\amalg"),r(n,o,s,"&","\\And"),r(n,o,u,"⟵","\\longleftarrow",!0),r(n,o,u,"⇐","\\Leftarrow",!0),r(n,o,u,"⟸","\\Longleftarrow",!0),r(n,o,u,"⟶","\\longrightarrow",!0),r(n,o,u,"⇒","\\Rightarrow",!0),r(n,o,u,"⟹","\\Longrightarrow",!0),r(n,o,u,"↔","\\leftrightarrow",!0),r(n,o,u,"⟷","\\longleftrightarrow",!0),r(n,o,u,"⇔","\\Leftrightarrow",!0),r(n,o,u,"⟺","\\Longleftrightarrow",!0),r(n,o,u,"↦","\\mapsto",!0),r(n,o,u,"⟼","\\longmapsto",!0),r(n,o,u,"↗","\\nearrow",!0),r(n,o,u,"↩","\\hookleftarrow",!0),r(n,o,u,"↪","\\hookrightarrow",!0),r(n,o,u,"↘","\\searrow",!0),r(n,o,u,"↼","\\leftharpoonup",!0),r(n,o,u,"⇀","\\rightharpoonup",!0),r(n,o,u,"↙","\\swarrow",!0),r(n,o,u,"↽","\\leftharpoondown",!0),r(n,o,u,"⇁","\\rightharpoondown",!0),r(n,o,u,"↖","\\nwarrow",!0),r(n,o,u,"⇌","\\rightleftharpoons",!0),r(n,e,u,"≮","\\nless",!0),r(n,e,u,"","\\@nleqslant"),r(n,e,u,"","\\@nleqq"),r(n,e,u,"⪇","\\lneq",!0),r(n,e,u,"≨","\\lneqq",!0),r(n,e,u,"","\\@lvertneqq"),r(n,e,u,"⋦","\\lnsim",!0),r(n,e,u,"⪉","\\lnapprox",!0),r(n,e,u,"⊀","\\nprec",!0),r(n,e,u,"⋠","\\npreceq",!0),r(n,e,u,"⋨","\\precnsim",!0),r(n,e,u,"⪹","\\precnapprox",!0),r(n,e,u,"≁","\\nsim",!0),r(n,e,u,"","\\@nshortmid"),r(n,e,u,"∤","\\nmid",!0),r(n,e,u,"⊬","\\nvdash",!0),r(n,e,u,"⊭","\\nvDash",!0),r(n,e,u,"⋪","\\ntriangleleft"),r(n,e,u,"⋬","\\ntrianglelefteq",!0),r(n,e,u,"⊊","\\subsetneq",!0),r(n,e,u,"","\\@varsubsetneq"),r(n,e,u,"⫋","\\subsetneqq",!0),r(n,e,u,"","\\@varsubsetneqq"),r(n,e,u,"≯","\\ngtr",!0),r(n,e,u,"","\\@ngeqslant"),r(n,e,u,"","\\@ngeqq"),r(n,e,u,"⪈","\\gneq",!0),r(n,e,u,"≩","\\gneqq",!0),r(n,e,u,"","\\@gvertneqq"),r(n,e,u,"⋧","\\gnsim",!0),r(n,e,u,"⪊","\\gnapprox",!0),r(n,e,u,"⊁","\\nsucc",!0),r(n,e,u,"⋡","\\nsucceq",!0),r(n,e,u,"⋩","\\succnsim",!0),r(n,e,u,"⪺","\\succnapprox",!0),r(n,e,u,"≆","\\ncong",!0),r(n,e,u,"","\\@nshortparallel"),r(n,e,u,"∦","\\nparallel",!0),r(n,e,u,"⊯","\\nVDash",!0),r(n,e,u,"⋫","\\ntriangleright"),r(n,e,u,"⋭","\\ntrianglerighteq",!0),r(n,e,u,"","\\@nsupseteqq"),r(n,e,u,"⊋","\\supsetneq",!0),r(n,e,u,"","\\@varsupsetneq"),r(n,e,u,"⫌","\\supsetneqq",!0),r(n,e,u,"","\\@varsupsetneqq"),r(n,e,u,"⊮","\\nVdash",!0),r(n,e,u,"⪵","\\precneqq",!0),r(n,e,u,"⪶","\\succneqq",!0),r(n,e,u,"","\\@nsubseteqq"),r(n,e,s,"⊴","\\unlhd"),r(n,e,s,"⊵","\\unrhd"),r(n,e,u,"↚","\\nleftarrow",!0),r(n,e,u,"↛","\\nrightarrow",!0),r(n,e,u,"⇍","\\nLeftarrow",!0),r(n,e,u,"⇏","\\nRightarrow",!0),r(n,e,u,"↮","\\nleftrightarrow",!0),r(n,e,u,"⇎","\\nLeftrightarrow",!0),r(n,e,u,"△","\\vartriangle"),r(n,e,g,"ℏ","\\hslash"),r(n,e,g,"▽","\\triangledown"),r(n,e,g,"◊","\\lozenge"),r(n,e,g,"Ⓢ","\\circledS"),r(n,e,g,"®","\\circledR"),r(a,e,g,"®","\\circledR"),r(n,e,g,"∡","\\measuredangle",!0),r(n,e,g,"∄","\\nexists"),r(n,e,g,"℧","\\mho"),r(n,e,g,"Ⅎ","\\Finv",!0),r(n,e,g,"⅁","\\Game",!0),r(n,e,g,"‵","\\backprime"),r(n,e,g,"▲","\\blacktriangle"),r(n,e,g,"▼","\\blacktriangledown"),r(n,e,g,"■","\\blacksquare"),r(n,e,g,"⧫","\\blacklozenge"),r(n,e,g,"★","\\bigstar"),r(n,e,g,"∢","\\sphericalangle",!0),r(n,e,g,"∁","\\complement",!0),r(n,e,g,"ð","\\eth",!0),r(a,o,g,"ð","ð"),r(n,e,g,"╱","\\diagup"),r(n,e,g,"╲","\\diagdown"),r(n,e,g,"□","\\square"),r(n,e,g,"□","\\Box"),r(n,e,g,"◊","\\Diamond"),r(n,e,g,"¥","\\yen",!0),r(a,e,g,"¥","\\yen",!0),r(n,e,g,"✓","\\checkmark",!0),r(a,e,g,"✓","\\checkmark"),r(n,e,g,"ℶ","\\beth",!0),r(n,e,g,"ℸ","\\daleth",!0),r(n,e,g,"ℷ","\\gimel",!0),r(n,e,g,"ϝ","\\digamma",!0),r(n,e,g,"ϰ","\\varkappa"),r(n,e,p,"┌","\\@ulcorner",!0),r(n,e,l,"┐","\\@urcorner",!0),r(n,e,p,"└","\\@llcorner",!0),r(n,e,l,"┘","\\@lrcorner",!0),r(n,e,u,"≦","\\leqq",!0),r(n,e,u,"⩽","\\leqslant",!0),r(n,e,u,"⪕","\\eqslantless",!0),r(n,e,u,"≲","\\lesssim",!0),r(n,e,u,"⪅","\\lessapprox",!0),r(n,e,u,"≊","\\approxeq",!0),r(n,e,s,"⋖","\\lessdot"),r(n,e,u,"⋘","\\lll",!0),r(n,e,u,"≶","\\lessgtr",!0),r(n,e,u,"⋚","\\lesseqgtr",!0),r(n,e,u,"⪋","\\lesseqqgtr",!0),r(n,e,u,"≑","\\doteqdot"),r(n,e,u,"≓","\\risingdotseq",!0),r(n,e,u,"≒","\\fallingdotseq",!0),r(n,e,u,"∽","\\backsim",!0),r(n,e,u,"⋍","\\backsimeq",!0),r(n,e,u,"⫅","\\subseteqq",!0),r(n,e,u,"⋐","\\Subset",!0),r(n,e,u,"⊏","\\sqsubset",!0),r(n,e,u,"≼","\\preccurlyeq",!0),r(n,e,u,"⋞","\\curlyeqprec",!0),r(n,e,u,"≾","\\precsim",!0),r(n,e,u,"⪷","\\precapprox",!0),r(n,e,u,"⊲","\\vartriangleleft"),r(n,e,u,"⊴","\\trianglelefteq"),r(n,e,u,"⊨","\\vDash",!0),r(n,e,u,"⊪","\\Vvdash",!0),r(n,e,u,"⌣","\\smallsmile"),r(n,e,u,"⌢","\\smallfrown"),r(n,e,u,"≏","\\bumpeq",!0),r(n,e,u,"≎","\\Bumpeq",!0),r(n,e,u,"≧","\\geqq",!0),r(n,e,u,"⩾","\\geqslant",!0),r(n,e,u,"⪖","\\eqslantgtr",!0),r(n,e,u,"≳","\\gtrsim",!0),r(n,e,u,"⪆","\\gtrapprox",!0),r(n,e,s,"⋗","\\gtrdot"),r(n,e,u,"⋙","\\ggg",!0),r(n,e,u,"≷","\\gtrless",!0),r(n,e,u,"⋛","\\gtreqless",!0),r(n,e,u,"⪌","\\gtreqqless",!0),r(n,e,u,"≖","\\eqcirc",!0),r(n,e,u,"≗","\\circeq",!0),r(n,e,u,"≜","\\triangleq",!0),r(n,e,u,"∼","\\thicksim"),r(n,e,u,"≈","\\thickapprox"),r(n,e,u,"⫆","\\supseteqq",!0),r(n,e,u,"⋑","\\Supset",!0),r(n,e,u,"⊐","\\sqsupset",!0),r(n,e,u,"≽","\\succcurlyeq",!0),r(n,e,u,"⋟","\\curlyeqsucc",!0),r(n,e,u,"≿","\\succsim",!0),r(n,e,u,"⪸","\\succapprox",!0),r(n,e,u,"⊳","\\vartriangleright"),r(n,e,u,"⊵","\\trianglerighteq"),r(n,e,u,"⊩","\\Vdash",!0),r(n,e,u,"∣","\\shortmid"),r(n,e,u,"∥","\\shortparallel"),r(n,e,u,"≬","\\between",!0),r(n,e,u,"⋔","\\pitchfork",!0),r(n,e,u,"∝","\\varpropto"),r(n,e,u,"◀","\\blacktriangleleft"),r(n,e,u,"∴","\\therefore",!0),r(n,e,u,"∍","\\backepsilon"),r(n,e,u,"▶","\\blacktriangleright"),r(n,e,u,"∵","\\because",!0),r(n,e,u,"⋘","\\llless"),r(n,e,u,"⋙","\\gggtr"),r(n,e,s,"⊲","\\lhd"),r(n,e,s,"⊳","\\rhd"),r(n,e,u,"≂","\\eqsim",!0),r(n,o,u,"⋈","\\Join"),r(n,e,u,"≑","\\Doteq",!0),r(n,e,s,"∔","\\dotplus",!0),r(n,e,s,"∖","\\smallsetminus"),r(n,e,s,"⋒","\\Cap",!0),r(n,e,s,"⋓","\\Cup",!0),r(n,e,s,"⩞","\\doublebarwedge",!0),r(n,e,s,"⊟","\\boxminus",!0),r(n,e,s,"⊞","\\boxplus",!0),r(n,e,s,"⋇","\\divideontimes",!0),r(n,e,s,"⋉","\\ltimes",!0),r(n,e,s,"⋊","\\rtimes",!0),r(n,e,s,"⋋","\\leftthreetimes",!0),r(n,e,s,"⋌","\\rightthreetimes",!0),r(n,e,s,"⋏","\\curlywedge",!0),r(n,e,s,"⋎","\\curlyvee",!0),r(n,e,s,"⊝","\\circleddash",!0),r(n,e,s,"⊛","\\circledast",!0),r(n,e,s,"⋅","\\centerdot"),r(n,e,s,"⊺","\\intercal",!0),r(n,e,s,"⋒","\\doublecap"),r(n,e,s,"⋓","\\doublecup"),r(n,e,s,"⊠","\\boxtimes",!0),r(n,e,u,"⇢","\\dashrightarrow",!0),r(n,e,u,"⇠","\\dashleftarrow",!0),r(n,e,u,"⇇","\\leftleftarrows",!0),r(n,e,u,"⇆","\\leftrightarrows",!0),r(n,e,u,"⇚","\\Lleftarrow",!0),r(n,e,u,"↞","\\twoheadleftarrow",!0),r(n,e,u,"↢","\\leftarrowtail",!0),r(n,e,u,"↫","\\looparrowleft",!0),r(n,e,u,"⇋","\\leftrightharpoons",!0),r(n,e,u,"↶","\\curvearrowleft",!0),r(n,e,u,"↺","\\circlearrowleft",!0),r(n,e,u,"↰","\\Lsh",!0),r(n,e,u,"⇈","\\upuparrows",!0),r(n,e,u,"↿","\\upharpoonleft",!0),r(n,e,u,"⇃","\\downharpoonleft",!0),r(n,o,u,"⊶","\\origof",!0),r(n,o,u,"⊷","\\imageof",!0),r(n,e,u,"⊸","\\multimap",!0),r(n,e,u,"↭","\\leftrightsquigarrow",!0),r(n,e,u,"⇉","\\rightrightarrows",!0),r(n,e,u,"⇄","\\rightleftarrows",!0),r(n,e,u,"↠","\\twoheadrightarrow",!0),r(n,e,u,"↣","\\rightarrowtail",!0),r(n,e,u,"↬","\\looparrowright",!0),r(n,e,u,"↷","\\curvearrowright",!0),r(n,e,u,"↻","\\circlearrowright",!0),r(n,e,u,"↱","\\Rsh",!0),r(n,e,u,"⇊","\\downdownarrows",!0),r(n,e,u,"↾","\\upharpoonright",!0),r(n,e,u,"⇂","\\downharpoonright",!0),r(n,e,u,"⇝","\\rightsquigarrow",!0),r(n,e,u,"⇝","\\leadsto"),r(n,e,u,"⇛","\\Rrightarrow",!0),r(n,e,u,"↾","\\restriction"),r(n,o,g,"‘","`"),r(n,o,g,"$","\\$"),r(a,o,g,"$","\\$"),r(a,o,g,"$","\\textdollar"),r(n,o,g,"%","\\%"),r(a,o,g,"%","\\%"),r(n,o,g,"_","\\_"),r(a,o,g,"_","\\_"),r(a,o,g,"_","\\textunderscore"),r(n,o,g,"∠","\\angle",!0),r(n,o,g,"∞","\\infty",!0),r(n,o,g,"′","\\prime"),r(n,o,g,"△","\\triangle"),r(n,o,g,"Γ","\\Gamma",!0),r(n,o,g,"Δ","\\Delta",!0),r(n,o,g,"Θ","\\Theta",!0),r(n,o,g,"Λ","\\Lambda",!0),r(n,o,g,"Ξ","\\Xi",!0),r(n,o,g,"Π","\\Pi",!0),r(n,o,g,"Σ","\\Sigma",!0),r(n,o,g,"Υ","\\Upsilon",!0),r(n,o,g,"Φ","\\Phi",!0),r(n,o,g,"Ψ","\\Psi",!0),r(n,o,g,"Ω","\\Omega",!0),r(n,o,g,"A","Α"),r(n,o,g,"B","Β"),r(n,o,g,"E","Ε"),r(n,o,g,"Z","Ζ"),r(n,o,g,"H","Η"),r(n,o,g,"I","Ι"),r(n,o,g,"K","Κ"),r(n,o,g,"M","Μ"),r(n,o,g,"N","Ν"),r(n,o,g,"O","Ο"),r(n,o,g,"P","Ρ"),r(n,o,g,"T","Τ"),r(n,o,g,"X","Χ"),r(n,o,g,"¬","\\neg",!0),r(n,o,g,"¬","\\lnot"),r(n,o,g,"⊤","\\top"),r(n,o,g,"⊥","\\bot"),r(n,o,g,"∅","\\emptyset"),r(n,e,g,"∅","\\varnothing"),r(n,o,m,"α","\\alpha",!0),r(n,o,m,"β","\\beta",!0),r(n,o,m,"γ","\\gamma",!0),r(n,o,m,"δ","\\delta",!0),r(n,o,m,"ϵ","\\epsilon",!0),r(n,o,m,"ζ","\\zeta",!0),r(n,o,m,"η","\\eta",!0),r(n,o,m,"θ","\\theta",!0),r(n,o,m,"ι","\\iota",!0),r(n,o,m,"κ","\\kappa",!0),r(n,o,m,"λ","\\lambda",!0),r(n,o,m,"μ","\\mu",!0),r(n,o,m,"ν","\\nu",!0),r(n,o,m,"ξ","\\xi",!0),r(n,o,m,"ο","\\omicron",!0),r(n,o,m,"π","\\pi",!0),r(n,o,m,"ρ","\\rho",!0),r(n,o,m,"σ","\\sigma",!0),r(n,o,m,"τ","\\tau",!0),r(n,o,m,"υ","\\upsilon",!0),r(n,o,m,"ϕ","\\phi",!0),r(n,o,m,"χ","\\chi",!0),r(n,o,m,"ψ","\\psi",!0),r(n,o,m,"ω","\\omega",!0),r(n,o,m,"ε","\\varepsilon",!0),r(n,o,m,"ϑ","\\vartheta",!0),r(n,o,m,"ϖ","\\varpi",!0),r(n,o,m,"ϱ","\\varrho",!0),r(n,o,m,"ς","\\varsigma",!0),r(n,o,m,"φ","\\varphi",!0),r(n,o,s,"∗","*",!0),r(n,o,s,"+","+"),r(n,o,s,"−","-",!0),r(n,o,s,"⋅","\\cdot",!0),r(n,o,s,"∘","\\circ",!0),r(n,o,s,"÷","\\div",!0),r(n,o,s,"±","\\pm",!0),r(n,o,s,"×","\\times",!0),r(n,o,s,"∩","\\cap",!0),r(n,o,s,"∪","\\cup",!0),r(n,o,s,"∖","\\setminus",!0),r(n,o,s,"∧","\\land"),r(n,o,s,"∨","\\lor"),r(n,o,s,"∧","\\wedge",!0),r(n,o,s,"∨","\\vee",!0),r(n,o,g,"√","\\surd"),r(n,o,p,"⟨","\\langle",!0),r(n,o,p,"∣","\\lvert"),r(n,o,p,"∥","\\lVert"),r(n,o,l,"?","?"),r(n,o,l,"!","!"),r(n,o,l,"⟩","\\rangle",!0),r(n,o,l,"∣","\\rvert"),r(n,o,l,"∥","\\rVert"),r(n,o,u,"=","="),r(n,o,u,":",":"),r(n,o,u,"≈","\\approx",!0),r(n,o,u,"≅","\\cong",!0),r(n,o,u,"≥","\\ge"),r(n,o,u,"≥","\\geq",!0),r(n,o,u,"←","\\gets"),r(n,o,u,">","\\gt",!0),r(n,o,u,"∈","\\in",!0),r(n,o,u,"","\\@not"),r(n,o,u,"⊂","\\subset",!0),r(n,o,u,"⊃","\\supset",!0),r(n,o,u,"⊆","\\subseteq",!0),r(n,o,u,"⊇","\\supseteq",!0),r(n,e,u,"⊈","\\nsubseteq",!0),r(n,e,u,"⊉","\\nsupseteq",!0),r(n,o,u,"⊨","\\models"),r(n,o,u,"←","\\leftarrow",!0),r(n,o,u,"≤","\\le"),r(n,o,u,"≤","\\leq",!0),r(n,o,u,"<","\\lt",!0),r(n,o,u,"→","\\rightarrow",!0),r(n,o,u,"→","\\to"),r(n,e,u,"≱","\\ngeq",!0),r(n,e,u,"≰","\\nleq",!0),r(n,o,He," ","\\ "),r(n,o,He," ","\\space"),r(n,o,He," ","\\nobreakspace"),r(a,o,He," ","\\ "),r(a,o,He," "," "),r(a,o,He," ","\\space"),r(a,o,He," ","\\nobreakspace"),r(n,o,He,null,"\\nobreak"),r(n,o,He,null,"\\allowbreak"),r(n,o,Re,",",","),r(n,o,Re,";",";"),r(n,e,s,"⊼","\\barwedge",!0),r(n,e,s,"⊻","\\veebar",!0),r(n,o,s,"⊙","\\odot",!0),r(n,o,s,"⊕","\\oplus",!0),r(n,o,s,"⊗","\\otimes",!0),r(n,o,g,"∂","\\partial",!0),r(n,o,s,"⊘","\\oslash",!0),r(n,e,s,"⊚","\\circledcirc",!0),r(n,e,s,"⊡","\\boxdot",!0),r(n,o,s,"△","\\bigtriangleup"),r(n,o,s,"▽","\\bigtriangledown"),r(n,o,s,"†","\\dagger"),r(n,o,s,"⋄","\\diamond"),r(n,o,s,"⋆","\\star"),r(n,o,s,"◃","\\triangleleft"),r(n,o,s,"▹","\\triangleright"),r(n,o,p,"{","\\{"),r(a,o,g,"{","\\{"),r(a,o,g,"{","\\textbraceleft"),r(n,o,l,"}","\\}"),r(a,o,g,"}","\\}"),r(a,o,g,"}","\\textbraceright"),r(n,o,p,"{","\\lbrace"),r(n,o,l,"}","\\rbrace"),r(n,o,p,"[","\\lbrack",!0),r(a,o,g,"[","\\lbrack",!0),r(n,o,l,"]","\\rbrack",!0),r(a,o,g,"]","\\rbrack",!0),r(n,o,p,"(","\\lparen",!0),r(n,o,l,")","\\rparen",!0),r(a,o,g,"<","\\textless",!0),r(a,o,g,">","\\textgreater",!0),r(n,o,p,"⌊","\\lfloor",!0),r(n,o,l,"⌋","\\rfloor",!0),r(n,o,p,"⌈","\\lceil",!0),r(n,o,l,"⌉","\\rceil",!0),r(n,o,g,"\\","\\backslash"),r(n,o,g,"∣","|"),r(n,o,g,"∣","\\vert"),r(a,o,g,"|","\\textbar",!0),r(n,o,g,"∥","\\|"),r(n,o,g,"∥","\\Vert"),r(a,o,g,"∥","\\textbardbl"),r(a,o,g,"~","\\textasciitilde"),r(a,o,g,"\\","\\textbackslash"),r(a,o,g,"^","\\textasciicircum"),r(n,o,u,"↑","\\uparrow",!0),r(n,o,u,"⇑","\\Uparrow",!0),r(n,o,u,"↓","\\downarrow",!0),r(n,o,u,"⇓","\\Downarrow",!0),r(n,o,u,"↕","\\updownarrow",!0),r(n,o,u,"⇕","\\Updownarrow",!0),r(n,o,c,"∐","\\coprod"),r(n,o,c,"⋁","\\bigvee"),r(n,o,c,"⋀","\\bigwedge"),r(n,o,c,"⨄","\\biguplus"),r(n,o,c,"⋂","\\bigcap"),r(n,o,c,"⋃","\\bigcup"),r(n,o,c,"∫","\\int"),r(n,o,c,"∫","\\intop"),r(n,o,c,"∬","\\iint"),r(n,o,c,"∭","\\iiint"),r(n,o,c,"∏","\\prod"),r(n,o,c,"∑","\\sum"),r(n,o,c,"⨂","\\bigotimes"),r(n,o,c,"⨁","\\bigoplus"),r(n,o,c,"⨀","\\bigodot"),r(n,o,c,"∮","\\oint"),r(n,o,c,"∯","\\oiint"),r(n,o,c,"∰","\\oiiint"),r(n,o,c,"⨆","\\bigsqcup"),r(n,o,c,"∫","\\smallint"),r(a,o,Ie,"…","\\textellipsis"),r(n,o,Ie,"…","\\mathellipsis"),r(a,o,Ie,"…","\\ldots",!0),r(n,o,Ie,"…","\\ldots",!0),r(n,o,Ie,"⋯","\\@cdots",!0),r(n,o,Ie,"⋱","\\ddots",!0),r(n,o,g,"⋮","\\varvdots"),r(n,o,i,"ˊ","\\acute"),r(n,o,i,"ˋ","\\grave"),r(n,o,i,"¨","\\ddot"),r(n,o,i,"~","\\tilde"),r(n,o,i,"ˉ","\\bar"),r(n,o,i,"˘","\\breve"),r(n,o,i,"ˇ","\\check"),r(n,o,i,"^","\\hat"),r(n,o,i,"⃗","\\vec"),r(n,o,i,"˙","\\dot"),r(n,o,i,"˚","\\mathring"),r(n,o,m,"","\\@imath"),r(n,o,m,"","\\@jmath"),r(n,o,g,"ı","ı"),r(n,o,g,"ȷ","ȷ"),r(a,o,g,"ı","\\i",!0),r(a,o,g,"ȷ","\\j",!0),r(a,o,g,"ß","\\ss",!0),r(a,o,g,"æ","\\ae",!0),r(a,o,g,"œ","\\oe",!0),r(a,o,g,"ø","\\o",!0),r(a,o,g,"Æ","\\AE",!0),r(a,o,g,"Œ","\\OE",!0),r(a,o,g,"Ø","\\O",!0),r(a,o,i,"ˊ","\\'"),r(a,o,i,"ˋ","\\`"),r(a,o,i,"ˆ","\\^"),r(a,o,i,"˜","\\~"),r(a,o,i,"ˉ","\\="),r(a,o,i,"˘","\\u"),r(a,o,i,"˙","\\."),r(a,o,i,"¸","\\c"),r(a,o,i,"˚","\\r"),r(a,o,i,"ˇ","\\v"),r(a,o,i,"¨",'\\"'),r(a,o,i,"˝","\\H"),r(a,o,i,"◯","\\textcircled");const Oe={"--":!0,"---":!0,"``":!0,"''":!0};r(a,o,g,"–","--",!0),r(a,o,g,"–","\\textendash"),r(a,o,g,"—","---",!0),r(a,o,g,"—","\\textemdash"),r(a,o,g,"‘","`",!0),r(a,o,g,"‘","\\textquoteleft"),r(a,o,g,"’","'",!0),r(a,o,g,"’","\\textquoteright"),r(a,o,g,"“","``",!0),r(a,o,g,"“","\\textquotedblleft"),r(a,o,g,"”","''",!0),r(a,o,g,"”","\\textquotedblright"),r(n,o,g,"°","\\degree",!0),r(a,o,g,"°","\\degree"),r(a,o,g,"°","\\textdegree",!0),r(n,o,g,"£","\\pounds"),r(n,o,g,"£","\\mathsterling",!0),r(a,o,g,"£","\\pounds"),r(a,o,g,"£","\\textsterling",!0),r(n,e,g,"✠","\\maltese"),r(a,e,g,"✠","\\maltese");var Ee='0123456789/@."';for(let e=0;er&&(r=o.height),o.depth>n&&(n=o.depth),o.maxFontSize>a&&(a=o.maxFontSize)}t.height=r,t.depth=n,t.maxFontSize=a}function b(e,t,r,n){return Fe(e=new ve(e,t,r,n)),e}function Ge(e){return Fe(e=new ne(e)),e}function Ue(e,t,r){let n="";switch(e){case"amsrm":n="AMS";break;case"textrm":n="Main";break;case"textsf":n="SansSerif";break;case"texttt":n="Typewriter";break;default:n=e}return n+"-"+("textbf"===t&&"textit"===r?"BoldItalic":"textbf"===t?"Bold":"textit"===t?"Italic":"Regular")}const Ye=[["mathbf","textbf","Main-Bold"],["mathbf","textbf","Main-Bold"],["mathnormal","textit","Math-Italic"],["mathnormal","textit","Math-Italic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["mathscr","textscr","Script-Regular"],["","",""],["","",""],["","",""],["mathfrak","textfrak","Fraktur-Regular"],["mathfrak","textfrak","Fraktur-Regular"],["mathbb","textbb","AMS-Regular"],["mathbb","textbb","AMS-Regular"],["mathboldfrak","textboldfrak","Fraktur-Regular"],["mathboldfrak","textboldfrak","Fraktur-Regular"],["mathsf","textsf","SansSerif-Regular"],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathitsf","textitsf","SansSerif-Italic"],["mathitsf","textitsf","SansSerif-Italic"],["","",""],["","",""],["mathtt","texttt","Typewriter-Regular"],["mathtt","texttt","Typewriter-Regular"]],Xe=[["mathbf","textbf","Main-Bold"],["","",""],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathtt","texttt","Typewriter-Regular"]],We=(e,t,r,n)=>new ve(e,t,r,n),je={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},_e={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]};var N={fontMap:je,makeSymbol:Ve,mathsym:function(e,t,r,n){return void 0===n&&(n=[]),"boldsymbol"===r.font&&Pe(e,"Main-Bold",t).metrics?Ve(e,"Main-Bold",t,r,n.concat(["mathbf"])):"\\"===e||"main"===h[t][e].font?Ve(e,"Main-Regular",t,r,n):Ve(e,"AMS-Regular",t,r,n.concat(["amsrm"]))},makeSpan:b,makeSvgSpan:We,makeLineSpan:function(e,t,r){return(e=b([e],[],t)).height=Math.max(r||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),e.style.borderBottomWidth=C(e.height),e.maxFontSize=1,e},makeAnchor:function(e,t,r,n){return Fe(e=new ke(e,t,r,n)),e},makeFragment:Ge,wrapFragment:function(e,t){return e instanceof ne?b([],[e],t):e},makeVList:function(t,r){const{children:n,depth:a}=function(r){if("individualShift"===r.positionType){const o=r.children,s=[o[0]],l=-o[0].shift-o[0].elem.depth;let t=l;for(let e=1;e{var r=b(["mspace"],[],t),e=B(e,t);return r.style.marginRight=C(e),r},staticSvg:function(e,t){var[e,r,n]=_e[e],e=new Ae(e),e=new ze([e],{width:C(r),height:C(n),style:"width:"+C(r),viewBox:"0 0 "+1e3*r+" "+1e3*n,preserveAspectRatio:"xMinYMin"});return(e=We(["overlay"],[e],t)).height=n,e.style.height=C(n),e.style.width=C(r),e},svgData:_e,tryCombineChars:t=>{for(let e=0;e{if(ge(e.classes)!==ge(t.classes)||e.skew!==t.skew||e.maxFontSize!==t.maxFontSize)return!1;if(1===e.classes.length){const t=e.classes[0];if("mbin"===t||"mord"===t)return!1}for(const r in e.style)if(e.style.hasOwnProperty(r)&&e.style[r]!==t.style[r])return!1;for(const n in t.style)if(t.style.hasOwnProperty(n)&&e.style[n]!==t.style[n])return!1;return!0})(r,n)&&(r.text+=n.text,r.height=Math.max(r.height,n.height),r.depth=Math.max(r.depth,n.depth),r.italic=n.italic,t.splice(e+1,1),e--)}return t}};const y={number:3,unit:"mu"},$e={number:4,unit:"mu"},Ze={number:5,unit:"mu"},Ke={mord:{mop:y,mbin:$e,mrel:Ze,minner:y},mop:{mord:y,mop:y,mrel:Ze,minner:y},mbin:{mord:$e,mop:$e,mopen:$e,minner:$e},mrel:{mord:Ze,mop:Ze,mopen:Ze,minner:Ze},mopen:{},mclose:{mop:y,mbin:$e,mrel:Ze,minner:y},mpunct:{mord:y,mop:y,mrel:Ze,mopen:y,mclose:y,mpunct:y,minner:y},minner:{mord:y,mop:y,mbin:$e,mrel:Ze,mopen:y,mpunct:y,minner:y}},Je={mord:{mop:y},mop:{mord:y,mop:y},mbin:{},mrel:{},mopen:{},mclose:{mop:y},mpunct:{},minner:{mop:y}},Qe={},et={},tt={};function x(e){var{type:e,names:t,props:r,handler:n,htmlBuilder:a,mathmlBuilder:o}=e,i={type:e,numArgs:r.numArgs,argTypes:r.argTypes,allowedInArgument:!!r.allowedInArgument,allowedInText:!!r.allowedInText,allowedInMath:void 0===r.allowedInMath||r.allowedInMath,numOptionalArgs:r.numOptionalArgs||0,infix:!!r.infix,primitive:!!r.primitive,handler:n};for(let e=0;e{var r=t.classes[0],n=e.classes[0];"mbin"===r&&A.contains(st,n)?t.classes[0]="mord":"mbin"===n&&A.contains(it,r)&&(e.classes[0]="mord")},{node:i},a,e),mt(o,(e,t)=>{var t=ut(t),r=ut(e);if(e=t&&r?(e.hasClass("mtight")?Je:Ke)[t][r]:null)return N.makeGlue(e,n)},{node:i},a,e)}return o}function at(e,t){return e=["nulldelimiter"].concat(e.baseSizingClasses()),ot(t.concat(e))}const ot=N.makeSpan,it=["leftmost","mbin","mopen","mrel","mop","mpunct"],st=["rightmost","mrel","mclose","mpunct"],lt={display:T.DISPLAY,text:T.TEXT,script:T.SCRIPT,scriptscript:T.SCRIPTSCRIPT},ht={mord:"mord",mop:"mop",mbin:"mbin",mrel:"mrel",mopen:"mopen",mclose:"mclose",mpunct:"mpunct",minner:"minner"},mt=function(r,e,t,n,a){n&&r.push(n);let o=0;for(;oe=>{r.splice(t+1,0,e),o++})(o)}}n&&r.pop()},ct=function(e){return e instanceof ne||e instanceof ke||e instanceof ve&&e.hasClass("enclosing")?e:null},pt=function(e,t){var r=ct(e);if(r){const e=r.children;if(e.length){if("right"===t)return pt(e[e.length-1],"right");if("left"===t)return pt(e[0],"left")}}return e},ut=function(e,t){return e&&(t&&(e=pt(e,t)),ht[e.classes[0]])||null},I=function(t,r,n){if(!t)return ot();if(et[t.type]){let e=et[t.type](t,r);if(n&&r.size!==n.size){e=ot(r.sizingClasses(n),[e],r);const t=r.sizeMultiplier/n.sizeMultiplier;e.height*=t,e.depth*=t}return e}throw new z("Got group of unknown type: '"+t.type+"'")};function dt(e,t){return e=ot(["base"],e,t),(t=ot(["strut"])).style.height=C(e.height+e.depth),e.depth&&(t.style.verticalAlign=C(-e.depth)),e.children.unshift(t),e}function gt(e,r){let t=null;1===e.length&&"tag"===e[0].type&&(t=e[0].tag,e=e[0].body);var n=q(e,r,"root");let a;2===n.length&&n[1].hasClass("tag")&&(a=n.pop());var o=[];let i,s=[];for(let t=0;t";for(let e=0;e"}toText(){return this.children.map(e=>e.toText()).join("")}}class bt{constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return A.escape(this.toText())}toText(){return this.text}}var k={MathNode:v,TextNode:bt,SpaceNode:class{constructor(e){this.width=void 0,this.character=void 0,this.width=e,this.character=.05555<=e&&e<=.05556?" ":.1666<=e&&e<=.1667?" ":.2222<=e&&e<=.2223?" ":.2777<=e&&e<=.2778?" ":-.05556<=e&&e<=-.05555?" ":-.1667<=e&&e<=-.1666?" ":-.2223<=e&&e<=-.2222?" ":-.2778<=e&&e<=-.2777?" ":null}toNode(){var e;return this.character?document.createTextNode(this.character):((e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace")).setAttribute("width",C(this.width)),e)}toMarkup(){return this.character?""+this.character+" ":' '}toText(){return this.character||" "}},newDocumentFragment:ft};function S(e,t,r){return!h[t][e]||!h[t][e].replace||55349===e.charCodeAt(0)||Oe.hasOwnProperty(e)&&r&&(r.fontFamily&&"tt"===r.fontFamily.slice(4,6)||r.font&&"tt"===r.font.slice(4,6))||(e=h[t][e].replace),new k.TextNode(e)}function yt(e){return 1===e.length?e[0]:new k.MathNode("mrow",e)}function xt(e,t){var r;return"texttt"===t.fontFamily?"monospace":"textsf"===t.fontFamily?"textit"===t.fontShape&&"textbf"===t.fontWeight?"sans-serif-bold-italic":"textit"===t.fontShape?"sans-serif-italic":"textbf"===t.fontWeight?"bold-sans-serif":"sans-serif":"textit"===t.fontShape&&"textbf"===t.fontWeight?"bold-italic":"textit"===t.fontShape?"italic":"textbf"===t.fontWeight?"bold":(t=t.font)&&"mathnormal"!==t?(r=e.mode,"mathit"===t?"italic":"boldsymbol"===t?"textord"===e.type?"bold":"bold-italic":"mathbf"===t?"bold":"mathbb"===t?"double-struck":"mathfrak"===t?"fraktur":"mathscr"===t||"mathcal"===t?"script":"mathsf"===t?"sans-serif":"mathtt"===t?"monospace":(e=e.text,!A.contains(["\\imath","\\jmath"],e)&&se(e=h[r][e]&&h[r][e].replace?h[r][e].replace:e,N.fontMap[t].fontName,r)?N.fontMap[t].variant:null)):null}function M(t,r,e){if(1===t.length){const n=R(t[0],r);return e&&n instanceof v&&"mo"===n.type&&(n.setAttribute("lspace","0em"),n.setAttribute("rspace","0em")),[n]}const n=[];let a;for(let e=0;e{let e,o,i,s=(n&&"supsub"===n.type?(o=H(n.base,"accent"),e=o.base,n.base=e,i=function(e){if(e instanceof ve)return e;throw new Error("Expected span but got "+String(e)+".")}(I(n,a)),n.base=o):(o=H(n,"accent"),e=o.base),n=I(e,a.havingCrampedStyle()),0);if(o.isShifty&&A.isCharacterBox(e)){const n=A.getBaseElem(e);s=Be(I(n,a.havingCrampedStyle())).skew}var l="\\c"===o.label;let h,m=l?n.height+n.depth:Math.min(n.height,a.fontMetrics().xHeight);if(o.isStretchy)h=Tt(o,a),h=N.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:n},{type:"elem",elem:h,wrapperClasses:["svg-align"],wrapperStyle:0{var r=e.isStretchy?At(e.label):new k.MathNode("mo",[S(e.label,e.mode)]);return(e=new k.MathNode("mover",[R(e.base,t),r])).setAttribute("accent","true"),e},It=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(e=>"\\"+e).join("|")),Rt=(x({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:(e,t)=>{var t=nt(t[0]),r=!It.test(e.funcName),n=!r||"\\widehat"===e.funcName||"\\widetilde"===e.funcName||"\\widecheck"===e.funcName;return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:r,isShifty:n,base:t}},htmlBuilder:Nt,mathmlBuilder:qt}),x({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:(e,t)=>{t=t[0];let r=e.parser.mode;return"math"===r&&(e.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+e.funcName+" works only in text mode"),r="text"),{type:"accent",mode:r,label:e.funcName,isStretchy:!1,isShifty:!0,base:t}},htmlBuilder:Nt,mathmlBuilder:qt}),x({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:(e,t)=>{var{parser:e,funcName:r}=e,t=t[0];return{type:"accentUnder",mode:e.mode,label:r,base:t}},htmlBuilder:(e,t)=>{var r=I(e.base,t),n=Tt(e,t),e="\\utilde"===e.label?.12:0,n=N.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:e},{type:"elem",elem:r}]},t);return N.makeSpan(["mord","accentunder"],[n],t)},mathmlBuilder:(e,t)=>{var r=At(e.label);return(e=new k.MathNode("munder",[R(e.base,t),r])).setAttribute("accentunder","true"),e}}),e=>((e=new k.MathNode("mpadded",e?[e]:[])).setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e)),Ht=(x({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){var{parser:e,funcName:n}=e;return{type:"xArrow",mode:e.mode,label:n,body:t[0],below:r[0]}},htmlBuilder(e,t){var r=t.style,n=t.havingStyle(r.sup()),a=N.wrapFragment(I(e.body,n,t),t),o="\\x"===e.label.slice(0,2)?"x":"cd";let i;a.classes.push(o+"-arrow-pad"),e.below&&(n=t.havingStyle(r.sub()),(i=N.wrapFragment(I(e.below,n,t),t)).classes.push(o+"-arrow-pad")),r=Tt(e,t),n=-t.fontMetrics().axisHeight+.5*r.height;let s,l=-t.fontMetrics().axisHeight-.5*r.height-.111;if((.25"atom"!==(e="ordgroup"===e.type&&e.body.length?e.body[0]:e).type||"bin"!==e.family&&"rel"!==e.family?"mord":"m"+e.family,Dt=(x({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(e,t){return{type:"mclass",mode:(e=e.parser).mode,mclass:Lt(t[0]),body:w(t[1]),isCharacterBox:A.isCharacterBox(t[1])}}}),x({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(e,t){var{parser:e,funcName:r}=e,n=t[1],t=t[0],a="\\stackrel"!==r?Lt(n):"mrel",n={type:"op",mode:n.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:"\\stackrel"!==r,body:w(n)},n={type:"supsub",mode:t.mode,base:n,sup:"\\underset"===r?null:t,sub:"\\underset"===r?t:null};return{type:"mclass",mode:e.mode,mclass:a,body:[n],isCharacterBox:A.isCharacterBox(n)}},htmlBuilder:Ot,mathmlBuilder:Et}),x({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(e,t){return{type:"pmb",mode:(e=e.parser).mode,mclass:Lt(t[0]),body:w(t[0])}},htmlBuilder(e,t){var r=q(e.body,t,!0);return(e=N.makeSpan([e.mclass],r,t)).style.textShadow="0.02em 0.01em 0.04px",e},mathmlBuilder(e,t){return e=M(e.body,t),(t=new k.MathNode("mstyle",e)).setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),t}}),{">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"}),Pt=e=>"textord"===e.type&&"@"===e.text;function Vt(e,t,r){if(r=se(h.math[e]&&h.math[e].replace||e,t,r))return r;throw new Error("Unsupported symbol "+e+" and font size "+t+".")}function Ft(e,t,r,n){return t=r.havingBaseStyle(t),n=N.makeSpan(n.concat(t.sizingClasses(r)),[e],r),e=t.sizeMultiplier/r.sizeMultiplier,n.height*=e,n.depth*=e,n.maxFontSize=t.sizeMultiplier,n}function Gt(e,t,r){r=t.havingBaseStyle(r),r=(1-t.sizeMultiplier/r.sizeMultiplier)*t.fontMetrics().axisHeight,e.classes.push("delimcenter"),e.style.top=C(r),e.height-=r,e.depth+=r}function Ut(e,t,r,n,a,o){return e=N.makeSymbol(e,"Size"+t+"-Regular",a,n),a=Ft(N.makeSpan(["delimsizing","size"+t],[e],n),T.TEXT,n,o),r&&Gt(a,n,T.TEXT),a}function Yt(e,t,r){return{type:"elem",elem:N.makeSpan(["delimsizinginner","Size1-Regular"===t?"delim-size1":"delim-size4"],[N.makeSpan([],[N.makeSymbol(e,t,r)])])}}function Xt(e,t,r){var n=(ae["Size4-Regular"][e.charCodeAt(0)]?ae["Size4-Regular"]:ae["Size1-Regular"])[e.charCodeAt(0)][4],e=new Ae("inner",function(e,t){switch(e){case"⎜":return"M291 0 H417 V"+t+" H291z M291 0 H417 V"+t+" H291z";case"∣":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145z";case"∥":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145zM367 0 H410 V"+t+" H367z M367 0 H410 V"+t+" H367z";case"⎟":return"M457 0 H583 V"+t+" H457z M457 0 H583 V"+t+" H457z";case"⎢":return"M319 0 H403 V"+t+" H319z M319 0 H403 V"+t+" H319z";case"⎥":return"M263 0 H347 V"+t+" H263z M263 0 H347 V"+t+" H263z";case"⎪":return"M384 0 H504 V"+t+" H384z M384 0 H504 V"+t+" H384z";case"⏐":return"M312 0 H355 V"+t+" H312z M312 0 H355 V"+t+" H312z";case"‖":return"M257 0 H300 V"+t+" H257z M257 0 H300 V"+t+" H257zM478 0 H521 V"+t+" H478z M478 0 H521 V"+t+" H478z";default:return""}}(e,Math.round(1e3*t))),e=new ze([e],{width:C(n),height:C(t),style:"width:"+C(n),viewBox:"0 0 "+1e3*n+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"});return(e=N.makeSvgSpan([],[e],r)).height=t,e.style.height=C(t),e.style.width=C(n),{type:"elem",elem:e}}function Wt(e,t,r,n,a,o){let i,s,l,h,m="",c=0,p=(i=l=h=e,s=null,"Size1-Regular");"\\uparrow"===e?l=h="⏐":"\\Uparrow"===e?l=h="‖":"\\downarrow"===e?i=l="⏐":"\\Downarrow"===e?i=l="‖":"\\updownarrow"===e?(i="\\uparrow",l="⏐",h="\\downarrow"):"\\Updownarrow"===e?(i="\\Uparrow",l="‖",h="\\Downarrow"):A.contains(e0,e)?(l="∣",m="vert",c=333):A.contains(t0,e)?(l="∥",m="doublevert",c=556):"["===e||"\\lbrack"===e?(i="⎡",l="⎢",h="⎣",p="Size4-Regular",m="lbrack",c=667):"]"===e||"\\rbrack"===e?(i="⎤",l="⎥",h="⎦",p="Size4-Regular",m="rbrack",c=667):"\\lfloor"===e||"⌊"===e?(l=i="⎢",h="⎣",p="Size4-Regular",m="lfloor",c=667):"\\lceil"===e||"⌈"===e?(i="⎡",l=h="⎢",p="Size4-Regular",m="lceil",c=667):"\\rfloor"===e||"⌋"===e?(l=i="⎥",h="⎦",p="Size4-Regular",m="rfloor",c=667):"\\rceil"===e||"⌉"===e?(i="⎤",l=h="⎥",p="Size4-Regular",m="rceil",c=667):"("===e||"\\lparen"===e?(i="⎛",l="⎜",h="⎝",p="Size4-Regular",m="lparen",c=875):")"===e||"\\rparen"===e?(i="⎞",l="⎟",h="⎠",p="Size4-Regular",m="rparen",c=875):"\\{"===e||"\\lbrace"===e?(i="⎧",s="⎨",h="⎩",l="⎪",p="Size4-Regular"):"\\}"===e||"\\rbrace"===e?(i="⎫",s="⎬",h="⎭",l="⎪",p="Size4-Regular"):"\\lgroup"===e||"⟮"===e?(i="⎧",h="⎩",l="⎪",p="Size4-Regular"):"\\rgroup"===e||"⟯"===e?(i="⎫",h="⎭",l="⎪",p="Size4-Regular"):"\\lmoustache"===e||"⎰"===e?(i="⎧",h="⎭",l="⎪",p="Size4-Regular"):"\\rmoustache"!==e&&"⎱"!==e||(i="⎫",h="⎩",l="⎪",p="Size4-Regular");var e=Vt(i,p,a),u=e.height+e.depth,e=Vt(l,p,a),e=e.height+e.depth,d=(d=Vt(h,p,a)).height+d.depth;let g=0,f=1;if(null!==s){const e=Vt(s,p,a);g=e.height+e.depth,f=2}var b=(b=u+d+g)+Math.max(0,Math.ceil((t-b)/(f*e)))*f*e;let y=n.fontMetrics().axisHeight;r&&(y*=n.sizeMultiplier);var t=b/2-y,x=[];if(0n)return a[t]}return a[a.length-1]}function $t(e,t,r,n,a,o){var i,s,l,h,m,c;return"<"===e||"\\lt"===e||"⟨"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"⟩"!==e||(e="\\rangle"),"small"===(c=_t(e,t,A.contains(a0,e)?i0:A.contains(r0,e)?l0:s0,n)).type?(i=e,s=c.style,l=r,m=o,i=Ft(N.makeSymbol(i,"Main-Regular",a,h=n),s,h,m),l&&Gt(i,h,s),i):"large"===c.type?Ut(e,c.size,r,n,a,o):Wt(e,t,r,n,a,o)}x({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(e,t){var{parser:e,funcName:r}=e;return{type:"cdlabel",mode:e.mode,side:r.slice(4),label:t[0]}},htmlBuilder(e,t){var r=t.havingStyle(t.style.sup());return(r=N.wrapFragment(I(e.label,r,t),t)).classes.push("cd-label-"+e.side),r.style.bottom=C(.8-r.depth),r.height=0,r.depth=0,r},mathmlBuilder(e,t){let r=new k.MathNode("mrow",[R(e.label,t)]);return(r=new k.MathNode("mpadded",[r])).setAttribute("width","0"),"left"===e.side&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),(r=new k.MathNode("mstyle",[r])).setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}}),x({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(e,t){return{type:"cdlabelparent",mode:(e=e.parser).mode,fragment:t[0]}},htmlBuilder(e,t){return(e=N.wrapFragment(I(e.fragment,t),t)).classes.push("cd-vert-arrow"),e},mathmlBuilder(e,t){return new k.MathNode("mrow",[R(e.fragment,t)])}}),x({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(e,t){var e=e.parser,r=H(t[0],"ordgroup").body;let n="";for(let e=0;e>10),56320+(1023&t))),{type:"textord",mode:e.mode,text:t}}}),x({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(e,t){var e=e.parser,r=H(t[0],"color-token").color,t=t[1];return{type:"color",mode:e.mode,color:r,body:w(t)}},htmlBuilder:He=(e,t)=>(t=q(e.body,t.withColor(e.color),!1),N.makeFragment(t)),mathmlBuilder:Re=(e,t)=>(t=M(e.body,t.withColor(e.color)),(t=new k.MathNode("mstyle",t)).setAttribute("mathcolor",e.color),t)}),x({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(e,t){var{parser:e,breakOnTokenText:r}=e,t=H(t[0],"color-token").color,r=(e.gullet.macros.set("\\current@color",t),e.parseExpression(!0,r));return{type:"color",mode:e.mode,color:t,body:r}},htmlBuilder:He,mathmlBuilder:Re}),x({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(e,t,r){var n="["===(e=e.parser).gullet.future().text?e.parseSizeGroup(!0):null,a=!e.settings.displayMode||!e.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:e.mode,newLine:a,size:n&&H(n,"size").value}},htmlBuilder(e,t){var r=N.makeSpan(["mspace"],[],t);return e.newLine&&(r.classes.push("newline"),e.size)&&(r.style.marginTop=C(B(e.size,t))),r},mathmlBuilder(e,t){var r=new k.MathNode("mspace");return e.newLine&&(r.setAttribute("linebreak","newline"),e.size)&&r.setAttribute("height",C(B(e.size,t))),r}});const Zt={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},Kt=e=>{var t=e.text;if(/^(?:[\\{}$^_]|EOF)$/.test(t))throw new z("Expected a control sequence",e);return t},Jt=(e,t,r,n)=>{let a=e.gullet.macros.get(r.text);null==a&&(r.noexpand=!0,a={tokens:[r],numArgs:0,unexpandable:!e.gullet.isExpandable(r.text)}),e.gullet.macros.set(t,a,n)},Qt=(x({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(e){var{parser:e,funcName:t}=e,r=(e.consumeSpaces(),e.fetch());if(Zt[r.text])return"\\global"!==t&&"\\\\globallong"!==t||(r.text=Zt[r.text]),H(e.parseFunction(),"internal");throw new z("Invalid token after macro prefix",r)}}),x({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){let{parser:t,funcName:r}=e,n=t.gullet.popToken();if(e=n.text,/^(?:[\\{}$^_]|EOF)$/.test(e))throw new z("Expected a control sequence",n);let a,o=0;for(var i=[[]];"{"!==t.gullet.future().text;)if("#"===(n=t.gullet.popToken()).text){if("{"===t.gullet.future().text){a=t.gullet.future(),i[o].push("{");break}if(n=t.gullet.popToken(),!/^[1-9]$/.test(n.text))throw new z('Invalid argument number "'+n.text+'"');if(parseInt(n.text)!==o+1)throw new z('Argument number "'+n.text+'" out of order');o++,i.push([])}else{if("EOF"===n.text)throw new z("Expected a macro definition");i[o].push(n.text)}let s=t.gullet.consumeArg().tokens;return a&&s.unshift(a),"\\edef"!==r&&"\\xdef"!==r||(s=t.gullet.expandTokens(s)).reverse(),t.gullet.macros.set(e,{tokens:s,numArgs:o,delimiters:i},r===Zt[r]),{type:"internal",mode:t.mode}}}),x({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){var{parser:e,funcName:t}=e,r=Kt(e.gullet.popToken()),n=(e.gullet.consumeSpaces(),(e=>{let t=e.gullet.popToken();return t="="===t.text&&" "===(t=e.gullet.popToken()).text?e.gullet.popToken():t})(e));return Jt(e,r,n,"\\\\globallet"===t),{type:"internal",mode:e.mode}}}),x({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){var{parser:e,funcName:t}=e,r=Kt(e.gullet.popToken()),n=e.gullet.popToken(),a=e.gullet.popToken();return Jt(e,r,a,"\\\\globalfuture"===t),e.gullet.pushToken(a),e.gullet.pushToken(n),{type:"internal",mode:e.mode}}}),{type:"kern",size:-.008}),e0=["|","\\lvert","\\rvert","\\vert"],t0=["\\|","\\lVert","\\rVert","\\Vert"],r0=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","⌊","⌋","\\lceil","\\rceil","⌈","⌉","\\surd"],n0=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","⟮","⟯","\\lmoustache","\\rmoustache","⎰","⎱"],a0=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],o0=[0,1.2,1.8,2.4,3],i0=[{type:"small",style:T.SCRIPTSCRIPT},{type:"small",style:T.SCRIPT},{type:"small",style:T.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],s0=[{type:"small",style:T.SCRIPTSCRIPT},{type:"small",style:T.SCRIPT},{type:"small",style:T.TEXT},{type:"stack"}],l0=[{type:"small",style:T.SCRIPTSCRIPT},{type:"small",style:T.SCRIPT},{type:"small",style:T.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}];var h0={sqrtImage:function(e,t){var r=t.havingBaseSizing(),n=_t("\\surd",e*r.sizeMultiplier,l0,r);let a=r.sizeMultiplier;r=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness);let o,i,s=0,l=0,h=0;return i="small"===n.type?(h=1e3+1e3*r+80,e<1?a=1:e<1.4&&(a=.7),s=(1+r+.08)/a,l=(1+r)/a,(o=jt("sqrtMain",s,h,r,t)).style.minWidth="0.853em",.833/a):"large"===n.type?(h=1080*o0[n.size],l=(o0[n.size]+r)/a,s=(o0[n.size]+r+.08)/a,(o=jt("sqrtSize"+n.size,s,h,r,t)).style.minWidth="1.02em",1/a):(s=e+r+.08,l=e+r,h=Math.floor(1e3*e+r)+80,(o=jt("sqrtTall",s,h,r,t)).style.minWidth="0.742em",1.056),o.height=l,o.style.height=C(s),{span:o,advanceWidth:i,ruleWidth:(t.fontMetrics().sqrtRuleThickness+r)*a}},sizedDelim:function(e,t,r,n,a){if("<"===e||"\\lt"===e||"⟨"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"⟩"!==e||(e="\\rangle"),A.contains(r0,e)||A.contains(a0,e))return Ut(e,t,!1,r,n,a);if(A.contains(n0,e))return Wt(e,o0[t],!1,r,n,a);throw new z("Illegal delimiter: '"+e+"'")},sizeToMaxHeight:o0,customSizedDelim:$t,leftRightDelim:function(e,t,r,n,a,o){var i=n.fontMetrics().axisHeight*n.sizeMultiplier,s=5/n.fontMetrics().ptPerEm,t=Math.max(t-i,r+i);return $t(e,r=Math.max(t/500*901,2*t-s),!0,n,a,o)}};const m0={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},c0=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","⌊","⌋","\\lceil","\\rceil","⌈","⌉","<",">","\\langle","⟨","\\rangle","⟩","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","⟮","⟯","\\lmoustache","\\rmoustache","⎰","⎱","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function p0(e,t){var r=Ct(e);if(r&&A.contains(c0,r.text))return r;throw new z(r?"Invalid delimiter '"+r.text+"' after '"+t.funcName+"'":"Invalid delimiter type '"+e.type+"'",e)}function u0(e){if(!e.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}x({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:(e,t)=>(t=p0(t[0],e),{type:"delimsizing",mode:e.parser.mode,size:m0[e.funcName].size,mclass:m0[e.funcName].mclass,delim:t.text}),htmlBuilder:(e,t)=>"."===e.delim?N.makeSpan([e.mclass]):h0.sizedDelim(e.delim,e.size,t,e.mode,[e.mclass]),mathmlBuilder:e=>{var t=[],t=("."!==e.delim&&t.push(S(e.delim,e.mode)),new k.MathNode("mo",t)),e=("mopen"===e.mclass||"mclose"===e.mclass?t.setAttribute("fence","true"):t.setAttribute("fence","false"),t.setAttribute("stretchy","true"),C(h0.sizeToMaxHeight[e.size]));return t.setAttribute("minsize",e),t.setAttribute("maxsize",e),t}}),x({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{var r=e.parser.gullet.macros.get("\\current@color");if(r&&"string"!=typeof r)throw new z("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:e.parser.mode,delim:p0(t[0],e).text,color:r}}}),x({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{var t=p0(t[0],e),r=(++(e=e.parser).leftrightDepth,e.parseExpression(!1)),n=(--e.leftrightDepth,e.expect("\\right",!1),H(e.parseFunction(),"leftright-right"));return{type:"leftright",mode:e.mode,body:r,left:t.text,right:n.delim,rightColor:n.color}},htmlBuilder:(t,e)=>{u0(t);const r=q(t.body,e,!0,["mopen","mclose"]);let n,a,o=0,i=0,s=!1;for(let e=0;e{u0(e);var r=M(e.body,t);if("."!==e.left){const t=new k.MathNode("mo",[S(e.left,e.mode)]);t.setAttribute("fence","true"),r.unshift(t)}if("."!==e.right){const t=new k.MathNode("mo",[S(e.right,e.mode)]);t.setAttribute("fence","true"),e.rightColor&&t.setAttribute("mathcolor",e.rightColor),r.push(t)}return yt(r)}}),x({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{if(t=p0(t[0],e),e.parser.leftrightDepth)return{type:"middle",mode:e.parser.mode,delim:t.text};throw new z("\\middle without preceding \\left",t)},htmlBuilder:(e,t)=>{let r;return"."===e.delim?r=at(t,[]):(r=h0.sizedDelim(e.delim,1,t,e.mode,[]),e={delim:e.delim,options:t},r.isMiddle=e),r},mathmlBuilder:(e,t)=>(e="\\vert"===e.delim||"|"===e.delim?S("|","text"):S(e.delim,e.mode),(e=new k.MathNode("mo",[e])).setAttribute("fence","true"),e.setAttribute("lspace","0.05em"),e.setAttribute("rspace","0.05em"),e)}),x({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler(e,t,r){var{parser:e,funcName:n}=e,a=H(t[0],"color-token").color,t=t[1];return{type:"enclose",mode:e.mode,label:n,backgroundColor:a,body:t}},htmlBuilder:s=(r,n)=>{const a=N.wrapFragment(I(r.body,n),n),o=r.label.slice(1);let s,e=n.sizeMultiplier,l=0;const h=A.isCharacterBox(r.body);if("sout"===o)(s=N.makeSpan(["stretchy","sout"])).height=n.fontMetrics().defaultRuleThickness/e,l=-.5*n.fontMetrics().xHeight;else if("phase"===o){const r=B({number:.6,unit:"pt"},n),o=B({number:.35,unit:"ex"},n),h=(e/=n.havingBaseSizing().sizeMultiplier,a.height+a.depth+r+o),A=(a.style.paddingLeft=C(h/2+r),Math.floor(1e3*h*e)),t="M400000 "+A+" H0 L"+A/2+" 0 l65 45 L145 "+(A-80)+" H400000z",i=new ze([new Ae("phase",t)],{width:"400em",height:C(A/1e3),viewBox:"0 0 400000 "+A,preserveAspectRatio:"xMinYMin slice"});(s=N.makeSvgSpan(["hide-tail"],[i],n)).style.height=C(h),l=a.depth+r+o}else{/cancel/.test(o)?h||a.classes.push("cancel-pad"):"angl"===o?a.classes.push("anglpad"):a.classes.push("boxpad");let e=0,i,t=0;i=/box/.test(o)?(t=Math.max(n.fontMetrics().fboxrule,n.minRuleThickness),e=n.fontMetrics().fboxsep+("colorbox"===o?0:t)):"angl"===o?(t=Math.max(n.fontMetrics().defaultRuleThickness,n.minRuleThickness),e=4*t,Math.max(0,.25-a.depth)):e=h?.2:0,s=function(e,t,r,n,a){let o;if(n=e.height+e.depth+r+i,/fbox|color|angl/.test(t)){if(o=N.makeSpan(["stretchy",t],[],a),"fbox"===t){const e=a.color&&a.getColor();e&&(o.style.borderColor=e)}}else{const e=[],r=(/^[bx]cancel$/.test(t)&&e.push(new Te({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&e.push(new Te({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"})),new ze(e,{width:"100%",height:C(n)}));o=N.makeSvgSpan([],[r],a)}return o.height=n,o.style.height=C(n),o}(a,o,e,i,n),/fbox|boxed|fcolorbox/.test(o)?(s.style.borderStyle="solid",s.style.borderWidth=C(t)):"angl"===o&&.049!==t&&(s.style.borderTopWidth=C(t),s.style.borderRightWidth=C(t)),l=a.depth+i,r.backgroundColor&&(s.style.backgroundColor=r.backgroundColor,r.borderColor)&&(s.style.borderColor=r.borderColor)}let t;if(r.backgroundColor)t=N.makeVList({positionType:"individualShift",children:[{type:"elem",elem:s,shift:l},{type:"elem",elem:a,shift:0}]},n);else{const r=/cancel|phase/.test(o)?["svg-align"]:[];t=N.makeVList({positionType:"individualShift",children:[{type:"elem",elem:a,shift:0},{type:"elem",elem:s,shift:l,wrapperClasses:r}]},n)}return/cancel/.test(o)&&(t.height=a.height,t.depth=a.depth),/cancel/.test(o)&&!h?N.makeSpan(["mord","cancel-lap"],[t],n):N.makeSpan(["mord"],[t],n)},mathmlBuilder:p=(e,t)=>{let r=0;var n=new k.MathNode(-1{if(!e.parser.settings.displayMode)throw new z("{"+e.envName+"} can be used only in display mode.")};function v0(e){if(-1===e.indexOf("ed"))return-1===e.indexOf("*")}function k0(t,e,r){let{hskipBeforeAndAfter:n,addJot:a,cols:o,arraystretch:i,colSeparationType:s,autoTag:l,singleRow:h,emptySingleRow:m,maxNumCols:c,leqno:p}=e;if(t.gullet.beginGroup(),h||t.gullet.macros.set("\\cr","\\\\\\relax"),!i){const e=t.gullet.expandMacroAsText("\\arraystretch");if(null==e)i=1;else if(!(i=parseFloat(e))||i<0)throw new z("Invalid \\arraystretch: "+e)}t.gullet.beginGroup();let u=[];const d=[u],g=[],f=[],b=null!=l?[]:void 0;function y(){l&&t.gullet.macros.set("\\@eqnsw","1",!0)}function x(){b&&(t.gullet.macros.get("\\df@tag")?(b.push(t.subparse([new y0("\\df@tag")])),t.gullet.macros.set("\\df@tag",void 0,!0)):b.push(Boolean(l)&&"1"===t.gullet.macros.get("\\@eqnsw")))}for(y(),f.push(x0(t));;){let e=t.parseExpression(!1,h?"\\end":"\\\\");t.gullet.endGroup(),t.gullet.beginGroup(),e={type:"ordgroup",mode:t.mode,body:e},r&&(e={type:"styling",mode:t.mode,style:r,body:[e]}),u.push(e);const n=t.fetch().text;if("&"===n){if(c&&u.length===c){if(h||s)throw new z("Too many tab characters: &",t.nextToken);t.settings.reportNonstrict("textEnv","Too few columns specified in the {array} column argument.")}t.consume()}else{if("\\end"===n){x(),1===u.length&&"styling"===e.type&&0===e.body[0].body.length&&(1e))for(o=0;o=h)){(0e.length));return n.cols=new Array(a).fill({type:"align",align:r}),t?{type:"leftright",mode:e.mode,body:[n],left:t[0],right:t[1],rightColor:void 0}:n},htmlBuilder:M0,mathmlBuilder:z0}),g0({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(e){return(e=k0(e.parser,{arraystretch:.5},"script")).colSeparationType="small",e},htmlBuilder:M0,mathmlBuilder:z0}),g0({type:"array",names:["subarray"],props:{numArgs:1},handler(e,t){if(1<(t=(Ct(t[0])?[t[0]]:H(t[0],"ordgroup").body).map(function(e){var t=Bt(e).text;if(-1!=="lc".indexOf(t))return{type:"align",align:t};throw new z("Unknown column alignment: "+t,e)})).length)throw new z("{subarray} can contain only one column");if(0<(e=k0(e.parser,{cols:t,hskipBeforeAndAfter:!1,arraystretch:.5},"script")).body.length&&1AV".indexOf(l)))throw new z('Expected one of "<>AV=|." after @',s[n]);for(let r=0;r<2;r++){let t=!0;for(let e=n+1;e{var r=e.font,t=t.withFont(r);return I(e.body,t)},I0=(e,t)=>{var r=e.font,t=t.withFont(r);return R(e.body,t)},R0={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"},H0=(x({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:(e,t)=>{var{parser:e,funcName:r}=e,t=nt(t[0]);let n=r;return n in R0&&(n=R0[n]),{type:"font",mode:e.mode,font:n.slice(1),body:t}},htmlBuilder:q0,mathmlBuilder:I0}),x({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:(e,t)=>{var e=e.parser,t=t[0],r=A.isCharacterBox(t);return{type:"mclass",mode:e.mode,mclass:Lt(t),body:[{type:"font",mode:e.mode,font:"boldsymbol",body:t}],isCharacterBox:r}}}),x({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:(e,t)=>{var{parser:e,funcName:r,breakOnTokenText:n}=e,a=e.mode,n=e.parseExpression(!0,n);return{type:"font",mode:a,font:"math"+r.slice(1),body:{type:"ordgroup",mode:e.mode,body:n}}},htmlBuilder:q0,mathmlBuilder:I0}),(e,t)=>{let r=t;return"display"===e?r=r.id>=T.SCRIPT.id?r.text():T.DISPLAY:"text"===e&&r.size===T.DISPLAY.size?r=T.TEXT:"script"===e?r=T.SCRIPT:"scriptscript"===e&&(r=T.SCRIPTSCRIPT),r}),O0=(e,t)=>{const r=H0(e.size,t.style),n=r.fracNum(),a=r.fracDen();var o=t.havingStyle(n),i=I(e.numer,o,t);if(e.continued){const e=8.5/t.fontMetrics().ptPerEm,r=3.5/t.fontMetrics().ptPerEm;i.height=i.height{let r=new k.MathNode("mfrac",[R(e.numer,t),R(e.denom,t)]);if(e.hasBarLine){if(e.barSize){const n=B(e.barSize,t);r.setAttribute("linethickness",C(n))}}else r.setAttribute("linethickness","0px");const n=H0(e.size,t.style);if(n.size!==t.style.size){r=new k.MathNode("mstyle",[r]);const e=n.size===T.DISPLAY.size?"true":"false";r.setAttribute("displaystyle",e),r.setAttribute("scriptlevel","0")}if(null==e.leftDelim&&null==e.rightDelim)return r;{const t=[];if(null!=e.leftDelim){const r=new k.MathNode("mo",[new k.TextNode(e.leftDelim.replace("\\",""))]);r.setAttribute("fence","true"),t.push(r)}if(t.push(r),null!=e.rightDelim){const r=new k.MathNode("mo",[new k.TextNode(e.rightDelim.replace("\\",""))]);r.setAttribute("fence","true"),t.push(r)}return yt(t)}},L0=(x({type:"genfrac",names:["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:(e,t)=>{var{parser:e,funcName:r}=e,n=t[0],t=t[1];let a,o=null,i=null,s="auto";switch(r){case"\\dfrac":case"\\frac":case"\\tfrac":a=!0;break;case"\\\\atopfrac":a=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":a=!1,o="(",i=")";break;case"\\\\bracefrac":a=!1,o="\\{",i="\\}";break;case"\\\\brackfrac":a=!1,o="[",i="]";break;default:throw new Error("Unrecognized genfrac command")}switch(r){case"\\dfrac":case"\\dbinom":s="display";break;case"\\tfrac":case"\\tbinom":s="text"}return{type:"genfrac",mode:e.mode,continued:!1,numer:n,denom:t,hasBarLine:a,leftDelim:o,rightDelim:i,size:s,barSize:null}},htmlBuilder:O0,mathmlBuilder:E0}),x({type:"genfrac",names:["\\cfrac"],props:{numArgs:2},handler:(e,t)=>{var e=e.parser,r=t[0],t=t[1];return{type:"genfrac",mode:e.mode,continued:!0,numer:r,denom:t,hasBarLine:!0,leftDelim:null,rightDelim:null,size:"display",barSize:null}}}),x({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(e){let t,{parser:r,funcName:n,token:a}=e;switch(n){case"\\over":t="\\frac";break;case"\\choose":t="\\binom";break;case"\\atop":t="\\\\atopfrac";break;case"\\brace":t="\\\\bracefrac";break;case"\\brack":t="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:r.mode,replaceWith:t,token:a}}}),["display","text","script","scriptscript"]),D0=(x({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(e,t){var e=e.parser,r=t[4],n=t[5],a="atom"===(a=nt(t[0])).type&&"open"===a.family?C0(a.text):null,o="atom"===(o=nt(t[1])).type&&"close"===o.family?C0(o.text):null,i=H(t[2],"size");let s,l=null,h=(s=!!i.isBlank||0<(l=i.value).number,"auto"),m=t[3];if("ordgroup"===m.type){if(0{var e=e.parser,r=t[0],n=function(e){if(e)return e;throw new Error("Expected non-null, but got "+String(e))}(H(t[1],"infix").size),t=t[2],a=0{var r=t.style;let n,a;a="supsub"===e.type?(n=e.sup?I(e.sup,t.havingStyle(r.sup()),t):I(e.sub,t.havingStyle(r.sub()),t),H(e.base,"horizBrace")):H(e,"horizBrace"),r=I(a.base,t.havingBaseStyle(T.DISPLAY)),e=Tt(a,t);let o;if((a.isOver?(o=N.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:.1},{type:"elem",elem:e}]},t)).children[0].children[0].children[1]:(o=N.makeVList({positionType:"bottom",positionData:r.depth+.1+e.height,children:[{type:"elem",elem:e},{type:"kern",size:.1},{type:"elem",elem:r}]},t)).children[0].children[0].children[0]).classes.push("svg-align"),n){const e=N.makeSpan(["mord",a.isOver?"mover":"munder"],[o],t);o=a.isOver?N.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:e},{type:"kern",size:.2},{type:"elem",elem:n}]},t):N.makeVList({positionType:"bottom",positionData:e.depth+.2+n.height+n.depth,children:[{type:"elem",elem:n},{type:"kern",size:.2},{type:"elem",elem:e}]},t)}return N.makeSpan(["mord",a.isOver?"mover":"munder"],[o],t)}),P0=(x({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(e,t){var{parser:e,funcName:r}=e;return{type:"horizBrace",mode:e.mode,label:r,isOver:/^\\over/.test(r),base:t[0]}},htmlBuilder:D0,mathmlBuilder:(e,t)=>{var r=At(e.label);return new k.MathNode(e.isOver?"mover":"munder",[R(e.base,t),r])}}),x({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:(e,t)=>{var e=e.parser,r=t[1],t=H(t[0],"url").url;return e.settings.isTrusted({command:"\\href",url:t})?{type:"href",mode:e.mode,href:t,body:w(r)}:e.formatUnsupportedCmd("\\href")},htmlBuilder:(e,t)=>{var r=q(e.body,t,!1);return N.makeAnchor(e.href,[],r,t)},mathmlBuilder:(e,t)=>{let r=wt(e.body,t);return(r=r instanceof v?r:new v("mrow",[r])).setAttribute("href",e.href),r}}),x({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:(e,t)=>{var e=e.parser,r=H(t[0],"url").url;if(!e.settings.isTrusted({command:"\\url",url:r}))return e.formatUnsupportedCmd("\\url");var n=[];for(let t=0;t{let{parser:r,funcName:n}=t;var a=H(e[0],"raw").string,t=e[1];let o;r.settings.strict&&r.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var i={};switch(n){case"\\htmlClass":i.class=a,o={command:"\\htmlClass",class:a};break;case"\\htmlId":i.id=a,o={command:"\\htmlId",id:a};break;case"\\htmlStyle":i.style=a,o={command:"\\htmlStyle",style:a};break;case"\\htmlData":{const t=a.split(",");for(let e=0;e{var r=q(e.body,t,!1),n=["enclosing"],a=(e.attributes.class&&n.push(...e.attributes.class.trim().split(/\s+/)),N.makeSpan(n,r,t));for(const t in e.attributes)"class"!==t&&e.attributes.hasOwnProperty(t)&&a.setAttribute(t,e.attributes[t]);return a},mathmlBuilder:(e,t)=>wt(e.body,t)}),x({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:(e,t)=>({type:"htmlmathml",mode:(e=e.parser).mode,html:w(t[0]),mathml:w(t[1])}),htmlBuilder:(e,t)=>(e=q(e.html,t,!1),N.makeFragment(e)),mathmlBuilder:(e,t)=>wt(e.mathml,t)}),x({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:(t,e,r)=>{let n=t.parser,a={number:0,unit:"em"},o={number:.9,unit:"em"},i={number:0,unit:"em"},s="";if(r[0]){const t=H(r[0],"raw").string.split(",");for(let e=0;e{var r=B(e.height,t);let n=0,a=(0{var r=new k.MathNode("mglyph",[]);r.setAttribute("alt",e.alt);const n=B(e.height,t);let a=0;if(0{var{parser:e,funcName:r}=e,t=t[0];return{type:"lap",mode:e.mode,alignment:r.slice(5),body:t}},htmlBuilder:(e,t)=>{let r;r="clap"===e.alignment?(r=N.makeSpan([],[I(e.body,t)]),N.makeSpan(["inner"],[r],t)):N.makeSpan(["inner"],[I(e.body,t)]);var n=N.makeSpan(["fix"],[]);let a=N.makeSpan([e.alignment],[r,n],t);return(e=N.makeSpan(["strut"])).style.height=C(a.height+a.depth),a.depth&&(e.style.verticalAlign=C(-a.depth)),a.children.unshift(e),a=N.makeSpan(["thinbox"],[a],t),N.makeSpan(["mord","vbox"],[a],t)},mathmlBuilder:(e,t)=>{var r=new k.MathNode("mpadded",[R(e.body,t)]);if("rlap"!==e.alignment){const t="llap"===e.alignment?"-1":"-0.5";r.setAttribute("lspace",t+"width")}return r.setAttribute("width","0px"),r}}),x({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){var{funcName:e,parser:r}=e,n=r.mode,e=(r.switchMode("math"),"\\("===e?"\\)":"$"),a=r.parseExpression(!1,e);return r.expect(e),r.switchMode(n),{type:"styling",mode:r.mode,style:"text",body:a}}}),x({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){throw new z("Mismatched "+e.funcName)}}),(e,t)=>{switch(t.style.size){case T.DISPLAY.size:return e.display;case T.TEXT.size:return e.text;case T.SCRIPT.size:return e.script;case T.SCRIPTSCRIPT.size:return e.scriptscript;default:return e.text}}),V0=(x({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:(e,t)=>({type:"mathchoice",mode:(e=e.parser).mode,display:w(t[0]),text:w(t[1]),script:w(t[2]),scriptscript:w(t[3])}),htmlBuilder:(e,t)=>(e=q(e=P0(e,t),t,!1),N.makeFragment(e)),mathmlBuilder:(e,t)=>wt(e=P0(e,t),t)}),(e,t,r,n,a,o,i)=>{e=N.makeSpan([],[e]);var s=r&&A.isCharacterBox(r);let l,h,m;if(t){const e=I(t,n.havingStyle(a.sup()),n);h={elem:e,kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-e.depth)}}if(r){const e=I(r,n.havingStyle(a.sub()),n);l={elem:e,kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-e.height)}}if(h&&l){const t=n.fontMetrics().bigOpSpacing5+l.elem.height+l.elem.depth+l.kern+e.depth+i;m=N.makeVList({positionType:"bottom",positionData:t,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:l.elem,marginLeft:C(-o)},{type:"kern",size:l.kern},{type:"elem",elem:e},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:C(o)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else if(l){const t=e.height-i;m=N.makeVList({positionType:"top",positionData:t,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:l.elem,marginLeft:C(-o)},{type:"kern",size:l.kern},{type:"elem",elem:e}]},n)}else{if(!h)return e;{const t=e.depth+i;m=N.makeVList({positionType:"bottom",positionData:t,children:[{type:"elem",elem:e},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:C(o)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}}if(t=[m],l&&0!==o&&!s){const e=N.makeSpan(["mspace"],[],n);e.style.marginRight=C(o),t.unshift(e)}return N.makeSpan(["mop","op-limits"],t,n)}),F0=["\\smallint"],G0=(t,r)=>{let e,n,a,o=!1;"supsub"===t.type?(e=t.sup,n=t.sub,a=H(t.base,"op"),o=!0):a=H(t,"op");let i,s=!1;if((t=r.style).size===T.DISPLAY.size&&a.symbol&&!A.contains(F0,a.name)&&(s=!0),a.symbol){const t=s?"Size2-Regular":"Size1-Regular";let e="";if("\\oiint"!==a.name&&"\\oiiint"!==a.name||(e=a.name.slice(1),a.name="oiint"===e?"\\iint":"\\iiint"),i=N.makeSymbol(a.name,t,"math",r,["mop","op-symbol",s?"large-op":"small-op"]),0{let r;if(e.symbol)r=new v("mo",[S(e.name,e.mode)]),A.contains(F0,e.name)&&r.setAttribute("largeop","false");else if(e.body)r=new v("mo",M(e.body,t));else{r=new v("mi",[new bt(e.name.slice(1))]);const t=new v("mo",[S("","text")]);r=e.parentIsSupSub?new v("mrow",[r,t]):ft([r,t])}return r},Y0={"∏":"\\prod","∐":"\\coprod","∑":"\\sum","⋀":"\\bigwedge","⋁":"\\bigvee","⋂":"\\bigcap","⋃":"\\bigcup","⨀":"\\bigodot","⨁":"\\bigoplus","⨂":"\\bigotimes","⨄":"\\biguplus","⨆":"\\bigsqcup"},X0=(x({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","∏","∐","∑","⋀","⋁","⋂","⋃","⨀","⨁","⨂","⨄","⨆"],props:{numArgs:0},handler:(e,t)=>{let{parser:r,funcName:n}=e,a=n;return 1===a.length&&(a=Y0[a]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:a}},htmlBuilder:G0,mathmlBuilder:U0}),x({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:(e,t)=>(e=e.parser,t=t[0],{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:w(t)}),htmlBuilder:G0,mathmlBuilder:U0}),{"∫":"\\int","∬":"\\iint","∭":"\\iiint","∮":"\\oint","∯":"\\oiint","∰":"\\oiiint"}),W0=(x({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(e){var{parser:e,funcName:t}=e;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:t}},htmlBuilder:G0,mathmlBuilder:U0}),x({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(e){var{parser:e,funcName:t}=e;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:t}},htmlBuilder:G0,mathmlBuilder:U0}),x({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","∫","∬","∭","∮","∯","∰"],props:{numArgs:0},handler(e){let{parser:t,funcName:r}=e,n=r;return 1===n.length&&(n=X0[n]),{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:G0,mathmlBuilder:U0}),(e,t)=>{let r,n,a,o,i=!1;if("supsub"===e.type?(r=e.sup,n=e.sub,a=H(e.base,"operatorname"),i=!0):a=H(e,"operatorname"),0{var t=e.text;return"string"==typeof t?{type:"textord",mode:e.mode,text:t}:e}),r=q(e,t.withFont("mathrm"),!0);for(let e=0;e{var{parser:e,funcName:r}=e,t=t[0];return{type:"operatorname",mode:e.mode,body:w(t),alwaysHandleSupSub:"\\operatornamewithlimits"===r,limits:!1,parentIsSupSub:!1}},htmlBuilder:W0,mathmlBuilder:(t,r)=>{let n=M(t.body,r.withFont("mathrm")),a=!0;for(let e=0;ee.toText()).join("");n=[new k.TextNode(t)]}var r=new k.MathNode("mi",n),e=(r.setAttribute("mathvariant","normal"),new k.MathNode("mo",[S("","text")]));return t.parentIsSupSub?new k.MathNode("mrow",[r,e]):k.newDocumentFragment([r,e])}}),O("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@"),rt({type:"ordgroup",htmlBuilder(e,t){return e.semisimple?N.makeFragment(q(e.body,t,!1)):N.makeSpan(["mord"],q(e.body,t,!0),t)},mathmlBuilder(e,t){return wt(e.body,t,!0)}}),x({type:"overline",names:["\\overline"],props:{numArgs:1},handler(e,t){return e=e.parser,t=t[0],{type:"overline",mode:e.mode,body:t}},htmlBuilder(e,t){var e=I(e.body,t.havingCrampedStyle()),r=N.makeLineSpan("overline-line",t),n=t.fontMetrics().defaultRuleThickness,e=N.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:e},{type:"kern",size:3*n},{type:"elem",elem:r},{type:"kern",size:n}]},t);return N.makeSpan(["mord","overline"],[e],t)},mathmlBuilder(e,t){var r=new k.MathNode("mo",[new k.TextNode("‾")]);return r.setAttribute("stretchy","true"),(e=new k.MathNode("mover",[R(e.body,t),r])).setAttribute("accent","true"),e}}),x({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>(e=e.parser,t=t[0],{type:"phantom",mode:e.mode,body:w(t)}),htmlBuilder:(e,t)=>(e=q(e.body,t.withPhantom(),!1),N.makeFragment(e)),mathmlBuilder:(e,t)=>(e=M(e.body,t),new k.MathNode("mphantom",e))}),x({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>(e=e.parser,t=t[0],{type:"hphantom",mode:e.mode,body:t}),htmlBuilder:(e,t)=>{let r=N.makeSpan([],[I(e.body,t.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(let e=0;e(e=M(w(e.body),t),t=new k.MathNode("mphantom",e),(e=new k.MathNode("mpadded",[t])).setAttribute("height","0px"),e.setAttribute("depth","0px"),e)}),x({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>(e=e.parser,t=t[0],{type:"vphantom",mode:e.mode,body:t}),htmlBuilder:(e,t)=>{var e=N.makeSpan(["inner"],[I(e.body,t.withPhantom())]),r=N.makeSpan(["fix"],[]);return N.makeSpan(["mord","rlap"],[e,r],t)},mathmlBuilder:(e,t)=>(e=M(w(e.body),t),t=new k.MathNode("mphantom",e),(e=new k.MathNode("mpadded",[t])).setAttribute("width","0px"),e)}),x({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(e,t){var e=e.parser,r=H(t[0],"size").value,t=t[1];return{type:"raisebox",mode:e.mode,dy:r,body:t}},htmlBuilder(e,t){var r=I(e.body,t),e=B(e.dy,t);return N.makeVList({positionType:"shift",positionData:-e,children:[{type:"elem",elem:r}]},t)},mathmlBuilder(e,t){return t=new k.MathNode("mpadded",[R(e.body,t)]),e=e.dy.number+e.dy.unit,t.setAttribute("voffset",e),t}}),x({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0},handler(e){return{type:"internal",mode:(e=e.parser).mode}}}),x({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,argTypes:["size","size","size"]},handler(e,t,r){var e=e.parser,r=r[0],n=H(t[0],"size"),t=H(t[1],"size");return{type:"rule",mode:e.mode,shift:r&&H(r,"size").value,width:n.value,height:t.value}},htmlBuilder(e,t){var r=N.makeSpan(["mord","rule"],[],t),n=B(e.width,t),a=B(e.height,t),e=e.shift?B(e.shift,t):0;return r.style.borderRightWidth=C(n),r.style.borderTopWidth=C(a),r.style.bottom=C(e),r.width=n,r.height=a+e,r.depth=-e,r.maxFontSize=1.125*a*t.sizeMultiplier,r},mathmlBuilder(e,t){var r=B(e.width,t),n=B(e.height,t),e=e.shift?B(e.shift,t):0,t=t.color&&t.getColor()||"black",a=new k.MathNode("mspace"),t=(a.setAttribute("mathbackground",t),a.setAttribute("width",C(r)),a.setAttribute("height",C(n)),new k.MathNode("mpadded",[a]));return 0<=e?t.setAttribute("height",C(e)):(t.setAttribute("height",C(e)),t.setAttribute("depth",C(-e))),t.setAttribute("voffset",C(e)),t}});const _0=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"],$0=(x({type:"sizing",names:_0,props:{numArgs:0,allowedInText:!0},handler:(e,t)=>{var{breakOnTokenText:e,funcName:r,parser:n}=e,e=n.parseExpression(!1,e);return{type:"sizing",mode:n.mode,size:_0.indexOf(r)+1,body:e}},htmlBuilder:(e,t)=>{var r=t.havingSize(e.size);return j0(e.body,r,t)},mathmlBuilder:(e,t)=>(t=t.havingSize(e.size),e=M(e.body,t),(e=new k.MathNode("mstyle",e)).setAttribute("mathsize",C(t.sizeMultiplier)),e)}),x({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:(e,t,r)=>{let n=e.parser,a=!1,o=!1;var i,s=r[0]&&H(r[0],"ordgroup");if(s)for(let e=0;e{var r=N.makeSpan([],[I(e.body,t)]);if(!e.smashHeight&&!e.smashDepth)return r;if(e.smashHeight&&(r.height=0,r.children))for(let e=0;e(t=new k.MathNode("mpadded",[R(e.body,t)]),e.smashHeight&&t.setAttribute("height","0px"),e.smashDepth&&t.setAttribute("depth","0px"),t)}),x({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){return e=e.parser,r=r[0],t=t[0],{type:"sqrt",mode:e.mode,body:t,index:r}},htmlBuilder(e,t){let r=I(e.body,t.havingCrampedStyle());0===r.height&&(r.height=t.fontMetrics().xHeight),r=N.wrapFragment(r,t);const n=t.fontMetrics().defaultRuleThickness;let a=n,o=(t.style.idr.height+r.depth+o&&(o=(o+m-r.height-r.depth)/2);var c=s.height-r.height-o-l,c=(r.style.paddingLeft=C(h),N.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+c)},{type:"elem",elem:s},{type:"kern",size:l}]},t));if(e.index){const r=t.havingStyle(T.SCRIPTSCRIPT),n=I(e.index,r,t),a=.6*(c.height-c.depth),o=N.makeVList({positionType:"shift",positionData:-a,children:[{type:"elem",elem:n}]},t),i=N.makeSpan(["root"],[o]);return N.makeSpan(["mord","sqrt"],[i,c],t)}return N.makeSpan(["mord","sqrt"],[c],t)},mathmlBuilder(e,t){var{body:e,index:r}=e;return r?new k.MathNode("mroot",[R(e,t),R(r,t)]):new k.MathNode("msqrt",[R(e,t)])}}),{display:T.DISPLAY,text:T.TEXT,script:T.SCRIPT,scriptscript:T.SCRIPTSCRIPT}),Z0=(x({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e,t){var{breakOnTokenText:e,funcName:r,parser:n}=e,e=n.parseExpression(!0,e),r=r.slice(1,r.length-5);return{type:"styling",mode:n.mode,style:r,body:e}},htmlBuilder(e,t){var r=$0[e.style],r=t.havingStyle(r).withFont("");return j0(e.body,r,t)},mathmlBuilder(e,t){var r=$0[e.style],t=t.havingStyle(r),r=M(e.body,t),t=new k.MathNode("mstyle",r),r={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[e.style];return t.setAttribute("scriptlevel",r[0]),t.setAttribute("displaystyle",r[1]),t}}),rt({type:"supsub",htmlBuilder(e,t){n=t;const r=(o=(a=e).base)?"op"===o.type?o.limits&&(n.style.size===T.DISPLAY.size||o.alwaysHandleSupSub)?G0:null:"operatorname"===o.type?o.alwaysHandleSupSub&&(n.style.size===T.DISPLAY.size||o.limits)?W0:null:"accent"===o.type?A.isCharacterBox(o.base)?Nt:null:"horizBrace"===o.type&&!a.sub===o.isOver?D0:null:null;if(r)return r(e,t);var{base:n,sup:a,sub:o}=e,i=I(n,t);let s,l;var h=t.fontMetrics();let m=0,c=0;if(n=n&&A.isCharacterBox(n),a){const e=t.havingStyle(t.style.sup());s=I(a,e,t),n||(m=i.height-e.fontMetrics().supDrop*e.sizeMultiplier/t.sizeMultiplier)}if(o){const e=t.havingStyle(t.style.sub());l=I(o,e,t),n||(c=i.depth+e.fontMetrics().subDrop*e.sizeMultiplier/t.sizeMultiplier)}a=t.style===T.DISPLAY?h.sup1:t.style.cramped?h.sup3:h.sup2,o=t.sizeMultiplier,n=C(.5/h.ptPerEm/o);let p,u=null;if(l){const t=e.base&&"op"===e.base.type&&e.base.name&&("\\oiint"===e.base.name||"\\oiiint"===e.base.name);(i instanceof d||t)&&(u=C(-i.italic))}if(s&&l){m=Math.max(m,a,s.depth+.25*h.xHeight),c=Math.max(c,h.sub2);const e=4*h.defaultRuleThickness;if(m-s.depth-(l.height-c){var e=new k.MathNode("mtd",[]);return e.setAttribute("width","50%"),e}),er=(rt({type:"tag",mathmlBuilder(e,t){return(e=new k.MathNode("mtable",[new k.MathNode("mtr",[Q0(),new k.MathNode("mtd",[wt(e.body,t)]),Q0(),new k.MathNode("mtd",[wt(e.tag,t)])])])).setAttribute("width","100%"),e}}),{"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"}),tr={"\\textbf":"textbf","\\textmd":"textmd"},rr={"\\textit":"textit","\\textup":"textup"},nr=(e,t)=>(e=e.font)?er[e]?t.withTextFontFamily(er[e]):tr[e]?t.withTextFontWeight(tr[e]):t.withTextFontShape(rr[e]):t,ar=(x({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(e,t){var{parser:e,funcName:r}=e,t=t[0];return{type:"text",mode:e.mode,body:w(t),font:r}},htmlBuilder(e,t){return t=nr(e,t),e=q(e.body,t,!0),N.makeSpan(["mord","text"],e,t)},mathmlBuilder(e,t){return t=nr(e,t),wt(e.body,t)}}),x({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(e,t){return{type:"underline",mode:(e=e.parser).mode,body:t[0]}},htmlBuilder(e,t){var e=I(e.body,t),r=N.makeLineSpan("underline-line",t),n=t.fontMetrics().defaultRuleThickness,r=N.makeVList({positionType:"top",positionData:e.height,children:[{type:"kern",size:n},{type:"elem",elem:r},{type:"kern",size:3*n},{type:"elem",elem:e}]},t);return N.makeSpan(["mord","underline"],[r],t)},mathmlBuilder(e,t){var r=new k.MathNode("mo",[new k.TextNode("‾")]);return r.setAttribute("stretchy","true"),(e=new k.MathNode("munder",[R(e.body,t),r])).setAttribute("accentunder","true"),e}}),x({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(e,t){return{type:"vcenter",mode:(e=e.parser).mode,body:t[0]}},htmlBuilder(e,t){var e=I(e.body,t),r=t.fontMetrics().axisHeight,r=.5*(e.height-r-(e.depth+r));return N.makeVList({positionType:"shift",positionData:r,children:[{type:"elem",elem:e}]},t)},mathmlBuilder(e,t){return new k.MathNode("mpadded",[R(e.body,t)],["vcenter"])}}),x({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(e,t,r){throw new z("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(r,e){var n=ar(r),a=[],o=e.havingStyle(e.style.text());for(let t=0;te.body.replace(/ /g,e.star?"␣":" "));var or=Qe;const ir=new RegExp("[̀-ͯ]+$");class sr{constructor(e,t){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=e,this.settings=t,this.tokenRegex=new RegExp("([ \r\n\t]+)|\\\\(\n|[ \r\t]+\n?)[ \r\t]*|([!-\\[\\]-‧-豈-][̀-ͯ]*|[\ud800-\udbff][\udc00-\udfff][̀-ͯ]*|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5|(\\\\[a-zA-Z@]+)[ \r\n\t]*|\\\\[^\ud800-\udfff])","g"),this.catcodes={"%":14,"~":13}}setCatcode(e,t){this.catcodes[e]=t}lex(){const e=this.input,t=this.tokenRegex.lastIndex;if(t===e.length)return new y0("EOF",new b0(this,t,t));var r=this.tokenRegex.exec(e);if(null===r||r.index!==t)throw new z("Unexpected character: '"+e[t]+"'",new y0(e[t],new b0(this,t,t+1)));if(r=r[6]||r[3]||(r[2]?"\\ ":" "),14!==this.catcodes[r])return new y0(r,new b0(this,t,this.tokenRegex.lastIndex));{const t=e.indexOf("\n",this.tokenRegex.lastIndex);return-1===t?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=t+1,this.lex()}}}class lr{constructor(e,t){void 0===e&&(e={}),void 0===t&&(t={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=t,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(0===this.undefStack.length)throw new z("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e=this.undefStack.pop();for(const t in e)e.hasOwnProperty(t)&&(null==e[t]?delete this.current[t]:this.current[t]=e[t])}endGroups(){for(;0=t)throw new z("Invalid base-"+t+" digit "+r.text);for(var a;null!=(a=mr[e.future().text])&&a{let n=r.consumeArg().tokens;if(1!==n.length)throw new z("\\newcommand's first argument must be a macro name");var a=n[0].text,o=r.isDefined(a);if(o&&!e)throw new z("\\newcommand{"+a+"} attempting to redefine "+a+"; use \\renewcommand");if(!o&&!t)throw new z("\\renewcommand{"+a+"} when command "+a+" does not yet exist; use \\newcommand");let i=0;if(1===(n=r.consumeArg().tokens).length&&"["===n[0].text){let e="",t=r.expandNextToken();for(;"]"!==t.text&&"EOF"!==t.text;)e+=t.text,t=r.expandNextToken();if(!e.match(/^\s*[0-9]+\s*$/))throw new z("Invalid number of arguments: "+e);i=parseInt(e),n=r.consumeArg().tokens}return r.macros.set(a,{tokens:n,numArgs:i}),""}),pr=(O("\\newcommand",e=>cr(e,!1,!0)),O("\\renewcommand",e=>cr(e,!0,!1)),O("\\providecommand",e=>cr(e,!0,!0)),O("\\message",e=>(e=e.consumeArgs(1)[0],console.log(e.reverse().map(e=>e.text).join("")),"")),O("\\errmessage",e=>(e=e.consumeArgs(1)[0],console.error(e.reverse().map(e=>e.text).join("")),"")),O("\\show",e=>{var t=e.popToken(),r=t.text;return console.log(t,e.macros.get(r),or[r],h.math[r],h.text[r]),""}),O("\\bgroup","{"),O("\\egroup","}"),O("~","\\nobreakspace"),O("\\lq","`"),O("\\rq","'"),O("\\aa","\\r a"),O("\\AA","\\r A"),O("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`©}"),O("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"),O("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`®}"),O("ℬ","\\mathscr{B}"),O("ℰ","\\mathscr{E}"),O("ℱ","\\mathscr{F}"),O("ℋ","\\mathscr{H}"),O("ℐ","\\mathscr{I}"),O("ℒ","\\mathscr{L}"),O("ℳ","\\mathscr{M}"),O("ℛ","\\mathscr{R}"),O("ℭ","\\mathfrak{C}"),O("ℌ","\\mathfrak{H}"),O("ℨ","\\mathfrak{Z}"),O("\\Bbbk","\\Bbb{k}"),O("·","\\cdotp"),O("\\llap","\\mathllap{\\textrm{#1}}"),O("\\rlap","\\mathrlap{\\textrm{#1}}"),O("\\clap","\\mathclap{\\textrm{#1}}"),O("\\mathstrut","\\vphantom{(}"),O("\\underbar","\\underline{\\text{#1}}"),O("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'),O("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`≠}}"),O("\\ne","\\neq"),O("≠","\\neq"),O("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`∉}}"),O("∉","\\notin"),O("≘","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`≘}}"),O("≙","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`≘}}"),O("≚","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`≚}}"),O("≛","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`≛}}"),O("≝","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`≝}}"),O("≞","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`≞}}"),O("≟","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`≟}}"),O("⟂","\\perp"),O("‼","\\mathclose{!\\mkern-0.8mu!}"),O("∌","\\notni"),O("⌜","\\ulcorner"),O("⌝","\\urcorner"),O("⌞","\\llcorner"),O("⌟","\\lrcorner"),O("©","\\copyright"),O("®","\\textregistered"),O("️","\\textregistered"),O("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}'),O("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}'),O("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}'),O("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}'),O("\\vdots","\\mathord{\\varvdots\\rule{0pt}{15pt}}"),O("⋮","\\vdots"),O("\\varGamma","\\mathit{\\Gamma}"),O("\\varDelta","\\mathit{\\Delta}"),O("\\varTheta","\\mathit{\\Theta}"),O("\\varLambda","\\mathit{\\Lambda}"),O("\\varXi","\\mathit{\\Xi}"),O("\\varPi","\\mathit{\\Pi}"),O("\\varSigma","\\mathit{\\Sigma}"),O("\\varUpsilon","\\mathit{\\Upsilon}"),O("\\varPhi","\\mathit{\\Phi}"),O("\\varPsi","\\mathit{\\Psi}"),O("\\varOmega","\\mathit{\\Omega}"),O("\\substack","\\begin{subarray}{c}#1\\end{subarray}"),O("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax"),O("\\boxed","\\fbox{$\\displaystyle{#1}$}"),O("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;"),O("\\implies","\\DOTSB\\;\\Longrightarrow\\;"),O("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;"),{",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"}),ur=(O("\\dots",function(e){let t="\\dotso";return(e=e.expandAfterFuture().text)in pr?t=pr[e]:("\\not"===e.slice(0,4)||e in h.math&&A.contains(["bin","rel"],h.math[e].group))&&(t="\\dotsb"),t}),{")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0}),dr=(O("\\dotso",function(e){return e.future().text in ur?"\\ldots\\,":"\\ldots"}),O("\\dotsc",function(e){return(e=e.future().text)in ur&&","!==e?"\\ldots\\,":"\\ldots"}),O("\\cdots",function(e){return e.future().text in ur?"\\@cdots\\,":"\\@cdots"}),O("\\dotsb","\\cdots"),O("\\dotsm","\\cdots"),O("\\dotsi","\\!\\cdots"),O("\\dotsx","\\ldots\\,"),O("\\DOTSI","\\relax"),O("\\DOTSB","\\relax"),O("\\DOTSX","\\relax"),O("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),O("\\,","\\tmspace+{3mu}{.1667em}"),O("\\thinspace","\\,"),O("\\>","\\mskip{4mu}"),O("\\:","\\tmspace+{4mu}{.2222em}"),O("\\medspace","\\:"),O("\\;","\\tmspace+{5mu}{.2777em}"),O("\\thickspace","\\;"),O("\\!","\\tmspace-{3mu}{.1667em}"),O("\\negthinspace","\\!"),O("\\negmedspace","\\tmspace-{4mu}{.2222em}"),O("\\negthickspace","\\tmspace-{5mu}{.277em}"),O("\\enspace","\\kern.5em "),O("\\enskip","\\hskip.5em\\relax"),O("\\quad","\\hskip1em\\relax"),O("\\qquad","\\hskip2em\\relax"),O("\\tag","\\@ifstar\\tag@literal\\tag@paren"),O("\\tag@paren","\\tag@literal{({#1})}"),O("\\tag@literal",e=>{if(e.macros.get("\\df@tag"))throw new z("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"}),O("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),O("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),O("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),O("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),O("\\newline","\\\\\\relax"),O("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}"),O("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+(l=C(ae["Main-Regular"]["T".charCodeAt(0)][1]-.7*ae["Main-Regular"]["A".charCodeAt(0)][1]))+"}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}"),O("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+l+"}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}"),O("\\hspace","\\@ifstar\\@hspacer\\@hspace"),O("\\@hspace","\\hskip #1\\relax"),O("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),O("\\ordinarycolon",":"),O("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),O("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),O("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),O("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),O("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),O("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),O("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),O("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),O("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),O("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),O("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),O("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),O("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),O("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),O("∷","\\dblcolon"),O("∹","\\eqcolon"),O("≔","\\coloneqq"),O("≕","\\eqqcolon"),O("⩴","\\Coloneqq"),O("\\ratio","\\vcentcolon"),O("\\coloncolon","\\dblcolon"),O("\\colonequals","\\coloneqq"),O("\\coloncolonequals","\\Coloneqq"),O("\\equalscolon","\\eqqcolon"),O("\\equalscoloncolon","\\Eqqcolon"),O("\\colonminus","\\coloneq"),O("\\coloncolonminus","\\Coloneq"),O("\\minuscolon","\\eqcolon"),O("\\minuscoloncolon","\\Eqcolon"),O("\\coloncolonapprox","\\Colonapprox"),O("\\coloncolonsim","\\Colonsim"),O("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),O("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),O("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),O("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),O("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`∌}}"),O("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),O("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),O("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}"),O("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}"),O("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}"),O("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}"),O("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}"),O("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}"),O("\\gvertneqq","\\html@mathml{\\@gvertneqq}{≩}"),O("\\lvertneqq","\\html@mathml{\\@lvertneqq}{≨}"),O("\\ngeqq","\\html@mathml{\\@ngeqq}{≱}"),O("\\ngeqslant","\\html@mathml{\\@ngeqslant}{≱}"),O("\\nleqq","\\html@mathml{\\@nleqq}{≰}"),O("\\nleqslant","\\html@mathml{\\@nleqslant}{≰}"),O("\\nshortmid","\\html@mathml{\\@nshortmid}{∤}"),O("\\nshortparallel","\\html@mathml{\\@nshortparallel}{∦}"),O("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{⊈}"),O("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{⊉}"),O("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{⊊}"),O("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{⫋}"),O("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{⊋}"),O("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{⫌}"),O("\\imath","\\html@mathml{\\@imath}{ı}"),O("\\jmath","\\html@mathml{\\@jmath}{ȷ}"),O("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`⟦}}"),O("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`⟧}}"),O("⟦","\\llbracket"),O("⟧","\\rrbracket"),O("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`⦃}}"),O("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`⦄}}"),O("⦃","\\lBrace"),O("⦄","\\rBrace"),O("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`⦵}}"),O("⦵","\\minuso"),O("\\darr","\\downarrow"),O("\\dArr","\\Downarrow"),O("\\Darr","\\Downarrow"),O("\\lang","\\langle"),O("\\rang","\\rangle"),O("\\uarr","\\uparrow"),O("\\uArr","\\Uparrow"),O("\\Uarr","\\Uparrow"),O("\\N","\\mathbb{N}"),O("\\R","\\mathbb{R}"),O("\\Z","\\mathbb{Z}"),O("\\alef","\\aleph"),O("\\alefsym","\\aleph"),O("\\Alpha","\\mathrm{A}"),O("\\Beta","\\mathrm{B}"),O("\\bull","\\bullet"),O("\\Chi","\\mathrm{X}"),O("\\clubs","\\clubsuit"),O("\\cnums","\\mathbb{C}"),O("\\Complex","\\mathbb{C}"),O("\\Dagger","\\ddagger"),O("\\diamonds","\\diamondsuit"),O("\\empty","\\emptyset"),O("\\Epsilon","\\mathrm{E}"),O("\\Eta","\\mathrm{H}"),O("\\exist","\\exists"),O("\\harr","\\leftrightarrow"),O("\\hArr","\\Leftrightarrow"),O("\\Harr","\\Leftrightarrow"),O("\\hearts","\\heartsuit"),O("\\image","\\Im"),O("\\infin","\\infty"),O("\\Iota","\\mathrm{I}"),O("\\isin","\\in"),O("\\Kappa","\\mathrm{K}"),O("\\larr","\\leftarrow"),O("\\lArr","\\Leftarrow"),O("\\Larr","\\Leftarrow"),O("\\lrarr","\\leftrightarrow"),O("\\lrArr","\\Leftrightarrow"),O("\\Lrarr","\\Leftrightarrow"),O("\\Mu","\\mathrm{M}"),O("\\natnums","\\mathbb{N}"),O("\\Nu","\\mathrm{N}"),O("\\Omicron","\\mathrm{O}"),O("\\plusmn","\\pm"),O("\\rarr","\\rightarrow"),O("\\rArr","\\Rightarrow"),O("\\Rarr","\\Rightarrow"),O("\\real","\\Re"),O("\\reals","\\mathbb{R}"),O("\\Reals","\\mathbb{R}"),O("\\Rho","\\mathrm{P}"),O("\\sdot","\\cdot"),O("\\sect","\\S"),O("\\spades","\\spadesuit"),O("\\sub","\\subset"),O("\\sube","\\subseteq"),O("\\supe","\\supseteq"),O("\\Tau","\\mathrm{T}"),O("\\thetasym","\\vartheta"),O("\\weierp","\\wp"),O("\\Zeta","\\mathrm{Z}"),O("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),O("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),O("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits"),O("\\bra","\\mathinner{\\langle{#1}|}"),O("\\ket","\\mathinner{|{#1}\\rangle}"),O("\\braket","\\mathinner{\\langle{#1}\\rangle}"),O("\\Bra","\\left\\langle#1\\right|"),O("\\Ket","\\left|#1\\right\\rangle"),O("\\bra@ket",(u=l=>e=>{const t=e.consumeArg().tokens,n=e.consumeArg().tokens,a=e.consumeArg().tokens,r=e.consumeArg().tokens,o=e.macros.get("|"),i=e.macros.get("\\|");e.macros.beginGroup();var s=r=>e=>{l&&(e.macros.set("|",o),a.length)&&e.macros.set("\\|",i);let t=r;return!r&&a.length&&"|"===e.future().text&&(e.popToken(),t=!0),{tokens:t?a:n,numArgs:0}},s=(e.macros.set("|",s(!1)),a.length&&e.macros.set("\\|",s(!0)),e.consumeArg().tokens),s=e.expandTokens([...r,...s,...t]);return e.macros.endGroup(),{tokens:s.reverse(),numArgs:0}})(!1)),O("\\bra@set",u(!0)),O("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}"),O("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}"),O("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}"),O("\\angln","{\\angl n}"),O("\\blue","\\textcolor{##6495ed}{#1}"),O("\\orange","\\textcolor{##ffa500}{#1}"),O("\\pink","\\textcolor{##ff00af}{#1}"),O("\\red","\\textcolor{##df0030}{#1}"),O("\\green","\\textcolor{##28ae7b}{#1}"),O("\\gray","\\textcolor{gray}{#1}"),O("\\purple","\\textcolor{##9d38bd}{#1}"),O("\\blueA","\\textcolor{##ccfaff}{#1}"),O("\\blueB","\\textcolor{##80f6ff}{#1}"),O("\\blueC","\\textcolor{##63d9ea}{#1}"),O("\\blueD","\\textcolor{##11accd}{#1}"),O("\\blueE","\\textcolor{##0c7f99}{#1}"),O("\\tealA","\\textcolor{##94fff5}{#1}"),O("\\tealB","\\textcolor{##26edd5}{#1}"),O("\\tealC","\\textcolor{##01d1c1}{#1}"),O("\\tealD","\\textcolor{##01a995}{#1}"),O("\\tealE","\\textcolor{##208170}{#1}"),O("\\greenA","\\textcolor{##b6ffb0}{#1}"),O("\\greenB","\\textcolor{##8af281}{#1}"),O("\\greenC","\\textcolor{##74cf70}{#1}"),O("\\greenD","\\textcolor{##1fab54}{#1}"),O("\\greenE","\\textcolor{##0d923f}{#1}"),O("\\goldA","\\textcolor{##ffd0a9}{#1}"),O("\\goldB","\\textcolor{##ffbb71}{#1}"),O("\\goldC","\\textcolor{##ff9c39}{#1}"),O("\\goldD","\\textcolor{##e07d10}{#1}"),O("\\goldE","\\textcolor{##a75a05}{#1}"),O("\\redA","\\textcolor{##fca9a9}{#1}"),O("\\redB","\\textcolor{##ff8482}{#1}"),O("\\redC","\\textcolor{##f9685d}{#1}"),O("\\redD","\\textcolor{##e84d39}{#1}"),O("\\redE","\\textcolor{##bc2612}{#1}"),O("\\maroonA","\\textcolor{##ffbde0}{#1}"),O("\\maroonB","\\textcolor{##ff92c6}{#1}"),O("\\maroonC","\\textcolor{##ed5fa6}{#1}"),O("\\maroonD","\\textcolor{##ca337c}{#1}"),O("\\maroonE","\\textcolor{##9e034e}{#1}"),O("\\purpleA","\\textcolor{##ddd7ff}{#1}"),O("\\purpleB","\\textcolor{##c6b9fc}{#1}"),O("\\purpleC","\\textcolor{##aa87ff}{#1}"),O("\\purpleD","\\textcolor{##7854ab}{#1}"),O("\\purpleE","\\textcolor{##543b78}{#1}"),O("\\mintA","\\textcolor{##f5f9e8}{#1}"),O("\\mintB","\\textcolor{##edf2df}{#1}"),O("\\mintC","\\textcolor{##e0e5cc}{#1}"),O("\\grayA","\\textcolor{##f6f7f7}{#1}"),O("\\grayB","\\textcolor{##f0f1f2}{#1}"),O("\\grayC","\\textcolor{##e3e5e6}{#1}"),O("\\grayD","\\textcolor{##d6d8da}{#1}"),O("\\grayE","\\textcolor{##babec2}{#1}"),O("\\grayF","\\textcolor{##888d93}{#1}"),O("\\grayG","\\textcolor{##626569}{#1}"),O("\\grayH","\\textcolor{##3b3e40}{#1}"),O("\\grayI","\\textcolor{##21242c}{#1}"),O("\\kaBlue","\\textcolor{##314453}{#1}"),O("\\kaGreen","\\textcolor{##71B307}{#1}"),{"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0});class gr{constructor(e,t,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new lr(hr,t.macros),this.mode=r,this.stack=[]}feed(e){this.lexer=new sr(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){let t,r,n;if(e){if(this.consumeSpaces(),"["!==this.future().text)return null;t=this.popToken(),{tokens:n,end:r}=this.consumeArg(["]"])}else({tokens:n,start:t,end:r}=this.consumeArg());return this.pushToken(new y0("EOF",r.loc)),this.pushTokens(n),t.range(r,"")}consumeSpaces(){for(;" "===this.future().text;)this.stack.pop()}consumeArg(e){var t=[],r=e&&0this.settings.maxExpand)throw new z("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var t=this.popToken(),r=t.text,n=t.noexpand?null:this._getExpansion(r);if(null==n||e&&n.unexpandable){if(e&&null==n&&"\\"===r[0]&&!this.isDefined(r))throw new z("Undefined control sequence: "+r);return this.pushToken(t),!1}this.countExpansion(1);let a=n.tokens;var o=this.consumeArgs(n.numArgs,n.delimiters);if(n.numArgs)for(let e=(a=a.slice()).length-1;0<=e;--e){var i=a[e];if("#"===i.text){if(0===e)throw new z("Incomplete placeholder at end of macro body",i);if("#"===(i=a[--e]).text)a.splice(e+1,1);else{if(!/^[1-9]$/.test(i.text))throw new z("Not a valid argument number",i);a.splice(e,2,...o[+i.text-1])}}}return this.pushTokens(a),a.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;){var e;if(!1===this.expandOnce())return(e=this.stack.pop()).treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new y0(e)]):void 0}expandTokens(e){var t=[],r=this.stack.length;for(this.pushTokens(e);this.stack.length>r;)if(!1===this.expandOnce(!0)){const e=this.stack.pop();e.treatAsRelax&&(e.noexpand=!1,e.treatAsRelax=!1),t.push(e)}return this.countExpansion(t.length),t}expandMacroAsText(e){return(e=this.expandMacro(e))&&e.map(e=>e.text).join("")}_getExpansion(r){const n=this.macros.get(r);if(null==n)return n;if(1===r.length){const n=this.lexer.catcodes[r];if(null!=n&&13!==n)return}if("string"!=typeof(r="function"==typeof n?n(this):n))return r;{let e=0;if(-1!==r.indexOf("#")){const n=r.replace(/##/g,"");for(;-1!==n.indexOf("#"+(e+1));)++e}const n=new sr(r,this.settings),a=[];let t=n.lex();for(;"EOF"!==t.text;)a.push(t),t=n.lex();return a.reverse(),{tokens:a,numArgs:e}}}isDefined(e){return this.macros.has(e)||or.hasOwnProperty(e)||h.math.hasOwnProperty(e)||h.text.hasOwnProperty(e)||dr.hasOwnProperty(e)}isExpandable(e){var t=this.macros.get(e);return null!=t?"string"==typeof t||"function"==typeof t||!t.unexpandable:or.hasOwnProperty(e)&&!or[e].primitive}}const fr=/^[\u208a\u208b\u208c\u208d\u208e\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2090\u2091\u2095\u1d62\u2c7c\u2096\u2097\u2098\u2099\u2092\u209a\u1d63\u209b\u209c\u1d64\u1d65\u2093\u1d66\u1d67\u1d68\u1d69\u1d6a]/,br=Object.freeze({"₊":"+","₋":"-","₌":"=","₍":"(","₎":")","₀":"0","₁":"1","₂":"2","₃":"3","₄":"4","₅":"5","₆":"6","₇":"7","₈":"8","₉":"9","ₐ":"a","ₑ":"e","ₕ":"h","ᵢ":"i","ⱼ":"j","ₖ":"k","ₗ":"l","ₘ":"m","ₙ":"n","ₒ":"o","ₚ":"p","ᵣ":"r","ₛ":"s","ₜ":"t","ᵤ":"u","ᵥ":"v","ₓ":"x","ᵦ":"β","ᵧ":"γ","ᵨ":"ρ","ᵩ":"ϕ","ᵪ":"χ","⁺":"+","⁻":"-","⁼":"=","⁽":"(","⁾":")","⁰":"0","¹":"1","²":"2","³":"3","⁴":"4","⁵":"5","⁶":"6","⁷":"7","⁸":"8","⁹":"9","ᴬ":"A","ᴮ":"B","ᴰ":"D","ᴱ":"E","ᴳ":"G","ᴴ":"H","ᴵ":"I","ᴶ":"J","ᴷ":"K","ᴸ":"L","ᴹ":"M","ᴺ":"N","ᴼ":"O","ᴾ":"P","ᴿ":"R","ᵀ":"T","ᵁ":"U","ⱽ":"V","ᵂ":"W","ᵃ":"a","ᵇ":"b","ᶜ":"c","ᵈ":"d","ᵉ":"e","ᶠ":"f","ᵍ":"g","ʰ":"h","ⁱ":"i","ʲ":"j","ᵏ":"k","ˡ":"l","ᵐ":"m","ⁿ":"n","ᵒ":"o","ᵖ":"p","ʳ":"r","ˢ":"s","ᵗ":"t","ᵘ":"u","ᵛ":"v","ʷ":"w","ˣ":"x","ʸ":"y","ᶻ":"z","ᵝ":"β","ᵞ":"γ","ᵟ":"δ","ᵠ":"ϕ","ᵡ":"χ","ᶿ":"θ"}),yr={"́":{text:"\\'",math:"\\acute"},"̀":{text:"\\`",math:"\\grave"},"̈":{text:'\\"',math:"\\ddot"},"̃":{text:"\\~",math:"\\tilde"},"̄":{text:"\\=",math:"\\bar"},"̆":{text:"\\u",math:"\\breve"},"̌":{text:"\\v",math:"\\check"},"̂":{text:"\\^",math:"\\hat"},"̇":{text:"\\.",math:"\\dot"},"̊":{text:"\\r",math:"\\mathring"},"̋":{text:"\\H"},"̧":{text:"\\c"}},xr={"á":"á","à":"à","ä":"ä","ǟ":"ǟ","ã":"ã","ā":"ā","ă":"ă","ắ":"ắ","ằ":"ằ","ẵ":"ẵ","ǎ":"ǎ","â":"â","ấ":"ấ","ầ":"ầ","ẫ":"ẫ","ȧ":"ȧ","ǡ":"ǡ","å":"å","ǻ":"ǻ","ḃ":"ḃ","ć":"ć","ḉ":"ḉ","č":"č","ĉ":"ĉ","ċ":"ċ","ç":"ç","ď":"ď","ḋ":"ḋ","ḑ":"ḑ","é":"é","è":"è","ë":"ë","ẽ":"ẽ","ē":"ē","ḗ":"ḗ","ḕ":"ḕ","ĕ":"ĕ","ḝ":"ḝ","ě":"ě","ê":"ê","ế":"ế","ề":"ề","ễ":"ễ","ė":"ė","ȩ":"ȩ","ḟ":"ḟ","ǵ":"ǵ","ḡ":"ḡ","ğ":"ğ","ǧ":"ǧ","ĝ":"ĝ","ġ":"ġ","ģ":"ģ","ḧ":"ḧ","ȟ":"ȟ","ĥ":"ĥ","ḣ":"ḣ","ḩ":"ḩ","í":"í","ì":"ì","ï":"ï","ḯ":"ḯ","ĩ":"ĩ","ī":"ī","ĭ":"ĭ","ǐ":"ǐ","î":"î","ǰ":"ǰ","ĵ":"ĵ","ḱ":"ḱ","ǩ":"ǩ","ķ":"ķ","ĺ":"ĺ","ľ":"ľ","ļ":"ļ","ḿ":"ḿ","ṁ":"ṁ","ń":"ń","ǹ":"ǹ","ñ":"ñ","ň":"ň","ṅ":"ṅ","ņ":"ņ","ó":"ó","ò":"ò","ö":"ö","ȫ":"ȫ","õ":"õ","ṍ":"ṍ","ṏ":"ṏ","ȭ":"ȭ","ō":"ō","ṓ":"ṓ","ṑ":"ṑ","ŏ":"ŏ","ǒ":"ǒ","ô":"ô","ố":"ố","ồ":"ồ","ỗ":"ỗ","ȯ":"ȯ","ȱ":"ȱ","ő":"ő","ṕ":"ṕ","ṗ":"ṗ","ŕ":"ŕ","ř":"ř","ṙ":"ṙ","ŗ":"ŗ","ś":"ś","ṥ":"ṥ","š":"š","ṧ":"ṧ","ŝ":"ŝ","ṡ":"ṡ","ş":"ş","ẗ":"ẗ","ť":"ť","ṫ":"ṫ","ţ":"ţ","ú":"ú","ù":"ù","ü":"ü","ǘ":"ǘ","ǜ":"ǜ","ǖ":"ǖ","ǚ":"ǚ","ũ":"ũ","ṹ":"ṹ","ū":"ū","ṻ":"ṻ","ŭ":"ŭ","ǔ":"ǔ","û":"û","ů":"ů","ű":"ű","ṽ":"ṽ","ẃ":"ẃ","ẁ":"ẁ","ẅ":"ẅ","ŵ":"ŵ","ẇ":"ẇ","ẘ":"ẘ","ẍ":"ẍ","ẋ":"ẋ","ý":"ý","ỳ":"ỳ","ÿ":"ÿ","ỹ":"ỹ","ȳ":"ȳ","ŷ":"ŷ","ẏ":"ẏ","ẙ":"ẙ","ź":"ź","ž":"ž","ẑ":"ẑ","ż":"ż","Á":"Á","À":"À","Ä":"Ä","Ǟ":"Ǟ","Ã":"Ã","Ā":"Ā","Ă":"Ă","Ắ":"Ắ","Ằ":"Ằ","Ẵ":"Ẵ","Ǎ":"Ǎ","Â":"Â","Ấ":"Ấ","Ầ":"Ầ","Ẫ":"Ẫ","Ȧ":"Ȧ","Ǡ":"Ǡ","Å":"Å","Ǻ":"Ǻ","Ḃ":"Ḃ","Ć":"Ć","Ḉ":"Ḉ","Č":"Č","Ĉ":"Ĉ","Ċ":"Ċ","Ç":"Ç","Ď":"Ď","Ḋ":"Ḋ","Ḑ":"Ḑ","É":"É","È":"È","Ë":"Ë","Ẽ":"Ẽ","Ē":"Ē","Ḗ":"Ḗ","Ḕ":"Ḕ","Ĕ":"Ĕ","Ḝ":"Ḝ","Ě":"Ě","Ê":"Ê","Ế":"Ế","Ề":"Ề","Ễ":"Ễ","Ė":"Ė","Ȩ":"Ȩ","Ḟ":"Ḟ","Ǵ":"Ǵ","Ḡ":"Ḡ","Ğ":"Ğ","Ǧ":"Ǧ","Ĝ":"Ĝ","Ġ":"Ġ","Ģ":"Ģ","Ḧ":"Ḧ","Ȟ":"Ȟ","Ĥ":"Ĥ","Ḣ":"Ḣ","Ḩ":"Ḩ","Í":"Í","Ì":"Ì","Ï":"Ï","Ḯ":"Ḯ","Ĩ":"Ĩ","Ī":"Ī","Ĭ":"Ĭ","Ǐ":"Ǐ","Î":"Î","İ":"İ","Ĵ":"Ĵ","Ḱ":"Ḱ","Ǩ":"Ǩ","Ķ":"Ķ","Ĺ":"Ĺ","Ľ":"Ľ","Ļ":"Ļ","Ḿ":"Ḿ","Ṁ":"Ṁ","Ń":"Ń","Ǹ":"Ǹ","Ñ":"Ñ","Ň":"Ň","Ṅ":"Ṅ","Ņ":"Ņ","Ó":"Ó","Ò":"Ò","Ö":"Ö","Ȫ":"Ȫ","Õ":"Õ","Ṍ":"Ṍ","Ṏ":"Ṏ","Ȭ":"Ȭ","Ō":"Ō","Ṓ":"Ṓ","Ṑ":"Ṑ","Ŏ":"Ŏ","Ǒ":"Ǒ","Ô":"Ô","Ố":"Ố","Ồ":"Ồ","Ỗ":"Ỗ","Ȯ":"Ȯ","Ȱ":"Ȱ","Ő":"Ő","Ṕ":"Ṕ","Ṗ":"Ṗ","Ŕ":"Ŕ","Ř":"Ř","Ṙ":"Ṙ","Ŗ":"Ŗ","Ś":"Ś","Ṥ":"Ṥ","Š":"Š","Ṧ":"Ṧ","Ŝ":"Ŝ","Ṡ":"Ṡ","Ş":"Ş","Ť":"Ť","Ṫ":"Ṫ","Ţ":"Ţ","Ú":"Ú","Ù":"Ù","Ü":"Ü","Ǘ":"Ǘ","Ǜ":"Ǜ","Ǖ":"Ǖ","Ǚ":"Ǚ","Ũ":"Ũ","Ṹ":"Ṹ","Ū":"Ū","Ṻ":"Ṻ","Ŭ":"Ŭ","Ǔ":"Ǔ","Û":"Û","Ů":"Ů","Ű":"Ű","Ṽ":"Ṽ","Ẃ":"Ẃ","Ẁ":"Ẁ","Ẅ":"Ẅ","Ŵ":"Ŵ","Ẇ":"Ẇ","Ẍ":"Ẍ","Ẋ":"Ẋ","Ý":"Ý","Ỳ":"Ỳ","Ÿ":"Ÿ","Ỹ":"Ỹ","Ȳ":"Ȳ","Ŷ":"Ŷ","Ẏ":"Ẏ","Ź":"Ź","Ž":"Ž","Ẑ":"Ẑ","Ż":"Ż","ά":"ά","ὰ":"ὰ","ᾱ":"ᾱ","ᾰ":"ᾰ","έ":"έ","ὲ":"ὲ","ή":"ή","ὴ":"ὴ","ί":"ί","ὶ":"ὶ","ϊ":"ϊ","ΐ":"ΐ","ῒ":"ῒ","ῑ":"ῑ","ῐ":"ῐ","ό":"ό","ὸ":"ὸ","ύ":"ύ","ὺ":"ὺ","ϋ":"ϋ","ΰ":"ΰ","ῢ":"ῢ","ῡ":"ῡ","ῠ":"ῠ","ώ":"ώ","ὼ":"ὼ","Ύ":"Ύ","Ὺ":"Ὺ","Ϋ":"Ϋ","Ῡ":"Ῡ","Ῠ":"Ῠ","Ώ":"Ώ","Ὼ":"Ὼ"};class wr{constructor(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new gr(e,t,this.mode),this.settings=t,this.leftrightDepth=0}expect(e,t){if(void 0===t&&(t=!0),this.fetch().text!==e)throw new z("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()}consume(){this.nextToken=null}fetch(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var t=this.nextToken,e=(this.consume(),this.gullet.pushToken(new y0("}")),this.gullet.pushTokens(e),this.parseExpression(!1));return this.expect("}"),this.nextToken=t,e}parseExpression(e,t){for(var r=[];;){"math"===this.mode&&this.consumeSpaces();var n=this.fetch();if(-1!==wr.endOfExpression.indexOf(n.text))break;if(t&&n.text===t)break;if(e&&or[n.text]&&or[n.text].infix)break;if(!(n=this.parseAtom(t)))break;"internal"!==n.type&&r.push(n)}return"text"===this.mode&&this.formLigatures(r),this.handleInfixNodes(r)}handleInfixNodes(t){let r,n=-1;for(let e=0;e{"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.katex=t():e.katex=t()})("undefined"!=typeof self?self:this,function(){{var Jt={d:function(e,t){for(var r in t)Jt.o(t,r)&&!Jt.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},Qt={};Jt.d(Qt,{default:function(){return gr}});class fr{constructor(e,t){this.name=void 0,this.position=void 0,this.length=void 0,this.rawMessage=void 0;let r,n,a="KaTeX parse error: "+e;var i,o,s=t&&t.loc;return s&&s.start<=s.end&&(o=s.lexer.input,r=s.start,n=s.end,r===o.length?a+=" at end of input: ":a+=" at position "+(r+1)+": ",i=o.slice(r,n).replace(/[^]/g,"$&̲"),s=15":">","<":"<",'"':""","'":"'"},E=/[&><"']/g;var bt={contains:function(e,t){return-1!==e.indexOf(t)},deflt:function(e,t){return void 0===e?t:e},escape:function(e){return String(e).replace(E,e=>O[e])},hyphenate:function(e){return e.replace(H,"-$1").toLowerCase()},getBaseElem:e0,isCharacterBox:function(e){return"mathord"===(e=e0(e)).type||"textord"===e.type||"atom"===e.type},protocolFromUrl:function(e){return(e=/^[\x00-\x20]*([^\\/#?]*?)(:|*58|*3a|&colon)/i.exec(e))?":"===e[2]&&/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(e[1])?e[1].toLowerCase():null:"_relative"}};let n={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:e=>"#"+e},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:(e,t)=>(t.push(e),t)},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:e=>Math.max(0,e),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:e=>Math.max(0,e),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:e=>Math.max(0,e),cli:"-e, --max-expand ",cliProcessor:e=>"Infinity"===e?1/0:parseInt(e)},globalGroup:{type:"boolean",cli:!1}};class br{constructor(e){for(var t in this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{},n){var r;n.hasOwnProperty(t)&&(r=n[t],this[t]=void 0!==e[t]?r.processor?r.processor(e[t]):e[t]:(e=>{if(e.default)return e.default;if(e=e.type,"string"!=typeof(e=Array.isArray(e)?e[0]:e))return e.enum[0];switch(e){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}})(r))}}reportNonstrict(e,t,r){let n=this.strict;if((n="function"==typeof n?n(e,t,r):n)&&"ignore"!==n){if(!0===n||"error"===n)throw new ft("LaTeX-incompatible input and strict mode is set to 'error': "+t+" ["+e+"]",r);"warn"===n?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+n+"': "+t+" ["+e+"]")}}useStrictBehavior(e,t,r){let n=this.strict;if("function"==typeof n)try{n=n(e,t,r)}catch(e){n="error"}return!(!n||"ignore"===n||!0!==n&&"error"!==n&&("warn"===n?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+n+"': "+t+" ["+e+"]"),1))}isTrusted(e){if(e.url&&!e.protocol){var t=bt.protocolFromUrl(e.url);if(null==t)return!1;e.protocol=t}return t="function"==typeof this.trust?this.trust(e):this.trust,Boolean(t)}}class yr{constructor(e,t,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=t,this.cramped=r}sup(){return e[L[this.id]]}sub(){return e[V[this.id]]}fracNum(){return e[F[this.id]]}fracDen(){return e[G[this.id]]}cramp(){return e[U[this.id]]}text(){return e[Y[this.id]]}isTight(){return 2<=this.size}}let e=[new yr(0,0,!1),new yr(1,0,!0),new yr(2,1,!1),new yr(3,1,!0),new yr(4,2,!1),new yr(5,2,!0),new yr(6,3,!1),new yr(7,3,!0)],L=[4,5,4,5,6,7,6,7],V=[5,5,5,5,7,7,7,7],F=[2,3,4,5,6,7,6,7],G=[3,3,5,5,7,7,7,7],U=[1,1,3,3,5,5,7,7],Y=[0,1,2,3,2,3,2,3];var yt={DISPLAY:e[0],TEXT:e[2],SCRIPT:e[4],SCRIPTSCRIPT:e[6]};let l=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}],r=[];function t0(t){for(let e=0;e=r[e]&&t<=r[e+1])return 1}l.forEach(e=>e.blocks.forEach(e=>r.push(...e)));let X={doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"};class xr{constructor(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return bt.contains(this.classes,e)}toNode(){var t=document.createDocumentFragment();for(let e=0;ee.toText()).join("")}}var xt={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}};let a={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},W={"Å":"A","Ð":"D","Þ":"o","å":"a","ð":"d","þ":"o","А":"A","Б":"B","В":"B","Г":"F","Д":"A","Е":"E","Ж":"K","З":"3","И":"N","Й":"N","К":"K","Л":"N","М":"M","Н":"H","О":"O","П":"N","Р":"P","С":"C","Т":"T","У":"y","Ф":"O","Х":"X","Ц":"U","Ч":"h","Ш":"W","Щ":"W","Ъ":"B","Ы":"X","Ь":"B","Э":"3","Ю":"X","Я":"R","а":"a","б":"b","в":"a","г":"r","д":"y","е":"e","ж":"m","з":"e","и":"n","й":"n","к":"n","л":"n","м":"m","н":"n","о":"o","п":"n","р":"p","с":"c","т":"o","у":"y","ф":"b","х":"x","ц":"n","ч":"n","ш":"w","щ":"w","ъ":"a","ы":"m","ь":"a","э":"e","ю":"m","я":"r"};function r0(e,t,r){if(!xt[t])throw new Error("Font metrics not found for font: "+t+".");let n=e.charCodeAt(0),a=xt[t][n];if(!a&&e[0]in W&&(n=W[e[0]].charCodeAt(0),a=xt[t][n]),a||"text"!==r||t0(n)&&(a=xt[t][77]),a)return{depth:a[0],height:a[1],italic:a[2],skew:a[3],width:a[4]}}function n0(e,t){return t.size<2?e:j[e-1][t.size-1]}let i={},j=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],_=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488];class wr{constructor(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||wr.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=_[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}extend(e){var t,r={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(t in e)e.hasOwnProperty(t)&&(r[t]=e[t]);return new wr(r)}havingStyle(e){return this.style===e?this:this.extend({style:e,size:n0(this.textSize,e)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(e){return this.size===e&&this.textSize===e?this:this.extend({style:this.style.text(),size:e,textSize:e,sizeMultiplier:_[e-1]})}havingBaseStyle(e){e=e||this.style.text();var t=n0(wr.BASESIZE,e);return this.size===t&&this.textSize===wr.BASESIZE&&this.style===e?this:this.extend({style:e,size:t})}havingBaseSizing(){let e;switch(this.style.id){case 4:case 5:e=3;break;case 6:case 7:e=1;break;default:e=6}return this.extend({style:this.style.text(),size:e})}withColor(e){return this.extend({color:e})}withPhantom(){return this.extend({phantom:!0})}withFont(e){return this.extend({font:e})}withTextFontFamily(e){return this.extend({fontFamily:e,font:""})}withTextFontWeight(e){return this.extend({fontWeight:e,font:""})}withTextFontShape(e){return this.extend({fontShape:e,font:""})}sizingClasses(e){return e.size!==this.size?["sizing","reset-size"+e.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==wr.BASESIZE?["sizing","reset-size"+this.size,"size"+wr.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=(e=>{var t=5<=e?0:3<=e?1:2;if(!i[t]){var r,n=i[t]={cssEmPerMu:a.quad[t]/18};for(r in a)a.hasOwnProperty(r)&&(n[r]=a[r][t])}return i[t]})(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}}wr.BASESIZE=6;var a0=wr;function i0(e){return(e="string"!=typeof e?e.unit:e)in o||e in $||"ex"===e}function wt(e,t){let r;if(e.unit in o)r=o[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if("mu"===e.unit)r=t.fontMetrics().cssEmPerMu;else{var n=t.style.isTight()?t.havingStyle(t.style.text()):t;if("ex"===e.unit)r=n.fontMetrics().xHeight;else{if("em"!==e.unit)throw new ft("Invalid unit: '"+e.unit+"'");r=n.fontMetrics().quad}n!==t&&(r*=n.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*r,t.maxSize)}function o0(e){return e.filter(e=>e).join(" ")}function s0(e,t,r){this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},t&&(t.style.isTight()&&this.classes.push("mtight"),e=t.getColor())&&(this.style.color=e)}function l0(e){var t,r,n=document.createElement(e);for(t in n.className=o0(this.classes),this.style)this.style.hasOwnProperty(t)&&(n.style[t]=this.style[t]);for(r in this.attributes)this.attributes.hasOwnProperty(r)&&n.setAttribute(r,this.attributes[r]);for(let e=0;e";for(let e=0;e"}let o={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},$={ex:!0,em:!0,mu:!0},D=function(e){return+e.toFixed(4)+"em"},Z=/[\s"'>/=\x00-\x1f]/;class vr{constructor(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,s0.call(this,e,r,n),this.children=t||[]}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return bt.contains(this.classes,e)}toNode(){return l0.call(this,"span")}toMarkup(){return h0.call(this,"span")}}class kr{constructor(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,s0.call(this,t,n),this.children=r||[],this.setAttribute("href",e)}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return bt.contains(this.classes,e)}toNode(){return l0.call(this,"a")}toMarkup(){return h0.call(this,"a")}}class Sr{constructor(e,t,r){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=t,this.src=e,this.classes=["mord"],this.style=r}hasClass(e){return bt.contains(this.classes,e)}toNode(){var e,t=document.createElement("img");for(e in t.src=this.src,t.alt=this.alt,t.className="mord",this.style)this.style.hasOwnProperty(e)&&(t.style[e]=this.style[e]);return t}toMarkup(){let e=' "}}let K={"î":"ı̂","ï":"ı̈","í":"ı́","ì":"ı̀"};class jt{constructor(e,t,r,n,a,i,o,s){this.text=void 0,this.height=void 0,this.depth=void 0,this.italic=void 0,this.skew=void 0,this.width=void 0,this.maxFontSize=void 0,this.classes=void 0,this.style=void 0,this.text=e,this.height=t||0,this.depth=r||0,this.italic=n||0,this.skew=a||0,this.width=i||0,this.classes=o||[],this.style=s||{},this.maxFontSize=0,(e=(t=>{for(let e=0;e=n[0]&&t<=n[1])return r.name}}return null})(this.text.charCodeAt(0)))&&this.classes.push(e+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=K[this.text])}hasClass(e){return bt.contains(this.classes,e)}toNode(){let e=document.createTextNode(this.text),t=null;for(var r in 0")+a+"":a}}class Mr{constructor(e,t){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=t||{}}toNode(){var e,t=document.createElementNS("http://www.w3.org/2000/svg","svg");for(e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);for(let e=0;e";for(let e=0;e"}}class zr{constructor(e,t){this.pathName=void 0,this.alternate=void 0,this.pathName=e,this.alternate=t}toNode(){var e=document.createElementNS("http://www.w3.org/2000/svg","path");return this.alternate?e.setAttribute("d",this.alternate):e.setAttribute("d",X[this.pathName]),e}toMarkup(){return this.alternate?' ':' '}}class Ar{constructor(e){this.attributes=void 0,this.attributes=e||{}}toNode(){var e,t=document.createElementNS("http://www.w3.org/2000/svg","line");for(e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);return t}toMarkup(){let e=" "}}function m0(e){if(e instanceof jt)return e;throw new Error("Expected symbolNode but got "+String(e)+".")}let J={bin:1,close:1,inner:1,open:1,punct:1,rel:1},Q={"accent-token":1,mathord:1,"op-token":1,spacing:1,textord:1},s={math:{},text:{}};var vt=s;function kt(e,t,r,n,a,i){s[e][a]={font:t,group:r,replace:n},i&&n&&(s[e][n]=s[e][a])}var St="math",Mt="text",zt="main",At="ams",Tt="accent-token",Bt="bin",Ct="close",c0="inner",Nt="mathord",qt="op-token",It="open",p0="punct",Rt="rel",Ht="spacing",Ot="textord";kt(St,zt,Rt,"≡","\\equiv",!0),kt(St,zt,Rt,"≺","\\prec",!0),kt(St,zt,Rt,"≻","\\succ",!0),kt(St,zt,Rt,"∼","\\sim",!0),kt(St,zt,Rt,"⊥","\\perp"),kt(St,zt,Rt,"⪯","\\preceq",!0),kt(St,zt,Rt,"⪰","\\succeq",!0),kt(St,zt,Rt,"≃","\\simeq",!0),kt(St,zt,Rt,"∣","\\mid",!0),kt(St,zt,Rt,"≪","\\ll",!0),kt(St,zt,Rt,"≫","\\gg",!0),kt(St,zt,Rt,"≍","\\asymp",!0),kt(St,zt,Rt,"∥","\\parallel"),kt(St,zt,Rt,"⋈","\\bowtie",!0),kt(St,zt,Rt,"⌣","\\smile",!0),kt(St,zt,Rt,"⊑","\\sqsubseteq",!0),kt(St,zt,Rt,"⊒","\\sqsupseteq",!0),kt(St,zt,Rt,"≐","\\doteq",!0),kt(St,zt,Rt,"⌢","\\frown",!0),kt(St,zt,Rt,"∋","\\ni",!0),kt(St,zt,Rt,"∝","\\propto",!0),kt(St,zt,Rt,"⊢","\\vdash",!0),kt(St,zt,Rt,"⊣","\\dashv",!0),kt(St,zt,Rt,"∋","\\owns"),kt(St,zt,p0,".","\\ldotp"),kt(St,zt,p0,"⋅","\\cdotp"),kt(St,zt,Ot,"#","\\#"),kt(Mt,zt,Ot,"#","\\#"),kt(St,zt,Ot,"&","\\&"),kt(Mt,zt,Ot,"&","\\&"),kt(St,zt,Ot,"ℵ","\\aleph",!0),kt(St,zt,Ot,"∀","\\forall",!0),kt(St,zt,Ot,"ℏ","\\hbar",!0),kt(St,zt,Ot,"∃","\\exists",!0),kt(St,zt,Ot,"∇","\\nabla",!0),kt(St,zt,Ot,"♭","\\flat",!0),kt(St,zt,Ot,"ℓ","\\ell",!0),kt(St,zt,Ot,"♮","\\natural",!0),kt(St,zt,Ot,"♣","\\clubsuit",!0),kt(St,zt,Ot,"℘","\\wp",!0),kt(St,zt,Ot,"♯","\\sharp",!0),kt(St,zt,Ot,"♢","\\diamondsuit",!0),kt(St,zt,Ot,"ℜ","\\Re",!0),kt(St,zt,Ot,"♡","\\heartsuit",!0),kt(St,zt,Ot,"ℑ","\\Im",!0),kt(St,zt,Ot,"♠","\\spadesuit",!0),kt(St,zt,Ot,"§","\\S",!0),kt(Mt,zt,Ot,"§","\\S"),kt(St,zt,Ot,"¶","\\P",!0),kt(Mt,zt,Ot,"¶","\\P"),kt(St,zt,Ot,"†","\\dag"),kt(Mt,zt,Ot,"†","\\dag"),kt(Mt,zt,Ot,"†","\\textdagger"),kt(St,zt,Ot,"‡","\\ddag"),kt(Mt,zt,Ot,"‡","\\ddag"),kt(Mt,zt,Ot,"‡","\\textdaggerdbl"),kt(St,zt,Ct,"⎱","\\rmoustache",!0),kt(St,zt,It,"⎰","\\lmoustache",!0),kt(St,zt,Ct,"⟯","\\rgroup",!0),kt(St,zt,It,"⟮","\\lgroup",!0),kt(St,zt,Bt,"∓","\\mp",!0),kt(St,zt,Bt,"⊖","\\ominus",!0),kt(St,zt,Bt,"⊎","\\uplus",!0),kt(St,zt,Bt,"⊓","\\sqcap",!0),kt(St,zt,Bt,"∗","\\ast"),kt(St,zt,Bt,"⊔","\\sqcup",!0),kt(St,zt,Bt,"◯","\\bigcirc",!0),kt(St,zt,Bt,"∙","\\bullet",!0),kt(St,zt,Bt,"‡","\\ddagger"),kt(St,zt,Bt,"≀","\\wr",!0),kt(St,zt,Bt,"⨿","\\amalg"),kt(St,zt,Bt,"&","\\And"),kt(St,zt,Rt,"⟵","\\longleftarrow",!0),kt(St,zt,Rt,"⇐","\\Leftarrow",!0),kt(St,zt,Rt,"⟸","\\Longleftarrow",!0),kt(St,zt,Rt,"⟶","\\longrightarrow",!0),kt(St,zt,Rt,"⇒","\\Rightarrow",!0),kt(St,zt,Rt,"⟹","\\Longrightarrow",!0),kt(St,zt,Rt,"↔","\\leftrightarrow",!0),kt(St,zt,Rt,"⟷","\\longleftrightarrow",!0),kt(St,zt,Rt,"⇔","\\Leftrightarrow",!0),kt(St,zt,Rt,"⟺","\\Longleftrightarrow",!0),kt(St,zt,Rt,"↦","\\mapsto",!0),kt(St,zt,Rt,"⟼","\\longmapsto",!0),kt(St,zt,Rt,"↗","\\nearrow",!0),kt(St,zt,Rt,"↩","\\hookleftarrow",!0),kt(St,zt,Rt,"↪","\\hookrightarrow",!0),kt(St,zt,Rt,"↘","\\searrow",!0),kt(St,zt,Rt,"↼","\\leftharpoonup",!0),kt(St,zt,Rt,"⇀","\\rightharpoonup",!0),kt(St,zt,Rt,"↙","\\swarrow",!0),kt(St,zt,Rt,"↽","\\leftharpoondown",!0),kt(St,zt,Rt,"⇁","\\rightharpoondown",!0),kt(St,zt,Rt,"↖","\\nwarrow",!0),kt(St,zt,Rt,"⇌","\\rightleftharpoons",!0),kt(St,At,Rt,"≮","\\nless",!0),kt(St,At,Rt,"","\\@nleqslant"),kt(St,At,Rt,"","\\@nleqq"),kt(St,At,Rt,"⪇","\\lneq",!0),kt(St,At,Rt,"≨","\\lneqq",!0),kt(St,At,Rt,"","\\@lvertneqq"),kt(St,At,Rt,"⋦","\\lnsim",!0),kt(St,At,Rt,"⪉","\\lnapprox",!0),kt(St,At,Rt,"⊀","\\nprec",!0),kt(St,At,Rt,"⋠","\\npreceq",!0),kt(St,At,Rt,"⋨","\\precnsim",!0),kt(St,At,Rt,"⪹","\\precnapprox",!0),kt(St,At,Rt,"≁","\\nsim",!0),kt(St,At,Rt,"","\\@nshortmid"),kt(St,At,Rt,"∤","\\nmid",!0),kt(St,At,Rt,"⊬","\\nvdash",!0),kt(St,At,Rt,"⊭","\\nvDash",!0),kt(St,At,Rt,"⋪","\\ntriangleleft"),kt(St,At,Rt,"⋬","\\ntrianglelefteq",!0),kt(St,At,Rt,"⊊","\\subsetneq",!0),kt(St,At,Rt,"","\\@varsubsetneq"),kt(St,At,Rt,"⫋","\\subsetneqq",!0),kt(St,At,Rt,"","\\@varsubsetneqq"),kt(St,At,Rt,"≯","\\ngtr",!0),kt(St,At,Rt,"","\\@ngeqslant"),kt(St,At,Rt,"","\\@ngeqq"),kt(St,At,Rt,"⪈","\\gneq",!0),kt(St,At,Rt,"≩","\\gneqq",!0),kt(St,At,Rt,"","\\@gvertneqq"),kt(St,At,Rt,"⋧","\\gnsim",!0),kt(St,At,Rt,"⪊","\\gnapprox",!0),kt(St,At,Rt,"⊁","\\nsucc",!0),kt(St,At,Rt,"⋡","\\nsucceq",!0),kt(St,At,Rt,"⋩","\\succnsim",!0),kt(St,At,Rt,"⪺","\\succnapprox",!0),kt(St,At,Rt,"≆","\\ncong",!0),kt(St,At,Rt,"","\\@nshortparallel"),kt(St,At,Rt,"∦","\\nparallel",!0),kt(St,At,Rt,"⊯","\\nVDash",!0),kt(St,At,Rt,"⋫","\\ntriangleright"),kt(St,At,Rt,"⋭","\\ntrianglerighteq",!0),kt(St,At,Rt,"","\\@nsupseteqq"),kt(St,At,Rt,"⊋","\\supsetneq",!0),kt(St,At,Rt,"","\\@varsupsetneq"),kt(St,At,Rt,"⫌","\\supsetneqq",!0),kt(St,At,Rt,"","\\@varsupsetneqq"),kt(St,At,Rt,"⊮","\\nVdash",!0),kt(St,At,Rt,"⪵","\\precneqq",!0),kt(St,At,Rt,"⪶","\\succneqq",!0),kt(St,At,Rt,"","\\@nsubseteqq"),kt(St,At,Bt,"⊴","\\unlhd"),kt(St,At,Bt,"⊵","\\unrhd"),kt(St,At,Rt,"↚","\\nleftarrow",!0),kt(St,At,Rt,"↛","\\nrightarrow",!0),kt(St,At,Rt,"⇍","\\nLeftarrow",!0),kt(St,At,Rt,"⇏","\\nRightarrow",!0),kt(St,At,Rt,"↮","\\nleftrightarrow",!0),kt(St,At,Rt,"⇎","\\nLeftrightarrow",!0),kt(St,At,Rt,"△","\\vartriangle"),kt(St,At,Ot,"ℏ","\\hslash"),kt(St,At,Ot,"▽","\\triangledown"),kt(St,At,Ot,"◊","\\lozenge"),kt(St,At,Ot,"Ⓢ","\\circledS"),kt(St,At,Ot,"®","\\circledR"),kt(Mt,At,Ot,"®","\\circledR"),kt(St,At,Ot,"∡","\\measuredangle",!0),kt(St,At,Ot,"∄","\\nexists"),kt(St,At,Ot,"℧","\\mho"),kt(St,At,Ot,"Ⅎ","\\Finv",!0),kt(St,At,Ot,"⅁","\\Game",!0),kt(St,At,Ot,"‵","\\backprime"),kt(St,At,Ot,"▲","\\blacktriangle"),kt(St,At,Ot,"▼","\\blacktriangledown"),kt(St,At,Ot,"■","\\blacksquare"),kt(St,At,Ot,"⧫","\\blacklozenge"),kt(St,At,Ot,"★","\\bigstar"),kt(St,At,Ot,"∢","\\sphericalangle",!0),kt(St,At,Ot,"∁","\\complement",!0),kt(St,At,Ot,"ð","\\eth",!0),kt(Mt,zt,Ot,"ð","ð"),kt(St,At,Ot,"╱","\\diagup"),kt(St,At,Ot,"╲","\\diagdown"),kt(St,At,Ot,"□","\\square"),kt(St,At,Ot,"□","\\Box"),kt(St,At,Ot,"◊","\\Diamond"),kt(St,At,Ot,"¥","\\yen",!0),kt(Mt,At,Ot,"¥","\\yen",!0),kt(St,At,Ot,"✓","\\checkmark",!0),kt(Mt,At,Ot,"✓","\\checkmark"),kt(St,At,Ot,"ℶ","\\beth",!0),kt(St,At,Ot,"ℸ","\\daleth",!0),kt(St,At,Ot,"ℷ","\\gimel",!0),kt(St,At,Ot,"ϝ","\\digamma",!0),kt(St,At,Ot,"ϰ","\\varkappa"),kt(St,At,It,"┌","\\@ulcorner",!0),kt(St,At,Ct,"┐","\\@urcorner",!0),kt(St,At,It,"└","\\@llcorner",!0),kt(St,At,Ct,"┘","\\@lrcorner",!0),kt(St,At,Rt,"≦","\\leqq",!0),kt(St,At,Rt,"⩽","\\leqslant",!0),kt(St,At,Rt,"⪕","\\eqslantless",!0),kt(St,At,Rt,"≲","\\lesssim",!0),kt(St,At,Rt,"⪅","\\lessapprox",!0),kt(St,At,Rt,"≊","\\approxeq",!0),kt(St,At,Bt,"⋖","\\lessdot"),kt(St,At,Rt,"⋘","\\lll",!0),kt(St,At,Rt,"≶","\\lessgtr",!0),kt(St,At,Rt,"⋚","\\lesseqgtr",!0),kt(St,At,Rt,"⪋","\\lesseqqgtr",!0),kt(St,At,Rt,"≑","\\doteqdot"),kt(St,At,Rt,"≓","\\risingdotseq",!0),kt(St,At,Rt,"≒","\\fallingdotseq",!0),kt(St,At,Rt,"∽","\\backsim",!0),kt(St,At,Rt,"⋍","\\backsimeq",!0),kt(St,At,Rt,"⫅","\\subseteqq",!0),kt(St,At,Rt,"⋐","\\Subset",!0),kt(St,At,Rt,"⊏","\\sqsubset",!0),kt(St,At,Rt,"≼","\\preccurlyeq",!0),kt(St,At,Rt,"⋞","\\curlyeqprec",!0),kt(St,At,Rt,"≾","\\precsim",!0),kt(St,At,Rt,"⪷","\\precapprox",!0),kt(St,At,Rt,"⊲","\\vartriangleleft"),kt(St,At,Rt,"⊴","\\trianglelefteq"),kt(St,At,Rt,"⊨","\\vDash",!0),kt(St,At,Rt,"⊪","\\Vvdash",!0),kt(St,At,Rt,"⌣","\\smallsmile"),kt(St,At,Rt,"⌢","\\smallfrown"),kt(St,At,Rt,"≏","\\bumpeq",!0),kt(St,At,Rt,"≎","\\Bumpeq",!0),kt(St,At,Rt,"≧","\\geqq",!0),kt(St,At,Rt,"⩾","\\geqslant",!0),kt(St,At,Rt,"⪖","\\eqslantgtr",!0),kt(St,At,Rt,"≳","\\gtrsim",!0),kt(St,At,Rt,"⪆","\\gtrapprox",!0),kt(St,At,Bt,"⋗","\\gtrdot"),kt(St,At,Rt,"⋙","\\ggg",!0),kt(St,At,Rt,"≷","\\gtrless",!0),kt(St,At,Rt,"⋛","\\gtreqless",!0),kt(St,At,Rt,"⪌","\\gtreqqless",!0),kt(St,At,Rt,"≖","\\eqcirc",!0),kt(St,At,Rt,"≗","\\circeq",!0),kt(St,At,Rt,"≜","\\triangleq",!0),kt(St,At,Rt,"∼","\\thicksim"),kt(St,At,Rt,"≈","\\thickapprox"),kt(St,At,Rt,"⫆","\\supseteqq",!0),kt(St,At,Rt,"⋑","\\Supset",!0),kt(St,At,Rt,"⊐","\\sqsupset",!0),kt(St,At,Rt,"≽","\\succcurlyeq",!0),kt(St,At,Rt,"⋟","\\curlyeqsucc",!0),kt(St,At,Rt,"≿","\\succsim",!0),kt(St,At,Rt,"⪸","\\succapprox",!0),kt(St,At,Rt,"⊳","\\vartriangleright"),kt(St,At,Rt,"⊵","\\trianglerighteq"),kt(St,At,Rt,"⊩","\\Vdash",!0),kt(St,At,Rt,"∣","\\shortmid"),kt(St,At,Rt,"∥","\\shortparallel"),kt(St,At,Rt,"≬","\\between",!0),kt(St,At,Rt,"⋔","\\pitchfork",!0),kt(St,At,Rt,"∝","\\varpropto"),kt(St,At,Rt,"◀","\\blacktriangleleft"),kt(St,At,Rt,"∴","\\therefore",!0),kt(St,At,Rt,"∍","\\backepsilon"),kt(St,At,Rt,"▶","\\blacktriangleright"),kt(St,At,Rt,"∵","\\because",!0),kt(St,At,Rt,"⋘","\\llless"),kt(St,At,Rt,"⋙","\\gggtr"),kt(St,At,Bt,"⊲","\\lhd"),kt(St,At,Bt,"⊳","\\rhd"),kt(St,At,Rt,"≂","\\eqsim",!0),kt(St,zt,Rt,"⋈","\\Join"),kt(St,At,Rt,"≑","\\Doteq",!0),kt(St,At,Bt,"∔","\\dotplus",!0),kt(St,At,Bt,"∖","\\smallsetminus"),kt(St,At,Bt,"⋒","\\Cap",!0),kt(St,At,Bt,"⋓","\\Cup",!0),kt(St,At,Bt,"⩞","\\doublebarwedge",!0),kt(St,At,Bt,"⊟","\\boxminus",!0),kt(St,At,Bt,"⊞","\\boxplus",!0),kt(St,At,Bt,"⋇","\\divideontimes",!0),kt(St,At,Bt,"⋉","\\ltimes",!0),kt(St,At,Bt,"⋊","\\rtimes",!0),kt(St,At,Bt,"⋋","\\leftthreetimes",!0),kt(St,At,Bt,"⋌","\\rightthreetimes",!0),kt(St,At,Bt,"⋏","\\curlywedge",!0),kt(St,At,Bt,"⋎","\\curlyvee",!0),kt(St,At,Bt,"⊝","\\circleddash",!0),kt(St,At,Bt,"⊛","\\circledast",!0),kt(St,At,Bt,"⋅","\\centerdot"),kt(St,At,Bt,"⊺","\\intercal",!0),kt(St,At,Bt,"⋒","\\doublecap"),kt(St,At,Bt,"⋓","\\doublecup"),kt(St,At,Bt,"⊠","\\boxtimes",!0),kt(St,At,Rt,"⇢","\\dashrightarrow",!0),kt(St,At,Rt,"⇠","\\dashleftarrow",!0),kt(St,At,Rt,"⇇","\\leftleftarrows",!0),kt(St,At,Rt,"⇆","\\leftrightarrows",!0),kt(St,At,Rt,"⇚","\\Lleftarrow",!0),kt(St,At,Rt,"↞","\\twoheadleftarrow",!0),kt(St,At,Rt,"↢","\\leftarrowtail",!0),kt(St,At,Rt,"↫","\\looparrowleft",!0),kt(St,At,Rt,"⇋","\\leftrightharpoons",!0),kt(St,At,Rt,"↶","\\curvearrowleft",!0),kt(St,At,Rt,"↺","\\circlearrowleft",!0),kt(St,At,Rt,"↰","\\Lsh",!0),kt(St,At,Rt,"⇈","\\upuparrows",!0),kt(St,At,Rt,"↿","\\upharpoonleft",!0),kt(St,At,Rt,"⇃","\\downharpoonleft",!0),kt(St,zt,Rt,"⊶","\\origof",!0),kt(St,zt,Rt,"⊷","\\imageof",!0),kt(St,At,Rt,"⊸","\\multimap",!0),kt(St,At,Rt,"↭","\\leftrightsquigarrow",!0),kt(St,At,Rt,"⇉","\\rightrightarrows",!0),kt(St,At,Rt,"⇄","\\rightleftarrows",!0),kt(St,At,Rt,"↠","\\twoheadrightarrow",!0),kt(St,At,Rt,"↣","\\rightarrowtail",!0),kt(St,At,Rt,"↬","\\looparrowright",!0),kt(St,At,Rt,"↷","\\curvearrowright",!0),kt(St,At,Rt,"↻","\\circlearrowright",!0),kt(St,At,Rt,"↱","\\Rsh",!0),kt(St,At,Rt,"⇊","\\downdownarrows",!0),kt(St,At,Rt,"↾","\\upharpoonright",!0),kt(St,At,Rt,"⇂","\\downharpoonright",!0),kt(St,At,Rt,"⇝","\\rightsquigarrow",!0),kt(St,At,Rt,"⇝","\\leadsto"),kt(St,At,Rt,"⇛","\\Rrightarrow",!0),kt(St,At,Rt,"↾","\\restriction"),kt(St,zt,Ot,"‘","`"),kt(St,zt,Ot,"$","\\$"),kt(Mt,zt,Ot,"$","\\$"),kt(Mt,zt,Ot,"$","\\textdollar"),kt(St,zt,Ot,"%","\\%"),kt(Mt,zt,Ot,"%","\\%"),kt(St,zt,Ot,"_","\\_"),kt(Mt,zt,Ot,"_","\\_"),kt(Mt,zt,Ot,"_","\\textunderscore"),kt(St,zt,Ot,"∠","\\angle",!0),kt(St,zt,Ot,"∞","\\infty",!0),kt(St,zt,Ot,"′","\\prime"),kt(St,zt,Ot,"△","\\triangle"),kt(St,zt,Ot,"Γ","\\Gamma",!0),kt(St,zt,Ot,"Δ","\\Delta",!0),kt(St,zt,Ot,"Θ","\\Theta",!0),kt(St,zt,Ot,"Λ","\\Lambda",!0),kt(St,zt,Ot,"Ξ","\\Xi",!0),kt(St,zt,Ot,"Π","\\Pi",!0),kt(St,zt,Ot,"Σ","\\Sigma",!0),kt(St,zt,Ot,"Υ","\\Upsilon",!0),kt(St,zt,Ot,"Φ","\\Phi",!0),kt(St,zt,Ot,"Ψ","\\Psi",!0),kt(St,zt,Ot,"Ω","\\Omega",!0),kt(St,zt,Ot,"A","Α"),kt(St,zt,Ot,"B","Β"),kt(St,zt,Ot,"E","Ε"),kt(St,zt,Ot,"Z","Ζ"),kt(St,zt,Ot,"H","Η"),kt(St,zt,Ot,"I","Ι"),kt(St,zt,Ot,"K","Κ"),kt(St,zt,Ot,"M","Μ"),kt(St,zt,Ot,"N","Ν"),kt(St,zt,Ot,"O","Ο"),kt(St,zt,Ot,"P","Ρ"),kt(St,zt,Ot,"T","Τ"),kt(St,zt,Ot,"X","Χ"),kt(St,zt,Ot,"¬","\\neg",!0),kt(St,zt,Ot,"¬","\\lnot"),kt(St,zt,Ot,"⊤","\\top"),kt(St,zt,Ot,"⊥","\\bot"),kt(St,zt,Ot,"∅","\\emptyset"),kt(St,At,Ot,"∅","\\varnothing"),kt(St,zt,Nt,"α","\\alpha",!0),kt(St,zt,Nt,"β","\\beta",!0),kt(St,zt,Nt,"γ","\\gamma",!0),kt(St,zt,Nt,"δ","\\delta",!0),kt(St,zt,Nt,"ϵ","\\epsilon",!0),kt(St,zt,Nt,"ζ","\\zeta",!0),kt(St,zt,Nt,"η","\\eta",!0),kt(St,zt,Nt,"θ","\\theta",!0),kt(St,zt,Nt,"ι","\\iota",!0),kt(St,zt,Nt,"κ","\\kappa",!0),kt(St,zt,Nt,"λ","\\lambda",!0),kt(St,zt,Nt,"μ","\\mu",!0),kt(St,zt,Nt,"ν","\\nu",!0),kt(St,zt,Nt,"ξ","\\xi",!0),kt(St,zt,Nt,"ο","\\omicron",!0),kt(St,zt,Nt,"π","\\pi",!0),kt(St,zt,Nt,"ρ","\\rho",!0),kt(St,zt,Nt,"σ","\\sigma",!0),kt(St,zt,Nt,"τ","\\tau",!0),kt(St,zt,Nt,"υ","\\upsilon",!0),kt(St,zt,Nt,"ϕ","\\phi",!0),kt(St,zt,Nt,"χ","\\chi",!0),kt(St,zt,Nt,"ψ","\\psi",!0),kt(St,zt,Nt,"ω","\\omega",!0),kt(St,zt,Nt,"ε","\\varepsilon",!0),kt(St,zt,Nt,"ϑ","\\vartheta",!0),kt(St,zt,Nt,"ϖ","\\varpi",!0),kt(St,zt,Nt,"ϱ","\\varrho",!0),kt(St,zt,Nt,"ς","\\varsigma",!0),kt(St,zt,Nt,"φ","\\varphi",!0),kt(St,zt,Bt,"∗","*",!0),kt(St,zt,Bt,"+","+"),kt(St,zt,Bt,"−","-",!0),kt(St,zt,Bt,"⋅","\\cdot",!0),kt(St,zt,Bt,"∘","\\circ",!0),kt(St,zt,Bt,"÷","\\div",!0),kt(St,zt,Bt,"±","\\pm",!0),kt(St,zt,Bt,"×","\\times",!0),kt(St,zt,Bt,"∩","\\cap",!0),kt(St,zt,Bt,"∪","\\cup",!0),kt(St,zt,Bt,"∖","\\setminus",!0),kt(St,zt,Bt,"∧","\\land"),kt(St,zt,Bt,"∨","\\lor"),kt(St,zt,Bt,"∧","\\wedge",!0),kt(St,zt,Bt,"∨","\\vee",!0),kt(St,zt,Ot,"√","\\surd"),kt(St,zt,It,"⟨","\\langle",!0),kt(St,zt,It,"∣","\\lvert"),kt(St,zt,It,"∥","\\lVert"),kt(St,zt,Ct,"?","?"),kt(St,zt,Ct,"!","!"),kt(St,zt,Ct,"⟩","\\rangle",!0),kt(St,zt,Ct,"∣","\\rvert"),kt(St,zt,Ct,"∥","\\rVert"),kt(St,zt,Rt,"=","="),kt(St,zt,Rt,":",":"),kt(St,zt,Rt,"≈","\\approx",!0),kt(St,zt,Rt,"≅","\\cong",!0),kt(St,zt,Rt,"≥","\\ge"),kt(St,zt,Rt,"≥","\\geq",!0),kt(St,zt,Rt,"←","\\gets"),kt(St,zt,Rt,">","\\gt",!0),kt(St,zt,Rt,"∈","\\in",!0),kt(St,zt,Rt,"","\\@not"),kt(St,zt,Rt,"⊂","\\subset",!0),kt(St,zt,Rt,"⊃","\\supset",!0),kt(St,zt,Rt,"⊆","\\subseteq",!0),kt(St,zt,Rt,"⊇","\\supseteq",!0),kt(St,At,Rt,"⊈","\\nsubseteq",!0),kt(St,At,Rt,"⊉","\\nsupseteq",!0),kt(St,zt,Rt,"⊨","\\models"),kt(St,zt,Rt,"←","\\leftarrow",!0),kt(St,zt,Rt,"≤","\\le"),kt(St,zt,Rt,"≤","\\leq",!0),kt(St,zt,Rt,"<","\\lt",!0),kt(St,zt,Rt,"→","\\rightarrow",!0),kt(St,zt,Rt,"→","\\to"),kt(St,At,Rt,"≱","\\ngeq",!0),kt(St,At,Rt,"≰","\\nleq",!0),kt(St,zt,Ht," ","\\ "),kt(St,zt,Ht," ","\\space"),kt(St,zt,Ht," ","\\nobreakspace"),kt(Mt,zt,Ht," ","\\ "),kt(Mt,zt,Ht," "," "),kt(Mt,zt,Ht," ","\\space"),kt(Mt,zt,Ht," ","\\nobreakspace"),kt(St,zt,Ht,null,"\\nobreak"),kt(St,zt,Ht,null,"\\allowbreak"),kt(St,zt,p0,",",","),kt(St,zt,p0,";",";"),kt(St,At,Bt,"⊼","\\barwedge",!0),kt(St,At,Bt,"⊻","\\veebar",!0),kt(St,zt,Bt,"⊙","\\odot",!0),kt(St,zt,Bt,"⊕","\\oplus",!0),kt(St,zt,Bt,"⊗","\\otimes",!0),kt(St,zt,Ot,"∂","\\partial",!0),kt(St,zt,Bt,"⊘","\\oslash",!0),kt(St,At,Bt,"⊚","\\circledcirc",!0),kt(St,At,Bt,"⊡","\\boxdot",!0),kt(St,zt,Bt,"△","\\bigtriangleup"),kt(St,zt,Bt,"▽","\\bigtriangledown"),kt(St,zt,Bt,"†","\\dagger"),kt(St,zt,Bt,"⋄","\\diamond"),kt(St,zt,Bt,"⋆","\\star"),kt(St,zt,Bt,"◃","\\triangleleft"),kt(St,zt,Bt,"▹","\\triangleright"),kt(St,zt,It,"{","\\{"),kt(Mt,zt,Ot,"{","\\{"),kt(Mt,zt,Ot,"{","\\textbraceleft"),kt(St,zt,Ct,"}","\\}"),kt(Mt,zt,Ot,"}","\\}"),kt(Mt,zt,Ot,"}","\\textbraceright"),kt(St,zt,It,"{","\\lbrace"),kt(St,zt,Ct,"}","\\rbrace"),kt(St,zt,It,"[","\\lbrack",!0),kt(Mt,zt,Ot,"[","\\lbrack",!0),kt(St,zt,Ct,"]","\\rbrack",!0),kt(Mt,zt,Ot,"]","\\rbrack",!0),kt(St,zt,It,"(","\\lparen",!0),kt(St,zt,Ct,")","\\rparen",!0),kt(Mt,zt,Ot,"<","\\textless",!0),kt(Mt,zt,Ot,">","\\textgreater",!0),kt(St,zt,It,"⌊","\\lfloor",!0),kt(St,zt,Ct,"⌋","\\rfloor",!0),kt(St,zt,It,"⌈","\\lceil",!0),kt(St,zt,Ct,"⌉","\\rceil",!0),kt(St,zt,Ot,"\\","\\backslash"),kt(St,zt,Ot,"∣","|"),kt(St,zt,Ot,"∣","\\vert"),kt(Mt,zt,Ot,"|","\\textbar",!0),kt(St,zt,Ot,"∥","\\|"),kt(St,zt,Ot,"∥","\\Vert"),kt(Mt,zt,Ot,"∥","\\textbardbl"),kt(Mt,zt,Ot,"~","\\textasciitilde"),kt(Mt,zt,Ot,"\\","\\textbackslash"),kt(Mt,zt,Ot,"^","\\textasciicircum"),kt(St,zt,Rt,"↑","\\uparrow",!0),kt(St,zt,Rt,"⇑","\\Uparrow",!0),kt(St,zt,Rt,"↓","\\downarrow",!0),kt(St,zt,Rt,"⇓","\\Downarrow",!0),kt(St,zt,Rt,"↕","\\updownarrow",!0),kt(St,zt,Rt,"⇕","\\Updownarrow",!0),kt(St,zt,qt,"∐","\\coprod"),kt(St,zt,qt,"⋁","\\bigvee"),kt(St,zt,qt,"⋀","\\bigwedge"),kt(St,zt,qt,"⨄","\\biguplus"),kt(St,zt,qt,"⋂","\\bigcap"),kt(St,zt,qt,"⋃","\\bigcup"),kt(St,zt,qt,"∫","\\int"),kt(St,zt,qt,"∫","\\intop"),kt(St,zt,qt,"∬","\\iint"),kt(St,zt,qt,"∭","\\iiint"),kt(St,zt,qt,"∏","\\prod"),kt(St,zt,qt,"∑","\\sum"),kt(St,zt,qt,"⨂","\\bigotimes"),kt(St,zt,qt,"⨁","\\bigoplus"),kt(St,zt,qt,"⨀","\\bigodot"),kt(St,zt,qt,"∮","\\oint"),kt(St,zt,qt,"∯","\\oiint"),kt(St,zt,qt,"∰","\\oiiint"),kt(St,zt,qt,"⨆","\\bigsqcup"),kt(St,zt,qt,"∫","\\smallint"),kt(Mt,zt,c0,"…","\\textellipsis"),kt(St,zt,c0,"…","\\mathellipsis"),kt(Mt,zt,c0,"…","\\ldots",!0),kt(St,zt,c0,"…","\\ldots",!0),kt(St,zt,c0,"⋯","\\@cdots",!0),kt(St,zt,c0,"⋱","\\ddots",!0),kt(St,zt,Ot,"⋮","\\varvdots"),kt(Mt,zt,Ot,"⋮","\\varvdots"),kt(St,zt,Tt,"ˊ","\\acute"),kt(St,zt,Tt,"ˋ","\\grave"),kt(St,zt,Tt,"¨","\\ddot"),kt(St,zt,Tt,"~","\\tilde"),kt(St,zt,Tt,"ˉ","\\bar"),kt(St,zt,Tt,"˘","\\breve"),kt(St,zt,Tt,"ˇ","\\check"),kt(St,zt,Tt,"^","\\hat"),kt(St,zt,Tt,"⃗","\\vec"),kt(St,zt,Tt,"˙","\\dot"),kt(St,zt,Tt,"˚","\\mathring"),kt(St,zt,Nt,"","\\@imath"),kt(St,zt,Nt,"","\\@jmath"),kt(St,zt,Ot,"ı","ı"),kt(St,zt,Ot,"ȷ","ȷ"),kt(Mt,zt,Ot,"ı","\\i",!0),kt(Mt,zt,Ot,"ȷ","\\j",!0),kt(Mt,zt,Ot,"ß","\\ss",!0),kt(Mt,zt,Ot,"æ","\\ae",!0),kt(Mt,zt,Ot,"œ","\\oe",!0),kt(Mt,zt,Ot,"ø","\\o",!0),kt(Mt,zt,Ot,"Æ","\\AE",!0),kt(Mt,zt,Ot,"Œ","\\OE",!0),kt(Mt,zt,Ot,"Ø","\\O",!0),kt(Mt,zt,Tt,"ˊ","\\'"),kt(Mt,zt,Tt,"ˋ","\\`"),kt(Mt,zt,Tt,"ˆ","\\^"),kt(Mt,zt,Tt,"˜","\\~"),kt(Mt,zt,Tt,"ˉ","\\="),kt(Mt,zt,Tt,"˘","\\u"),kt(Mt,zt,Tt,"˙","\\."),kt(Mt,zt,Tt,"¸","\\c"),kt(Mt,zt,Tt,"˚","\\r"),kt(Mt,zt,Tt,"ˇ","\\v"),kt(Mt,zt,Tt,"¨",'\\"'),kt(Mt,zt,Tt,"˝","\\H"),kt(Mt,zt,Tt,"◯","\\textcircled");let ee={"--":!0,"---":!0,"``":!0,"''":!0};kt(Mt,zt,Ot,"–","--",!0),kt(Mt,zt,Ot,"–","\\textendash"),kt(Mt,zt,Ot,"—","---",!0),kt(Mt,zt,Ot,"—","\\textemdash"),kt(Mt,zt,Ot,"‘","`",!0),kt(Mt,zt,Ot,"‘","\\textquoteleft"),kt(Mt,zt,Ot,"’","'",!0),kt(Mt,zt,Ot,"’","\\textquoteright"),kt(Mt,zt,Ot,"“","``",!0),kt(Mt,zt,Ot,"“","\\textquotedblleft"),kt(Mt,zt,Ot,"”","''",!0),kt(Mt,zt,Ot,"”","\\textquotedblright"),kt(St,zt,Ot,"°","\\degree",!0),kt(Mt,zt,Ot,"°","\\degree"),kt(Mt,zt,Ot,"°","\\textdegree",!0),kt(St,zt,Ot,"£","\\pounds"),kt(St,zt,Ot,"£","\\mathsterling",!0),kt(Mt,zt,Ot,"£","\\pounds"),kt(Mt,zt,Ot,"£","\\textsterling",!0),kt(St,At,Ot,"✠","\\maltese"),kt(Mt,At,Ot,"✠","\\maltese");for(let e=0;e<14;e++){var d0='0123456789/@."'.charAt(e);kt(St,zt,Ot,d0,d0)}for(let e=0;e<25;e++){var u0='0123456789!@*()-=+";:?/.,'.charAt(e);kt(Mt,zt,Ot,u0,u0)}var g0="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";for(let e=0;e<52;e++){var f0=g0.charAt(e);kt(St,zt,Nt,f0,f0),kt(Mt,zt,Ot,f0,f0)}kt(St,At,Ot,"C","ℂ"),kt(Mt,At,Ot,"C","ℂ"),kt(St,At,Ot,"H","ℍ"),kt(Mt,At,Ot,"H","ℍ"),kt(St,At,Ot,"N","ℕ"),kt(Mt,At,Ot,"N","ℕ"),kt(St,At,Ot,"P","ℙ"),kt(Mt,At,Ot,"P","ℙ"),kt(St,At,Ot,"Q","ℚ"),kt(Mt,At,Ot,"Q","ℚ"),kt(St,At,Ot,"R","ℝ"),kt(Mt,At,Ot,"R","ℝ"),kt(St,At,Ot,"Z","ℤ"),kt(Mt,At,Ot,"Z","ℤ"),kt(St,zt,Nt,"h","ℎ"),kt(Mt,zt,Nt,"h","ℎ");let t="";for(let e=0;e<52;e++){var Et=g0.charAt(e);kt(St,zt,Nt,Et,t=String.fromCharCode(55349,56320+e)),kt(Mt,zt,Ot,Et,t),kt(St,zt,Nt,Et,t=String.fromCharCode(55349,56372+e)),kt(Mt,zt,Ot,Et,t),kt(St,zt,Nt,Et,t=String.fromCharCode(55349,56424+e)),kt(Mt,zt,Ot,Et,t),kt(St,zt,Nt,Et,t=String.fromCharCode(55349,56580+e)),kt(Mt,zt,Ot,Et,t),kt(St,zt,Nt,Et,t=String.fromCharCode(55349,56684+e)),kt(Mt,zt,Ot,Et,t),kt(St,zt,Nt,Et,t=String.fromCharCode(55349,56736+e)),kt(Mt,zt,Ot,Et,t),kt(St,zt,Nt,Et,t=String.fromCharCode(55349,56788+e)),kt(Mt,zt,Ot,Et,t),kt(St,zt,Nt,Et,t=String.fromCharCode(55349,56840+e)),kt(Mt,zt,Ot,Et,t),kt(St,zt,Nt,Et,t=String.fromCharCode(55349,56944+e)),kt(Mt,zt,Ot,Et,t),e<26&&(kt(St,zt,Nt,Et,t=String.fromCharCode(55349,56632+e)),kt(Mt,zt,Ot,Et,t),kt(St,zt,Nt,Et,t=String.fromCharCode(55349,56476+e)),kt(Mt,zt,Ot,Et,t))}kt(St,zt,Nt,"k",t=String.fromCharCode(55349,56668)),kt(Mt,zt,Ot,"k",t);for(let e=0;e<10;e++){var b0=e.toString();kt(St,zt,Nt,b0,t=String.fromCharCode(55349,57294+e)),kt(Mt,zt,Ot,b0,t),kt(St,zt,Nt,b0,t=String.fromCharCode(55349,57314+e)),kt(Mt,zt,Ot,b0,t),kt(St,zt,Nt,b0,t=String.fromCharCode(55349,57324+e)),kt(Mt,zt,Ot,b0,t),kt(St,zt,Nt,b0,t=String.fromCharCode(55349,57334+e)),kt(Mt,zt,Ot,b0,t)}for(let e=0;e<3;e++){var y0="ÐÞþ".charAt(e);kt(St,zt,Nt,y0,y0),kt(Mt,zt,Ot,y0,y0)}function x0(e,t,r){return{value:e=vt[r][e]&&vt[r][e].replace?vt[r][e].replace:e,metrics:r0(e,t,r)}}function Lt(t,e,r,n,a){let i=x0(t,e,r),o=i.metrics,s;if(t=i.value,o){let e=o.italic;("text"===r||n&&"mathit"===n.font)&&(e=0),s=new jt(t,o.height,o.depth,e,o.skew,o.width,a)}else"undefined"!=typeof console&&console.warn("No character metrics for '"+t+"' in style '"+e+"' and mode '"+r+"'"),s=new jt(t,0,0,0,0,0,a);return n&&(s.maxFontSize=n.sizeMultiplier,n.style.isTight()&&s.classes.push("mtight"),e=n.getColor())&&(s.style.color=e),s}function w0(t){let r=0,n=0,a=0;for(let e=0;er&&(r=i.height),i.depth>n&&(n=i.depth),i.maxFontSize>a&&(a=i.maxFontSize)}t.height=r,t.depth=n,t.maxFontSize=a}function Dt(e,t,r,n){return w0(e=new vr(e,t,r,n)),e}function v0(e){return w0(e=new xr(e)),e}function k0(e,t,r){let n="";switch(e){case"amsrm":n="AMS";break;case"textrm":n="Main";break;case"textsf":n="SansSerif";break;case"texttt":n="Typewriter";break;default:n=e}return n+"-"+("textbf"===t&&"textit"===r?"BoldItalic":"textbf"===t?"Bold":"textit"===t?"Italic":"Regular")}let c=[["mathbf","textbf","Main-Bold"],["mathbf","textbf","Main-Bold"],["mathnormal","textit","Math-Italic"],["mathnormal","textit","Math-Italic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["mathscr","textscr","Script-Regular"],["","",""],["","",""],["","",""],["mathfrak","textfrak","Fraktur-Regular"],["mathfrak","textfrak","Fraktur-Regular"],["mathbb","textbb","AMS-Regular"],["mathbb","textbb","AMS-Regular"],["mathboldfrak","textboldfrak","Fraktur-Regular"],["mathboldfrak","textboldfrak","Fraktur-Regular"],["mathsf","textsf","SansSerif-Regular"],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathitsf","textitsf","SansSerif-Italic"],["mathitsf","textitsf","SansSerif-Italic"],["","",""],["","",""],["mathtt","texttt","Typewriter-Regular"],["mathtt","texttt","Typewriter-Regular"]],te=[["mathbf","textbf","Main-Bold"],["","",""],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathtt","texttt","Typewriter-Regular"]],re=(e,t,r,n)=>new vr(e,t,r,n),ne={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathsfit:{variant:"sans-serif-italic",fontName:"SansSerif-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},ae={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]};var Pt={fontMap:ne,makeSymbol:Lt,mathsym:function(e,t,r,n){return void 0===n&&(n=[]),"boldsymbol"===r.font&&x0(e,"Main-Bold",t).metrics?Lt(e,"Main-Bold",t,r,n.concat(["mathbf"])):"\\"===e||"main"===vt[t][e].font?Lt(e,"Main-Regular",t,r,n):Lt(e,"AMS-Regular",t,r,n.concat(["amsrm"]))},makeSpan:Dt,makeSvgSpan:re,makeLineSpan:function(e,t,r){return(e=Dt([e],[],t)).height=Math.max(r||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),e.style.borderBottomWidth=D(e.height),e.maxFontSize=1,e},makeAnchor:function(e,t,r,n){return w0(e=new kr(e,t,r,n)),e},makeFragment:v0,wrapFragment:function(e,t){return e instanceof xr?Dt([],[e],t):e},makeVList:function(e,t){let{children:r,depth:n}=(a=>{if("individualShift"===a.positionType){let t=a.children,r=[t[0]],e=-t[0].shift-t[0].elem.depth,n=e;for(let e=1;e{var r,n=1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536,t="math"===t?0:1;if(119808<=n&&n<120484)return r=Math.floor((n-119808)/26),[c[r][2],c[r][t]];if(120782<=n&&n<=120831)return r=Math.floor((n-120782)/10),[te[r][2],te[r][t]];if(120485==n||120486==n)return[c[0][2],c[0][t]];if(120486{var r=Dt(["mspace"],[],t),e=wt(e,t);return r.style.marginRight=D(e),r},staticSvg:function(e,t){var[e,r,n]=ae[e],e=new zr(e),e=new Mr([e],{width:D(r),height:D(n),style:"width:"+D(r),viewBox:"0 0 "+1e3*r+" "+1e3*n,preserveAspectRatio:"xMinYMin"});return(e=re(["overlay"],[e],t)).height=n,e.style.height=D(n),e.style.width=D(r),e},svgData:ae,tryCombineChars:t=>{for(let e=0;e{if(o0(e.classes)!==o0(t.classes)||e.skew!==t.skew||e.maxFontSize!==t.maxFontSize)return!1;if(1===e.classes.length){var r=e.classes[0];if("mbin"===r||"mord"===r)return!1}for(var n in e.style)if(e.style.hasOwnProperty(n)&&e.style[n]!==t.style[n])return!1;for(var a in t.style)if(t.style.hasOwnProperty(a)&&e.style[a]!==t.style[a])return!1;return!0})(r,n)&&(r.text+=n.text,r.height=Math.max(r.height,n.height),r.depth=Math.max(r.depth,n.depth),r.italic=n.italic,t.splice(e+1,1),e--)}return t}};let h={number:3,unit:"mu"},m={number:4,unit:"mu"},p={number:5,unit:"mu"},ie={mord:{mop:h,mbin:m,mrel:p,minner:h},mop:{mord:h,mop:h,mrel:p,minner:h},mbin:{mord:m,mop:m,mopen:m,minner:m},mrel:{mord:p,mop:p,mopen:p,minner:p},mopen:{},mclose:{mop:h,mbin:m,mrel:p,minner:h},mpunct:{mord:h,mop:h,mrel:p,mopen:h,mclose:h,mpunct:h,minner:h},minner:{mord:h,mop:h,mbin:m,mrel:p,mopen:h,mpunct:h,minner:h}},oe={mord:{mop:h},mop:{mord:h,mop:h},mbin:{},mrel:{},mopen:{},mclose:{mop:h},mpunct:{},minner:{mop:h}},se={},d={},u={};function Vt(e){var{type:e,names:t,props:r,handler:n,htmlBuilder:a,mathmlBuilder:i}=e,o={type:e,numArgs:r.numArgs,argTypes:r.argTypes,allowedInArgument:!!r.allowedInArgument,allowedInText:!!r.allowedInText,allowedInMath:void 0===r.allowedInMath||r.allowedInMath,numOptionalArgs:r.numOptionalArgs||0,infix:!!r.infix,primitive:!!r.primitive,handler:n};for(let e=0;e{var r=t.classes[0],n=e.classes[0];"mbin"===r&&bt.contains(he,n)?t.classes[0]="mord":"mbin"===n&&bt.contains(le,r)&&(e.classes[0]="mord")},{node:s},a,e),f(i,(e,t)=>{var t=y(t),r=y(e);if(e=t&&r?(e.hasClass("mtight")?oe:ie)[t][r]:null)return Pt.makeGlue(e,n)},{node:s},a,e)}return i}function z0(e,t){return e=["nulldelimiter"].concat(e.baseSizingClasses()),g(t.concat(e))}let g=Pt.makeSpan,le=["leftmost","mbin","mopen","mrel","mop","mpunct"],he=["rightmost","mrel","mclose","mpunct"],me={display:yt.DISPLAY,text:yt.TEXT,script:yt.SCRIPT,scriptscript:yt.SCRIPTSCRIPT},ce={mord:"mord",mop:"mop",mbin:"mbin",mrel:"mrel",mopen:"mopen",mclose:"mclose",mpunct:"mpunct",minner:"minner"},f=function(r,e,t,n,a){n&&r.push(n);let i=0;for(;ie=>{r.splice(t+1,0,e),i++})(i))}n&&r.pop()},pe=function(e){return e instanceof xr||e instanceof kr||e instanceof vr&&e.hasClass("enclosing")?e:null},b=function(e,t){var r=pe(e);if(r&&(r=r.children).length){if("right"===t)return b(r[r.length-1],"right");if("left"===t)return b(r[0],"left")}return e},y=function(e,t){return e&&(t&&(e=b(e,t)),ce[e.classes[0]])||null},P=function(t,r,n){if(!t)return g();if(d[t.type]){let e=d[t.type](t,r);return n&&r.size!==n.size&&(e=g(r.sizingClasses(n),[e],r),r=r.sizeMultiplier/n.sizeMultiplier,e.height*=r,e.depth*=r),e}throw new ft("Got group of unknown type: '"+t.type+"'")};function A0(e,t){return e=g(["base"],e,t),(t=g(["strut"])).style.height=D(e.height+e.depth),e.depth&&(t.style.verticalAlign=D(-e.depth)),e.children.unshift(t),e}function T0(e,r){let t=null,n=(1===e.length&&"tag"===e[0].type&&(t=e[0].tag,e=e[0].body),Gt(e,r,"root")),a,i=(2===n.length&&n[1].hasClass("tag")&&(a=n.pop()),[]),o,s=[];for(let t=0;t";for(let e=0;e"}toText(){return this.children.map(e=>e.toText()).join("")}}class $t{constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return bt.escape(this.toText())}toText(){return this.text}}var Ut={MathNode:_t,TextNode:$t,SpaceNode:class{constructor(e){this.width=void 0,this.character=void 0,this.width=e,this.character=.05555<=e&&e<=.05556?" ":.1666<=e&&e<=.1667?" ":.2222<=e&&e<=.2223?" ":.2777<=e&&e<=.2778?" ":-.05556<=e&&e<=-.05555?" ":-.1667<=e&&e<=-.1666?" ":-.2223<=e&&e<=-.2222?" ":-.2778<=e&&e<=-.2777?" ":null}toNode(){var e;return this.character?document.createTextNode(this.character):((e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace")).setAttribute("width",D(this.width)),e)}toMarkup(){return this.character?""+this.character+" ":' '}toText(){return this.character||" "}},newDocumentFragment:B0};function Yt(e,t,r){return!vt[t][e]||!vt[t][e].replace||55349===e.charCodeAt(0)||ee.hasOwnProperty(e)&&r&&(r.fontFamily&&"tt"===r.fontFamily.slice(4,6)||r.font&&"tt"===r.font.slice(4,6))||(e=vt[t][e].replace),new Ut.TextNode(e)}function C0(e){return 1===e.length?e[0]:new Ut.MathNode("mrow",e)}function N0(e,t){var r;return"texttt"===t.fontFamily?"monospace":"textsf"===t.fontFamily?"textit"===t.fontShape&&"textbf"===t.fontWeight?"sans-serif-bold-italic":"textit"===t.fontShape?"sans-serif-italic":"textbf"===t.fontWeight?"bold-sans-serif":"sans-serif":"textit"===t.fontShape&&"textbf"===t.fontWeight?"bold-italic":"textit"===t.fontShape?"italic":"textbf"===t.fontWeight?"bold":(t=t.font)&&"mathnormal"!==t?(r=e.mode,"mathit"===t?"italic":"boldsymbol"===t?"textord"===e.type?"bold":"bold-italic":"mathbf"===t?"bold":"mathbb"===t?"double-struck":"mathsfit"===t?"sans-serif-italic":"mathfrak"===t?"fraktur":"mathscr"===t||"mathcal"===t?"script":"mathsf"===t?"sans-serif":"mathtt"===t?"monospace":!bt.contains(["\\imath","\\jmath"],e=e.text)&&r0(e=vt[r][e]&&vt[r][e].replace?vt[r][e].replace:e,Pt.fontMap[t].fontName,r)?Pt.fontMap[t].variant:null):null}function q0(e){var t;return e&&("mi"===e.type&&1===e.children.length?(t=e.children[0])instanceof $t&&"."===t.text:"mo"===e.type&&1===e.children.length&&"true"===e.getAttribute("separator")&&"0em"===e.getAttribute("lspace")&&"0em"===e.getAttribute("rspace")&&(t=e.children[0])instanceof $t&&","===t.text)}function I0(e,t,r){return C0(x(e,t,r))}let x=function(t,r,e){var n;if(1===t.length)return n=w(t[0],r),e&&n instanceof _t&&"mo"===n.type&&(n.setAttribute("lspace","0em"),n.setAttribute("rspace","0em")),[n];let a=[],i;for(let e=0;e{let h=4e5,m=i.label.slice(1);if(bt.contains(["widehat","widecheck","widetilde","utilde"],m)){var n,a="ordgroup"===(a=i.base).type?a.body.length:1;let e,t,r;return t=5{let e,o,t,s=(a&&"supsub"===a.type?(o=Xt(a.base,"accent"),e=o.base,a.base=e,t=(e=>{if(e instanceof vr)return e;throw new Error("Expected span but got "+String(e)+".")})(P(a,i)),a.base=o):(o=Xt(a,"accent"),e=o.base),a=P(e,i.havingCrampedStyle()),0);o.isShifty&&bt.isCharacterBox(e)&&(l=bt.getBaseElem(e),s=m0(P(l,i.havingCrampedStyle())).skew);var l="\\c"===o.label;let h,m=l?a.height+a.depth:Math.min(a.height,i.fontMetrics().xHeight);if(o.isStretchy)h=O0(o,i),h=Pt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"elem",elem:h,wrapperClasses:["svg-align"],wrapperStyle:0{var r=e.isStretchy?H0(e.label):new Ut.MathNode("mo",[Yt(e.label,e.mode)]);return(e=new Ut.MathNode("mover",[w(e.base,t),r])).setAttribute("accent","true"),e},ye=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(e=>"\\"+e).join("|")),k=(Vt({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:(e,t)=>{var t=M0(t[0]),r=!ye.test(e.funcName),n=!r||"\\widehat"===e.funcName||"\\widetilde"===e.funcName||"\\widecheck"===e.funcName;return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:r,isShifty:n,base:t}},htmlBuilder:v,mathmlBuilder:be}),Vt({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:(e,t)=>{t=t[0];let r=e.parser.mode;return"math"===r&&(e.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+e.funcName+" works only in text mode"),r="text"),{type:"accent",mode:r,label:e.funcName,isStretchy:!1,isShifty:!0,base:t}},htmlBuilder:v,mathmlBuilder:be}),Vt({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:(e,t)=>{var{parser:e,funcName:r}=e,t=t[0];return{type:"accentUnder",mode:e.mode,label:r,base:t}},htmlBuilder:(e,t)=>{var r=P(e.base,t),n=O0(e,t),n=Pt.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:"\\utilde"===e.label?.12:0},{type:"elem",elem:r}]},t);return Pt.makeSpan(["mord","accentunder"],[n],t)},mathmlBuilder:(e,t)=>{var r=H0(e.label);return(e=new Ut.MathNode("munder",[w(e.base,t),r])).setAttribute("accentunder","true"),e}}),e=>((e=new Ut.MathNode("mpadded",e?[e]:[])).setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e)),xe=(Vt({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){var{parser:e,funcName:n}=e;return{type:"xArrow",mode:e.mode,label:n,body:t[0],below:r[0]}},htmlBuilder(e,t){var r=t.style,n=t.havingStyle(r.sup()),a=Pt.wrapFragment(P(e.body,n,t),t),i="\\x"===e.label.slice(0,2)?"x":"cd";let o;a.classes.push(i+"-arrow-pad"),e.below&&(n=t.havingStyle(r.sub()),(o=Pt.wrapFragment(P(e.below,n,t),t)).classes.push(i+"-arrow-pad")),r=O0(e,t),n=-t.fontMetrics().axisHeight+.5*r.height;let s,l=-t.fontMetrics().axisHeight-.5*r.height-.111;return(.25"atom"!==(e="ordgroup"===e.type&&e.body.length?e.body[0]:e).type||"bin"!==e.family&&"rel"!==e.family?"mord":"m"+e.family,we=(Vt({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(e,t){return{type:"mclass",mode:(e=e.parser).mode,mclass:S(t[0]),body:Ft(t[1]),isCharacterBox:bt.isCharacterBox(t[1])}}}),Vt({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(e,t){var{parser:e,funcName:r}=e,n=t[1],t=t[0],a="\\stackrel"!==r?S(n):"mrel",n={type:"op",mode:n.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:"\\stackrel"!==r,body:Ft(n)},n={type:"supsub",mode:t.mode,base:n,sup:"\\underset"===r?null:t,sub:"\\underset"===r?t:null};return{type:"mclass",mode:e.mode,mclass:a,body:[n],isCharacterBox:bt.isCharacterBox(n)}},htmlBuilder:D0,mathmlBuilder:P0}),Vt({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(e,t){return{type:"pmb",mode:(e=e.parser).mode,mclass:S(t[0]),body:Ft(t[0])}},htmlBuilder(e,t){var r=Gt(e.body,t,!0);return(e=Pt.makeSpan([e.mclass],r,t)).style.textShadow="0.02em 0.01em 0.04px",e},mathmlBuilder(e,t){return e=x(e.body,t),(t=new Ut.MathNode("mstyle",e)).setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),t}}),{">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"}),ve=e=>"textord"===e.type&&"@"===e.text;function V0(e,t,r){if(r=r0(vt.math[e]&&vt.math[e].replace||e,t,r))return r;throw new Error("Unsupported symbol "+e+" and font size "+t+".")}function F0(e,t,r,n){return t=r.havingBaseStyle(t),n=Pt.makeSpan(n.concat(t.sizingClasses(r)),[e],r),e=t.sizeMultiplier/r.sizeMultiplier,n.height*=e,n.depth*=e,n.maxFontSize=t.sizeMultiplier,n}function G0(e,t,r){r=t.havingBaseStyle(r),r=(1-t.sizeMultiplier/r.sizeMultiplier)*t.fontMetrics().axisHeight,e.classes.push("delimcenter"),e.style.top=D(r),e.height-=r,e.depth+=r}function U0(e,t,r,n,a,i){return e=Pt.makeSymbol(e,"Size"+t+"-Regular",a,n),a=F0(Pt.makeSpan(["delimsizing","size"+t],[e],n),yt.TEXT,n,i),r&&G0(a,n,yt.TEXT),a}function Y0(e,t,r){return{type:"elem",elem:Pt.makeSpan(["delimsizinginner","Size1-Regular"===t?"delim-size1":"delim-size4"],[Pt.makeSpan([],[Pt.makeSymbol(e,t,r)])])}}function X0(e,t,r){var n=(xt["Size4-Regular"][e.charCodeAt(0)]?xt["Size4-Regular"]:xt["Size1-Regular"])[e.charCodeAt(0)][4],e=new zr("inner",((e,t)=>{switch(e){case"⎜":return"M291 0 H417 V"+t+" H291z M291 0 H417 V"+t+" H291z";case"∣":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145z";case"∥":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145zM367 0 H410 V"+t+" H367z M367 0 H410 V"+t+" H367z";case"⎟":return"M457 0 H583 V"+t+" H457z M457 0 H583 V"+t+" H457z";case"⎢":return"M319 0 H403 V"+t+" H319z M319 0 H403 V"+t+" H319z";case"⎥":return"M263 0 H347 V"+t+" H263z M263 0 H347 V"+t+" H263z";case"⎪":return"M384 0 H504 V"+t+" H384z M384 0 H504 V"+t+" H384z";case"⏐":return"M312 0 H355 V"+t+" H312z M312 0 H355 V"+t+" H312z";case"‖":return"M257 0 H300 V"+t+" H257z M257 0 H300 V"+t+" H257zM478 0 H521 V"+t+" H478z M478 0 H521 V"+t+" H478z";default:return""}})(e,Math.round(1e3*t))),e=new Mr([e],{width:D(n),height:D(t),style:"width:"+D(n),viewBox:"0 0 "+1e3*n+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"});return(e=Pt.makeSvgSpan([],[e],r)).height=t,e.style.height=D(t),e.style.width=D(n),{type:"elem",elem:e}}function W0(e,t,r,n,a,i){let o,s,l,h,m="",c=0,p=(o=l=h=e,s=null,"Size1-Regular");"\\uparrow"===e?l=h="⏐":"\\Uparrow"===e?l=h="‖":"\\downarrow"===e?o=l="⏐":"\\Downarrow"===e?o=l="‖":"\\updownarrow"===e?(o="\\uparrow",l="⏐",h="\\downarrow"):"\\Updownarrow"===e?(o="\\Uparrow",l="‖",h="\\Downarrow"):bt.contains(Me,e)?(l="∣",m="vert",c=333):bt.contains(ze,e)?(l="∥",m="doublevert",c=556):"["===e||"\\lbrack"===e?(o="⎡",l="⎢",h="⎣",p="Size4-Regular",m="lbrack",c=667):"]"===e||"\\rbrack"===e?(o="⎤",l="⎥",h="⎦",p="Size4-Regular",m="rbrack",c=667):"\\lfloor"===e||"⌊"===e?(l=o="⎢",h="⎣",p="Size4-Regular",m="lfloor",c=667):"\\lceil"===e||"⌈"===e?(o="⎡",l=h="⎢",p="Size4-Regular",m="lceil",c=667):"\\rfloor"===e||"⌋"===e?(l=o="⎥",h="⎦",p="Size4-Regular",m="rfloor",c=667):"\\rceil"===e||"⌉"===e?(o="⎤",l=h="⎥",p="Size4-Regular",m="rceil",c=667):"("===e||"\\lparen"===e?(o="⎛",l="⎜",h="⎝",p="Size4-Regular",m="lparen",c=875):")"===e||"\\rparen"===e?(o="⎞",l="⎟",h="⎠",p="Size4-Regular",m="rparen",c=875):"\\{"===e||"\\lbrace"===e?(o="⎧",s="⎨",h="⎩",l="⎪",p="Size4-Regular"):"\\}"===e||"\\rbrace"===e?(o="⎫",s="⎬",h="⎭",l="⎪",p="Size4-Regular"):"\\lgroup"===e||"⟮"===e?(o="⎧",h="⎩",l="⎪",p="Size4-Regular"):"\\rgroup"===e||"⟯"===e?(o="⎫",h="⎭",l="⎪",p="Size4-Regular"):"\\lmoustache"===e||"⎰"===e?(o="⎧",h="⎭",l="⎪",p="Size4-Regular"):"\\rmoustache"!==e&&"⎱"!==e||(o="⎫",h="⎩",l="⎪",p="Size4-Regular");var d=(e=V0(o,p,a)).height+e.depth,e=(e=V0(l,p,a)).height+e.depth,u=(u=V0(h,p,a)).height+u.depth;let g=0,f=1;null!==s&&(b=V0(s,p,a),g=b.height+b.depth,f=2);var b=(b=d+u+g)+Math.max(0,Math.ceil((t-b)/(f*e)))*f*e;let y=n.fontMetrics().axisHeight;r&&(y*=n.sizeMultiplier);var x,w,v,k,t=b/2-y,S=[];return 0{switch(e){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+" v1759 h347 v-84\nH403z M403 1759 V0 H319 V1759 v"+t+" v1759 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+" v1759 H0 v84 H347z\nM347 1759 V0 H263 V1759 v"+t+" v1759 h84z";case"vert":return"M145 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v"+t+" v585 h43z";case"doublevert":return"M145 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v"+t+" v585 h43z\nM367 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M410 15 H367 v585 v"+t+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+t+" v1715 h263 v84 H319z\nMM319 602 V0 H403 V602 v"+t+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+t+" v1799 H0 v-84 H319z\nMM319 602 V0 H403 V602 v"+t+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+" v602 h84z\nM403 1759 V0 H319 V1759 v"+t+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+" v602 h84z\nM347 1759 V0 h-84 V1759 v"+t+" v602 h84z";case"lparen":return"M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1\nc-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349,\n-36,557 l0,"+(t+84)+"c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210,\n949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9\nc0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5,\n-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189\nl0,-"+(t+92)+"c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3,\n-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z";case"rparen":return"M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3,\n63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5\nc11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,"+(t+9)+"\nc-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664\nc-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11\nc0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17\nc242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558\nl0,-"+(t+144)+"c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7,\n-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z";default:throw new Error("Unknown stretchy delimiter.")}})(m,Math.round(1e3*v)),v=new zr(m,v),x=(c/1e3).toFixed(3)+"em",w=(k/1e3).toFixed(3)+"em",v=new Mr([v],{width:x,height:w,viewBox:"0 0 "+c+" "+k}),(v=Pt.makeSvgSpan([],[v],n)).height=k/1e3,v.style.width=x,v.style.height=w,S.push({type:"elem",elem:v})):(S.push(Y0(h,p,a)),S.push(z),null===s?S.push(X0(l,b-d-u+.016,n)):(k=(b-d-u-g)/2+.016,S.push(X0(l,k,n)),S.push(z),S.push(Y0(s,p,a)),S.push(z),S.push(X0(l,k,n))),S.push(z),S.push(Y0(o,p,a))),e=n.havingBaseStyle(yt.TEXT),r=Pt.makeVList({positionType:"bottom",positionData:t,children:S},e),F0(Pt.makeSpan(["delimsizing","mult"],[r],e),yt.TEXT,n,i)}function j0(o,e,t,r,n){return r=((e,t)=>{e*=1e3;let r="";switch(o){case"sqrtMain":r="M95,"+(622+(i=e)+80)+"\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl"+i/2.075+" -"+i+"\nc5.3,-9.3,12,-14,20,-14\nH400000v"+(40+i)+"H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM"+(834+i)+" 80h400000v"+(40+i)+"h-400000z";break;case"sqrtSize1":r="M263,"+(601+(i=e)+80)+"c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl"+i/2.084+" -"+i+"\nc4.7,-7.3,11,-11,19,-11\nH40000v"+(40+i)+"H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM"+(1001+i)+" 80h400000v"+(40+i)+"h-400000z";break;case"sqrtSize2":r="M983 "+(10+(a=e)+80)+"\nl"+a/3.13+" -"+a+"\nc4,-6.7,10,-10,18,-10 H400000v"+(40+a)+"\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM"+(1001+a)+" 80h400000v"+(40+a)+"h-400000z";break;case"sqrtSize3":r="M424,"+(2398+(a=e)+80)+"\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl"+a/4.223+" -"+a+"c4,-6.7,10,-10,18,-10 H400000\nv"+(40+a)+"H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M"+(1001+a)+" 80\nh400000v"+(40+a)+"h-400000z";break;case"sqrtSize4":r="M473,"+(2713+(n=e)+80)+"\nc339.3,-1799.3,509.3,-2700,510,-2702 l"+n/5.298+" -"+n+"\nc3.3,-7.3,9.3,-11,18,-11 H400000v"+(40+n)+"H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM"+(1001+n)+" 80h400000v"+(40+n)+"H1017.7z";break;case"sqrtTall":r="M702 "+(80+(n=e))+"H400000"+(40+n)+"\nH742v"+(t-54-80-n)+"l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 80H400000v"+(40+n)+"H742z"}var n,a,i;return r})(r,t),r=new zr(o,r),r=new Mr([r],{width:"400em",height:D(e),viewBox:"0 0 400000 "+t,preserveAspectRatio:"xMinYMin slice"}),Pt.makeSvgSpan(["hide-tail"],[r],n)}function _0(n,a,i,o){for(let r=Math.min(2,3-o.style.size);r{if("small"===e.type)return"Main-Regular";if("large"===e.type)return"Size"+e.size+"-Regular";if("stack"===e.type)return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")})(i[r]),"math"),t=e.height+e.depth;if("small"===i[r].type&&(t*=o.havingBaseStyle(i[r].style).sizeMultiplier),t>a)return i[r]}return i[i.length-1]}function $0(e,t,r,n,a,i){var o,s,l,h,m,c;return"<"===e||"\\lt"===e||"⟨"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"⟩"!==e||(e="\\rangle"),"small"===(c=_0(e,t,bt.contains(Be,e)?Ce:bt.contains(Ae,e)?qe:Ne,n)).type?(o=e,s=c.style,l=r,m=i,o=F0(Pt.makeSymbol(o,"Main-Regular",a,h=n),s,h,m),l&&G0(o,h,s),o):"large"===c.type?U0(e,c.size,r,n,a,i):W0(e,t,r,n,a,i)}Vt({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(e,t){var{parser:e,funcName:r}=e;return{type:"cdlabel",mode:e.mode,side:r.slice(4),label:t[0]}},htmlBuilder(e,t){var r=t.havingStyle(t.style.sup());return(r=Pt.wrapFragment(P(e.label,r,t),t)).classes.push("cd-label-"+e.side),r.style.bottom=D(.8-r.depth),r.height=0,r.depth=0,r},mathmlBuilder(e,t){let r=new Ut.MathNode("mrow",[w(e.label,t)]);return(r=new Ut.MathNode("mpadded",[r])).setAttribute("width","0"),"left"===e.side&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),(r=new Ut.MathNode("mstyle",[r])).setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}}),Vt({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(e,t){return{type:"cdlabelparent",mode:(e=e.parser).mode,fragment:t[0]}},htmlBuilder(e,t){return(e=Pt.wrapFragment(P(e.fragment,t),t)).classes.push("cd-vert-arrow"),e},mathmlBuilder(e,t){return new Ut.MathNode("mrow",[w(e.fragment,t)])}}),Vt({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(e,t){var e=e.parser,r=Xt(t[0],"ordgroup").body;let n="";for(let e=0;e>10),56320+(1023&t))),{type:"textord",mode:e.mode,text:t}}}),Vt({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(e,t){var e=e.parser,r=Xt(t[0],"color-token").color,t=t[1];return{type:"color",mode:e.mode,color:r,body:Ft(t)}},htmlBuilder:Ht=(e,t)=>(t=Gt(e.body,t.withColor(e.color),!1),Pt.makeFragment(t)),mathmlBuilder:p0=(e,t)=>(t=x(e.body,t.withColor(e.color)),(t=new Ut.MathNode("mstyle",t)).setAttribute("mathcolor",e.color),t)}),Vt({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(e,t){var{parser:e,breakOnTokenText:r}=e,t=Xt(t[0],"color-token").color,r=(e.gullet.macros.set("\\current@color",t),e.parseExpression(!0,r));return{type:"color",mode:e.mode,color:t,body:r}},htmlBuilder:Ht,mathmlBuilder:p0}),Vt({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(e,t,r){var n="["===(e=e.parser).gullet.future().text?e.parseSizeGroup(!0):null,a=!e.settings.displayMode||!e.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:e.mode,newLine:a,size:n&&Xt(n,"size").value}},htmlBuilder(e,t){var r=Pt.makeSpan(["mspace"],[],t);return e.newLine&&(r.classes.push("newline"),e.size)&&(r.style.marginTop=D(wt(e.size,t))),r},mathmlBuilder(e,t){var r=new Ut.MathNode("mspace");return e.newLine&&(r.setAttribute("linebreak","newline"),e.size)&&r.setAttribute("height",D(wt(e.size,t))),r}});let M={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},ke=e=>{var t=e.text;if(/^(?:[\\{}$^_]|EOF)$/.test(t))throw new ft("Expected a control sequence",e);return t},Se=(e,t,r,n)=>{let a=e.gullet.macros.get(r.text);null==a&&(r.noexpand=!0,a={tokens:[r],numArgs:0,unexpandable:!e.gullet.isExpandable(r.text)}),e.gullet.macros.set(t,a,n)},z=(Vt({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(e){var{parser:e,funcName:t}=e,r=(e.consumeSpaces(),e.fetch());if(M[r.text])return"\\global"!==t&&"\\\\globallong"!==t||(r.text=M[r.text]),Xt(e.parseFunction(),"internal");throw new ft("Invalid token after macro prefix",r)}}),Vt({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){let{parser:t,funcName:r}=e,n=t.gullet.popToken();if(e=n.text,/^(?:[\\{}$^_]|EOF)$/.test(e))throw new ft("Expected a control sequence",n);let a,i=0;for(var o=[[]];"{"!==t.gullet.future().text;)if("#"===(n=t.gullet.popToken()).text){if("{"===t.gullet.future().text){a=t.gullet.future(),o[i].push("{");break}if(n=t.gullet.popToken(),!/^[1-9]$/.test(n.text))throw new ft('Invalid argument number "'+n.text+'"');if(parseInt(n.text)!==i+1)throw new ft('Argument number "'+n.text+'" out of order');i++,o.push([])}else{if("EOF"===n.text)throw new ft("Expected a macro definition");o[i].push(n.text)}let s=t.gullet.consumeArg().tokens;return a&&s.unshift(a),"\\edef"!==r&&"\\xdef"!==r||(s=t.gullet.expandTokens(s)).reverse(),t.gullet.macros.set(e,{tokens:s,numArgs:i,delimiters:o},r===M[r]),{type:"internal",mode:t.mode}}}),Vt({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){var{parser:e,funcName:t}=e,r=ke(e.gullet.popToken()),n=(e.gullet.consumeSpaces(),(e=>{let t=e.gullet.popToken();return t="="===t.text&&" "===(t=e.gullet.popToken()).text?e.gullet.popToken():t})(e));return Se(e,r,n,"\\\\globallet"===t),{type:"internal",mode:e.mode}}}),Vt({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){var{parser:e,funcName:t}=e,r=ke(e.gullet.popToken()),n=e.gullet.popToken(),a=e.gullet.popToken();return Se(e,r,a,"\\\\globalfuture"===t),e.gullet.pushToken(a),e.gullet.pushToken(n),{type:"internal",mode:e.mode}}}),{type:"kern",size:-.008}),Me=["|","\\lvert","\\rvert","\\vert"],ze=["\\|","\\lVert","\\rVert","\\Vert"],Ae=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","⌊","⌋","\\lceil","\\rceil","⌈","⌉","\\surd"],Te=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","⟮","⟯","\\lmoustache","\\rmoustache","⎰","⎱"],Be=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],A=[0,1.2,1.8,2.4,3],Ce=[{type:"small",style:yt.SCRIPTSCRIPT},{type:"small",style:yt.SCRIPT},{type:"small",style:yt.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],Ne=[{type:"small",style:yt.SCRIPTSCRIPT},{type:"small",style:yt.SCRIPT},{type:"small",style:yt.TEXT},{type:"stack"}],qe=[{type:"small",style:yt.SCRIPTSCRIPT},{type:"small",style:yt.SCRIPT},{type:"small",style:yt.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}];var Z0={sqrtImage:function(e,t){let r=t.havingBaseSizing(),n=_0("\\surd",e*r.sizeMultiplier,qe,r),a=r.sizeMultiplier;r=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness);let i,o,s=0,l=0,h=0;return o="small"===n.type?(h=1e3+1e3*r+80,e<1?a=1:e<1.4&&(a=.7),s=(1+r+.08)/a,l=(1+r)/a,(i=j0("sqrtMain",s,h,r,t)).style.minWidth="0.853em",.833/a):"large"===n.type?(h=1080*A[n.size],l=(A[n.size]+r)/a,s=(A[n.size]+r+.08)/a,(i=j0("sqrtSize"+n.size,s,h,r,t)).style.minWidth="1.02em",1/a):(s=e+r+.08,l=e+r,h=Math.floor(1e3*e+r)+80,(i=j0("sqrtTall",s,h,r,t)).style.minWidth="0.742em",1.056),i.height=l,i.style.height=D(s),{span:i,advanceWidth:o,ruleWidth:(t.fontMetrics().sqrtRuleThickness+r)*a}},sizedDelim:function(e,t,r,n,a){if("<"===e||"\\lt"===e||"⟨"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"⟩"!==e||(e="\\rangle"),bt.contains(Ae,e)||bt.contains(Be,e))return U0(e,t,!1,r,n,a);if(bt.contains(Te,e))return W0(e,A[t],!1,r,n,a);throw new ft("Illegal delimiter: '"+e+"'")},sizeToMaxHeight:A,customSizedDelim:$0,leftRightDelim:function(e,t,r,n,a,i){var o=n.fontMetrics().axisHeight*n.sizeMultiplier,s=5/n.fontMetrics().ptPerEm,t=Math.max(t-o,r+o);return $0(e,r=Math.max(t/500*901,2*t-s),!0,n,a,i)}};let Ie={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},Re=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","⌊","⌋","\\lceil","\\rceil","⌈","⌉","<",">","\\langle","⟨","\\rangle","⟩","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","⟮","⟯","\\lmoustache","\\rmoustache","⎰","⎱","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function K0(e,t){var r=L0(e);if(r&&bt.contains(Re,r.text))return r;throw new ft(r?"Invalid delimiter '"+r.text+"' after '"+t.funcName+"'":"Invalid delimiter type '"+e.type+"'",e)}function J0(e){if(!e.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}Vt({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:(e,t)=>(t=K0(t[0],e),{type:"delimsizing",mode:e.parser.mode,size:Ie[e.funcName].size,mclass:Ie[e.funcName].mclass,delim:t.text}),htmlBuilder:(e,t)=>"."===e.delim?Pt.makeSpan([e.mclass]):Z0.sizedDelim(e.delim,e.size,t,e.mode,[e.mclass]),mathmlBuilder:e=>{var t=[],t=("."!==e.delim&&t.push(Yt(e.delim,e.mode)),new Ut.MathNode("mo",t)),e=("mopen"===e.mclass||"mclose"===e.mclass?t.setAttribute("fence","true"):t.setAttribute("fence","false"),t.setAttribute("stretchy","true"),D(Z0.sizeToMaxHeight[e.size]));return t.setAttribute("minsize",e),t.setAttribute("maxsize",e),t}}),Vt({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{var r=e.parser.gullet.macros.get("\\current@color");if(r&&"string"!=typeof r)throw new ft("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:e.parser.mode,delim:K0(t[0],e).text,color:r}}}),Vt({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{var t=K0(t[0],e),r=(++(e=e.parser).leftrightDepth,e.parseExpression(!1)),n=(--e.leftrightDepth,e.expect("\\right",!1),Xt(e.parseFunction(),"leftright-right"));return{type:"leftright",mode:e.mode,body:r,left:t.text,right:n.delim,rightColor:n.color}},htmlBuilder:(t,e)=>{J0(t);let r=Gt(t.body,e,!0,["mopen","mclose"]),n,a,i=0,o=0,s=!1;for(let e=0;e{J0(e);var r,t=x(e.body,t);return"."!==e.left&&((r=new Ut.MathNode("mo",[Yt(e.left,e.mode)])).setAttribute("fence","true"),t.unshift(r)),"."!==e.right&&((r=new Ut.MathNode("mo",[Yt(e.right,e.mode)])).setAttribute("fence","true"),e.rightColor&&r.setAttribute("mathcolor",e.rightColor),t.push(r)),C0(t)}}),Vt({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{if(t=K0(t[0],e),e.parser.leftrightDepth)return{type:"middle",mode:e.parser.mode,delim:t.text};throw new ft("\\middle without preceding \\left",t)},htmlBuilder:(e,t)=>{let r;return"."===e.delim?r=z0(t,[]):(r=Z0.sizedDelim(e.delim,1,t,e.mode,[]),e={delim:e.delim,options:t},r.isMiddle=e),r},mathmlBuilder:(e,t)=>(e="\\vert"===e.delim||"|"===e.delim?Yt("|","text"):Yt(e.delim,e.mode),(e=new Ut.MathNode("mo",[e])).setAttribute("fence","true"),e.setAttribute("lspace","0.05em"),e.setAttribute("rspace","0.05em"),e)}),Vt({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler(e,t,r){var{parser:e,funcName:n}=e,a=Xt(t[0],"color-token").color;return{type:"enclose",mode:e.mode,label:n,backgroundColor:a,body:t[1]}},htmlBuilder:Bt=(r,n)=>{let a=Pt.wrapFragment(P(r.body,n),n),i=r.label.slice(1),s,e=n.sizeMultiplier,l=0,h=bt.isCharacterBox(r.body);if("sout"===i)(s=Pt.makeSpan(["stretchy","sout"])).height=n.fontMetrics().defaultRuleThickness/e,l=-.5*n.fontMetrics().xHeight;else if("phase"===i){var t=wt({number:.6,unit:"pt"},n),o=wt({number:.35,unit:"ex"},n),m=(e/=n.havingBaseSizing().sizeMultiplier,a.height+a.depth+t+o),c=(a.style.paddingLeft=D(m/2+t),Math.floor(1e3*m*e)),p="M400000 "+c+" H0 L"+c/2+" 0 l65 45 L145 "+(c-80)+" H400000z",p=new Mr([new zr("phase",p)],{width:"400em",height:D(c/1e3),viewBox:"0 0 400000 "+c,preserveAspectRatio:"xMinYMin slice"});(s=Pt.makeSvgSpan(["hide-tail"],[p],n)).style.height=D(m),l=a.depth+t+o}else{/cancel/.test(i)?h||a.classes.push("cancel-pad"):"angl"===i?a.classes.push("anglpad"):a.classes.push("boxpad");let e=0,o,t=0;o=/box/.test(i)?(t=Math.max(n.fontMetrics().fboxrule,n.minRuleThickness),e=n.fontMetrics().fboxsep+("colorbox"===i?0:t)):"angl"===i?(t=Math.max(n.fontMetrics().defaultRuleThickness,n.minRuleThickness),e=4*t,Math.max(0,.25-a.depth)):e=h?.2:0,s=((e,t,r,n,a)=>{let i;return n=e.height+e.depth+r+o,/fbox|color|angl/.test(t)?(i=Pt.makeSpan(["stretchy",t],[],a),"fbox"===t&&(e=a.color&&a.getColor())&&(i.style.borderColor=e)):(r=[],/^[bx]cancel$/.test(t)&&r.push(new Ar({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&r.push(new Ar({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"})),e=new Mr(r,{width:"100%",height:D(n)}),i=Pt.makeSvgSpan([],[e],a)),i.height=n,i.style.height=D(n),i})(a,i,e,o,n),/fbox|boxed|fcolorbox/.test(i)?(s.style.borderStyle="solid",s.style.borderWidth=D(t)):"angl"===i&&.049!==t&&(s.style.borderTopWidth=D(t),s.style.borderRightWidth=D(t)),l=a.depth+o,r.backgroundColor&&(s.style.backgroundColor=r.backgroundColor,r.borderColor)&&(s.style.borderColor=r.borderColor)}return p=r.backgroundColor?Pt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:s,shift:l},{type:"elem",elem:a,shift:0}]},n):(c=/cancel|phase/.test(i)?["svg-align"]:[],Pt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:a,shift:0},{type:"elem",elem:s,shift:l,wrapperClasses:c}]},n)),/cancel/.test(i)&&(p.height=a.height,p.depth=a.depth),/cancel/.test(i)&&!h?Pt.makeSpan(["mord","cancel-lap"],[p],n):Pt.makeSpan(["mord"],[p],n)},mathmlBuilder:It=(e,t)=>{var r=new Ut.MathNode(-1{if(!e.parser.settings.displayMode)throw new ft("{"+e.envName+"} can be used only in display mode.")};function tr(e){if(-1===e.indexOf("ed"))return-1===e.indexOf("*")}function rr(r,e,n){let{hskipBeforeAndAfter:t,addJot:a,cols:i,arraystretch:o,colSeparationType:s,autoTag:l,singleRow:h,emptySingleRow:m,maxNumCols:c,leqno:p}=e;if(r.gullet.beginGroup(),h||r.gullet.macros.set("\\cr","\\\\\\relax"),!o)if(null==(e=r.gullet.expandMacroAsText("\\arraystretch")))o=1;else if(!(o=parseFloat(e))||o<0)throw new ft("Invalid \\arraystretch: "+e);r.gullet.beginGroup();let d=[],u=[d],g=[],f=[],b=null!=l?[]:void 0;function y(){l&&r.gullet.macros.set("\\@eqnsw","1",!0)}function x(){b&&(r.gullet.macros.get("\\df@tag")?(b.push(r.subparse([new Kt("\\df@tag")])),r.gullet.macros.set("\\df@tag",void 0,!0)):b.push(Boolean(l)&&"1"===r.gullet.macros.get("\\@eqnsw")))}for(y(),f.push(er(r));;){let e=r.parseExpression(!1,h?"\\end":"\\\\"),t=(r.gullet.endGroup(),r.gullet.beginGroup(),e={type:"ordgroup",mode:r.mode,body:e},n&&(e={type:"styling",mode:r.mode,style:n,body:[e]}),d.push(e),r.fetch().text);if("&"===t){if(c&&d.length===c){if(h||s)throw new ft("Too many tab characters: &",r.nextToken);r.settings.reportNonstrict("textEnv","Too few columns specified in the {array} column argument.")}r.consume()}else{if("\\end"===t){x(),1===d.length&&"styling"===e.type&&0===e.body[0].body.length&&(1e))for(l=0;l=c)){(0e.length)),n.cols=new Array(a).fill({type:"align",align:r}),t?{type:"leftright",mode:e.mode,body:[n],left:t[0],right:t[1],rightColor:void 0}:n},htmlBuilder:ar,mathmlBuilder:ir}),Q0({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(e){return(e=rr(e.parser,{arraystretch:.5},"script")).colSeparationType="small",e},htmlBuilder:ar,mathmlBuilder:ir}),Q0({type:"array",names:["subarray"],props:{numArgs:1},handler(e,t){if(1<(t=(L0(t[0])?[t[0]]:Xt(t[0],"ordgroup").body).map(function(e){var t=E0(e).text;if(-1!=="lc".indexOf(t))return{type:"align",align:t};throw new ft("Unknown column alignment: "+t,e)})).length)throw new ft("{subarray} can contain only one column");if(0<(e=rr(e.parser,{cols:t,hskipBeforeAndAfter:!1,arraystretch:.5},"script")).body.length&&1AV".indexOf(l)))throw new ft('Expected one of "<>AV=|." after @',a[n]);for(let r=0;r<2;r++){let t=!0;for(let e=n+1;e{var n=we[e];switch(n){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(n,[t[0]],[t[1]]);case"\\uparrow":case"\\downarrow":var a={type:"atom",text:n,mode:"math",family:"rel"},a={type:"ordgroup",mode:"math",body:[r.callFunction("\\\\cdleft",[t[0]],[]),r.callFunction("\\Big",[a],[]),r.callFunction("\\\\cdright",[t[1]],[])]};return r.callFunction("\\\\cdparent",[a],[]);case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":return r.callFunction("\\Big",[{type:"textord",text:"\\Vert",mode:"math"}],[]);default:return{type:"textord",text:" ",mode:"math"}}})(l,h,o)],mode:"math",style:"display"};r.push(m),e={type:"styling",body:[],mode:"math",style:"display"}}else e.body.push(a[n]);t%2==0?r.push(e):r.shift(),r=[],n.push(r)}return o.gullet.endGroup(),o.gullet.endGroup(),{type:"array",mode:"math",body:n,arraystretch:1,addJot:!0,rowGaps:[null],cols:new Array(n[0].length).fill({type:"align",align:"c",pregap:.25,postgap:.25}),colSeparationType:"CD",hLinesBeforeRow:new Array(n.length+1).fill([])}}},htmlBuilder:ar,mathmlBuilder:ir}),Wt("\\nonumber","\\gdef\\@eqnsw{0}"),Wt("\\notag","\\nonumber"),Vt({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler(e,t){throw new ft(e.funcName+" valid only within array environment")}});var sr=He;function lr(e){let t=null;return t=0{var r=e.font,t=t.withFont(r);return P(e.body,t)},De=(e,t)=>{var r=e.font,t=t.withFont(r);return w(e.body,t)},Pe={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"},Ve=(Vt({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathsfit","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:(e,t)=>{var{parser:e,funcName:r}=e,t=M0(t[0]);let n=r;return n in Pe&&(n=Pe[n]),{type:"font",mode:e.mode,font:n.slice(1),body:t}},htmlBuilder:Le,mathmlBuilder:De}),Vt({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:(e,t)=>{var e=e.parser,t=t[0],r=bt.isCharacterBox(t);return{type:"mclass",mode:e.mode,mclass:S(t),body:[{type:"font",mode:e.mode,font:"boldsymbol",body:t}],isCharacterBox:r}}}),Vt({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:(e,t)=>{var{parser:e,funcName:r,breakOnTokenText:n}=e,a=e.mode,n=e.parseExpression(!0,n);return{type:"font",mode:a,font:"math"+r.slice(1),body:{type:"ordgroup",mode:e.mode,body:n}}},htmlBuilder:Le,mathmlBuilder:De}),(e,t)=>{let r=t;return"display"===e?r=r.id>=yt.SCRIPT.id?r.text():yt.DISPLAY:"text"===e&&r.size===yt.DISPLAY.size?r=yt.TEXT:"script"===e?r=yt.SCRIPT:"scriptscript"===e&&(r=yt.SCRIPTSCRIPT),r}),B=(e,t)=>{var r,n=Ve(e.size,t.style),a=n.fracNum(),i=n.fracDen(),a=t.havingStyle(a),o=P(e.numer,a,t),s=(e.continued&&(s=8.5/t.fontMetrics().ptPerEm,r=3.5/t.fontMetrics().ptPerEm,o.height=o.height{let r=new Ut.MathNode("mfrac",[w(e.numer,t),w(e.denom,t)]);e.hasBarLine?e.barSize&&(n=wt(e.barSize,t),r.setAttribute("linethickness",D(n))):r.setAttribute("linethickness","0px");var n=Ve(e.size,t.style);return n.size!==t.style.size&&(r=new Ut.MathNode("mstyle",[r]),t=n.size===yt.DISPLAY.size?"true":"false",r.setAttribute("displaystyle",t),r.setAttribute("scriptlevel","0")),null==e.leftDelim&&null==e.rightDelim?r:(n=[],null!=e.leftDelim&&((t=new Ut.MathNode("mo",[new Ut.TextNode(e.leftDelim.replace("\\",""))])).setAttribute("fence","true"),n.push(t)),n.push(r),null!=e.rightDelim&&((t=new Ut.MathNode("mo",[new Ut.TextNode(e.rightDelim.replace("\\",""))])).setAttribute("fence","true"),n.push(t)),C0(n))},Fe=(Vt({type:"genfrac",names:["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:(e,t)=>{var{parser:e,funcName:r}=e,n=t[0],t=t[1];let a,i=null,o=null,s="auto";switch(r){case"\\dfrac":case"\\frac":case"\\tfrac":a=!0;break;case"\\\\atopfrac":a=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":a=!1,i="(",o=")";break;case"\\\\bracefrac":a=!1,i="\\{",o="\\}";break;case"\\\\brackfrac":a=!1,i="[",o="]";break;default:throw new Error("Unrecognized genfrac command")}switch(r){case"\\dfrac":case"\\dbinom":s="display";break;case"\\tfrac":case"\\tbinom":s="text"}return{type:"genfrac",mode:e.mode,continued:!1,numer:n,denom:t,hasBarLine:a,leftDelim:i,rightDelim:o,size:s,barSize:null}},htmlBuilder:B,mathmlBuilder:C}),Vt({type:"genfrac",names:["\\cfrac"],props:{numArgs:2},handler:(e,t)=>{var e=e.parser,r=t[0];return{type:"genfrac",mode:e.mode,continued:!0,numer:r,denom:t[1],hasBarLine:!0,leftDelim:null,rightDelim:null,size:"display",barSize:null}}}),Vt({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(e){let t,{parser:r,funcName:n,token:a}=e;switch(n){case"\\over":t="\\frac";break;case"\\choose":t="\\binom";break;case"\\atop":t="\\\\atopfrac";break;case"\\brace":t="\\\\bracefrac";break;case"\\brack":t="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:r.mode,replaceWith:t,token:a}}}),["display","text","script","scriptscript"]),Ge=(Vt({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(e,t){var e=e.parser,r=t[4],n=t[5],a="atom"===(a=M0(t[0])).type&&"open"===a.family?lr(a.text):null,i="atom"===(i=M0(t[1])).type&&"close"===i.family?lr(i.text):null,o=Xt(t[2],"size");let s,l=null,h=(s=!!o.isBlank||0<(l=o.value).number,"auto"),m=t[3];return"ordgroup"===m.type?0{var e=e.parser,r=t[0],n=(e=>{if(e)return e;throw new Error("Expected non-null, but got "+String(e))})(Xt(t[1],"infix").size),a=0{var r=t.style;let n,a;a="supsub"===e.type?(n=e.sup?P(e.sup,t.havingStyle(r.sup()),t):P(e.sub,t.havingStyle(r.sub()),t),Xt(e.base,"horizBrace")):Xt(e,"horizBrace"),r=P(a.base,t.havingBaseStyle(yt.DISPLAY)),e=O0(a,t);let i;return(a.isOver?(i=Pt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:.1},{type:"elem",elem:e}]},t)).children[0].children[0].children[1]:(i=Pt.makeVList({positionType:"bottom",positionData:r.depth+.1+e.height,children:[{type:"elem",elem:e},{type:"kern",size:.1},{type:"elem",elem:r}]},t)).children[0].children[0].children[0]).classes.push("svg-align"),n&&(e=Pt.makeSpan(["mord",a.isOver?"mover":"munder"],[i],t),i=a.isOver?Pt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:e},{type:"kern",size:.2},{type:"elem",elem:n}]},t):Pt.makeVList({positionType:"bottom",positionData:e.depth+.2+n.height+n.depth,children:[{type:"elem",elem:n},{type:"kern",size:.2},{type:"elem",elem:e}]},t)),Pt.makeSpan(["mord",a.isOver?"mover":"munder"],[i],t)}),Ue=(Vt({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(e,t){var{parser:e,funcName:r}=e;return{type:"horizBrace",mode:e.mode,label:r,isOver:/^\\over/.test(r),base:t[0]}},htmlBuilder:Ge,mathmlBuilder:(e,t)=>{var r=H0(e.label);return new Ut.MathNode(e.isOver?"mover":"munder",[w(e.base,t),r])}}),Vt({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:(e,t)=>{var e=e.parser,r=t[1],t=Xt(t[0],"url").url;return e.settings.isTrusted({command:"\\href",url:t})?{type:"href",mode:e.mode,href:t,body:Ft(r)}:e.formatUnsupportedCmd("\\href")},htmlBuilder:(e,t)=>{var r=Gt(e.body,t,!1);return Pt.makeAnchor(e.href,[],r,t)},mathmlBuilder:(e,t)=>{let r=I0(e.body,t);return(r=r instanceof _t?r:new _t("mrow",[r])).setAttribute("href",e.href),r}}),Vt({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:(e,t)=>{var e=e.parser,r=Xt(t[0],"url").url;if(!e.settings.isTrusted({command:"\\url",url:r}))return e.formatUnsupportedCmd("\\url");var n=[];for(let t=0;t{var{parser:r,funcName:n}=e,a=Xt(t[0],"raw").string,e=t[1];let i;r.settings.strict&&r.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var o={};switch(n){case"\\htmlClass":o.class=a,i={command:"\\htmlClass",class:a};break;case"\\htmlId":o.id=a,i={command:"\\htmlId",id:a};break;case"\\htmlStyle":o.style=a,i={command:"\\htmlStyle",style:a};break;case"\\htmlData":var s=a.split(",");for(let e=0;e{var r,n=Gt(e.body,t,!1),a=["enclosing"],i=(e.attributes.class&&a.push(...e.attributes.class.trim().split(/\s+/)),Pt.makeSpan(a,n,t));for(r in e.attributes)"class"!==r&&e.attributes.hasOwnProperty(r)&&i.setAttribute(r,e.attributes[r]);return i},mathmlBuilder:(e,t)=>I0(e.body,t)}),Vt({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:(e,t)=>({type:"htmlmathml",mode:(e=e.parser).mode,html:Ft(t[0]),mathml:Ft(t[1])}),htmlBuilder:(e,t)=>(e=Gt(e.html,t,!1),Pt.makeFragment(e)),mathmlBuilder:(e,t)=>I0(e.mathml,t)}),Vt({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:(e,t,r)=>{let n=e.parser,a={number:0,unit:"em"},i={number:.9,unit:"em"},o={number:0,unit:"em"},s="";if(r[0]){var l=Xt(r[0],"raw").string.split(",");for(let e=0;e{let r=wt(e.height,t),n=0,a=(0{var r=new Ut.MathNode("mglyph",[]);r.setAttribute("alt",e.alt);let n=wt(e.height,t),a=0;return 0{var{parser:e,funcName:r}=e,t=t[0];return{type:"lap",mode:e.mode,alignment:r.slice(5),body:t}},htmlBuilder:(e,t)=>{let r,n=(r="clap"===e.alignment?(r=Pt.makeSpan([],[P(e.body,t)]),Pt.makeSpan(["inner"],[r],t)):Pt.makeSpan(["inner"],[P(e.body,t)]),Pt.makeSpan(["fix"],[])),a=Pt.makeSpan([e.alignment],[r,n],t);return(e=Pt.makeSpan(["strut"])).style.height=D(a.height+a.depth),a.depth&&(e.style.verticalAlign=D(-a.depth)),a.children.unshift(e),a=Pt.makeSpan(["thinbox"],[a],t),Pt.makeSpan(["mord","vbox"],[a],t)},mathmlBuilder:(e,t)=>(t=new Ut.MathNode("mpadded",[w(e.body,t)]),"rlap"!==e.alignment&&(e="llap"===e.alignment?"-1":"-0.5",t.setAttribute("lspace",e+"width")),t.setAttribute("width","0px"),t)}),Vt({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){var{funcName:e,parser:r}=e,n=r.mode,e=(r.switchMode("math"),"\\("===e?"\\)":"$"),a=r.parseExpression(!1,e);return r.expect(e),r.switchMode(n),{type:"styling",mode:r.mode,style:"text",body:a}}}),Vt({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){throw new ft("Mismatched "+e.funcName)}}),(e,t)=>{switch(t.style.size){case yt.DISPLAY.size:return e.display;case yt.TEXT.size:return e.text;case yt.SCRIPT.size:return e.script;case yt.SCRIPTSCRIPT.size:return e.scriptscript;default:return e.text}}),Ye=(Vt({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:(e,t)=>({type:"mathchoice",mode:(e=e.parser).mode,display:Ft(t[0]),text:Ft(t[1]),script:Ft(t[2]),scriptscript:Ft(t[3])}),htmlBuilder:(e,t)=>(e=Gt(e=Ue(e,t),t,!1),Pt.makeFragment(e)),mathmlBuilder:(e,t)=>I0(e=Ue(e,t),t)}),(e,t,r,n,a,i,o)=>{e=Pt.makeSpan([],[e]);let s=r&&bt.isCharacterBox(r),l,h,m;if(t&&(c=P(t,n.havingStyle(a.sup()),n),h={elem:c,kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-c.depth)}),r&&(c=P(r,n.havingStyle(a.sub()),n),l={elem:c,kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-c.height)}),h&&l)r=n.fontMetrics().bigOpSpacing5+l.elem.height+l.elem.depth+l.kern+e.depth+o,m=Pt.makeVList({positionType:"bottom",positionData:r,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:l.elem,marginLeft:D(-i)},{type:"kern",size:l.kern},{type:"elem",elem:e},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:D(i)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n);else if(l)a=e.height-o,m=Pt.makeVList({positionType:"top",positionData:a,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:l.elem,marginLeft:D(-i)},{type:"kern",size:l.kern},{type:"elem",elem:e}]},n);else{if(!h)return e;var c=e.depth+o;m=Pt.makeVList({positionType:"bottom",positionData:c,children:[{type:"elem",elem:e},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:D(i)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}return t=[m],l&&0!==i&&!s&&((r=Pt.makeSpan(["mspace"],[],n)).style.marginRight=D(i),t.unshift(r)),Pt.makeSpan(["mop","op-limits"],t,n)}),Xe=["\\smallint"],N=(e,n)=>{let t,r,a,i=!1;"supsub"===e.type?(t=e.sup,r=e.sub,a=Xt(e.base,"op"),i=!0):a=Xt(e,"op");let o,s=!1;if((e=n.style).size===yt.DISPLAY.size&&a.symbol&&!bt.contains(Xe,a.name)&&(s=!0),a.symbol){let e=s?"Size2-Regular":"Size1-Regular",t="",r;"\\oiint"!==a.name&&"\\oiiint"!==a.name||(t=a.name.slice(1),a.name="oiint"===t?"\\iint":"\\iiint"),o=Pt.makeSymbol(a.name,e,"math",n,["mop","op-symbol",s?"large-op":"small-op"]),0{let r;return e.symbol?(r=new _t("mo",[Yt(e.name,e.mode)]),bt.contains(Xe,e.name)&&r.setAttribute("largeop","false")):r=e.body?new _t("mo",x(e.body,t)):(r=new _t("mi",[new $t(e.name.slice(1))]),t=new _t("mo",[Yt("","text")]),e.parentIsSupSub?new _t("mrow",[r,t]):B0([r,t])),r},We={"∏":"\\prod","∐":"\\coprod","∑":"\\sum","⋀":"\\bigwedge","⋁":"\\bigvee","⋂":"\\bigcap","⋃":"\\bigcup","⨀":"\\bigodot","⨁":"\\bigoplus","⨂":"\\bigotimes","⨄":"\\biguplus","⨆":"\\bigsqcup"},je=(Vt({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","∏","∐","∑","⋀","⋁","⋂","⋃","⨀","⨁","⨂","⨄","⨆"],props:{numArgs:0},handler:(e,t)=>{let{parser:r,funcName:n}=e,a=n;return 1===a.length&&(a=We[a]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:a}},htmlBuilder:N,mathmlBuilder:q}),Vt({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:(e,t)=>(e=e.parser,t=t[0],{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:Ft(t)}),htmlBuilder:N,mathmlBuilder:q}),{"∫":"\\int","∬":"\\iint","∭":"\\iiint","∮":"\\oint","∯":"\\oiint","∰":"\\oiiint"}),_e=(Vt({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(e){var{parser:e,funcName:t}=e;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:t}},htmlBuilder:N,mathmlBuilder:q}),Vt({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(e){var{parser:e,funcName:t}=e;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:t}},htmlBuilder:N,mathmlBuilder:q}),Vt({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","∫","∬","∭","∮","∯","∰"],props:{numArgs:0},handler(e){let{parser:t,funcName:r}=e,n=r;return 1===n.length&&(n=je[n]),{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:N,mathmlBuilder:q}),(e,t)=>{let r,n,a,i,o=!1;if("supsub"===e.type?(r=e.sup,n=e.sub,a=Xt(e.base,"operatorname"),o=!0):a=Xt(e,"operatorname"),0{var t=e.text;return"string"==typeof t?{type:"textord",mode:e.mode,text:t}:e}),t.withFont("mathrm"),!0);for(let e=0;e{var{parser:e,funcName:r}=e,t=t[0];return{type:"operatorname",mode:e.mode,body:Ft(t),alwaysHandleSupSub:"\\operatornamewithlimits"===r,limits:!1,parentIsSupSub:!1}},htmlBuilder:_e,mathmlBuilder:(e,t)=>{let r=x(e.body,t.withFont("mathrm")),n=!0;for(let e=0;ee.toText()).join(""),r=[new Ut.TextNode(o)]),(t=new Ut.MathNode("mi",r)).setAttribute("mathvariant","normal");var o=new Ut.MathNode("mo",[Yt("","text")]);return e.parentIsSupSub?new Ut.MathNode("mrow",[t,o]):Ut.newDocumentFragment([t,o])}}),Wt("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@"),S0({type:"ordgroup",htmlBuilder(e,t){return e.semisimple?Pt.makeFragment(Gt(e.body,t,!1)):Pt.makeSpan(["mord"],Gt(e.body,t,!0),t)},mathmlBuilder(e,t){return I0(e.body,t,!0)}}),Vt({type:"overline",names:["\\overline"],props:{numArgs:1},handler(e,t){return e=e.parser,t=t[0],{type:"overline",mode:e.mode,body:t}},htmlBuilder(e,t){var e=P(e.body,t.havingCrampedStyle()),r=Pt.makeLineSpan("overline-line",t),n=t.fontMetrics().defaultRuleThickness,e=Pt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:e},{type:"kern",size:3*n},{type:"elem",elem:r},{type:"kern",size:n}]},t);return Pt.makeSpan(["mord","overline"],[e],t)},mathmlBuilder(e,t){var r=new Ut.MathNode("mo",[new Ut.TextNode("‾")]);return r.setAttribute("stretchy","true"),(e=new Ut.MathNode("mover",[w(e.body,t),r])).setAttribute("accent","true"),e}}),Vt({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>(e=e.parser,t=t[0],{type:"phantom",mode:e.mode,body:Ft(t)}),htmlBuilder:(e,t)=>(e=Gt(e.body,t.withPhantom(),!1),Pt.makeFragment(e)),mathmlBuilder:(e,t)=>(e=x(e.body,t),new Ut.MathNode("mphantom",e))}),Vt({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>(e=e.parser,t=t[0],{type:"hphantom",mode:e.mode,body:t}),htmlBuilder:(e,t)=>{let r=Pt.makeSpan([],[P(e.body,t.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(let e=0;e(e=x(Ft(e.body),t),t=new Ut.MathNode("mphantom",e),(e=new Ut.MathNode("mpadded",[t])).setAttribute("height","0px"),e.setAttribute("depth","0px"),e)}),Vt({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>(e=e.parser,t=t[0],{type:"vphantom",mode:e.mode,body:t}),htmlBuilder:(e,t)=>{var e=Pt.makeSpan(["inner"],[P(e.body,t.withPhantom())]),r=Pt.makeSpan(["fix"],[]);return Pt.makeSpan(["mord","rlap"],[e,r],t)},mathmlBuilder:(e,t)=>(e=x(Ft(e.body),t),t=new Ut.MathNode("mphantom",e),(e=new Ut.MathNode("mpadded",[t])).setAttribute("width","0px"),e)}),Vt({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(e,t){var e=e.parser,r=Xt(t[0],"size").value;return{type:"raisebox",mode:e.mode,dy:r,body:t[1]}},htmlBuilder(e,t){var r=P(e.body,t),e=wt(e.dy,t);return Pt.makeVList({positionType:"shift",positionData:-e,children:[{type:"elem",elem:r}]},t)},mathmlBuilder(e,t){return t=new Ut.MathNode("mpadded",[w(e.body,t)]),e=e.dy.number+e.dy.unit,t.setAttribute("voffset",e),t}}),Vt({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0,allowedInArgument:!0},handler(e){return{type:"internal",mode:(e=e.parser).mode}}}),Vt({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["size","size","size"]},handler(e,t,r){var e=e.parser,r=r[0],n=Xt(t[0],"size"),t=Xt(t[1],"size");return{type:"rule",mode:e.mode,shift:r&&Xt(r,"size").value,width:n.value,height:t.value}},htmlBuilder(e,t){var r=Pt.makeSpan(["mord","rule"],[],t),n=wt(e.width,t),a=wt(e.height,t),e=e.shift?wt(e.shift,t):0;return r.style.borderRightWidth=D(n),r.style.borderTopWidth=D(a),r.style.bottom=D(e),r.width=n,r.height=a+e,r.depth=-e,r.maxFontSize=1.125*a*t.sizeMultiplier,r},mathmlBuilder(e,t){var r=wt(e.width,t),n=wt(e.height,t),e=e.shift?wt(e.shift,t):0,t=t.color&&t.getColor()||"black",a=new Ut.MathNode("mspace"),t=(a.setAttribute("mathbackground",t),a.setAttribute("width",D(r)),a.setAttribute("height",D(n)),new Ut.MathNode("mpadded",[a]));return 0<=e?t.setAttribute("height",D(e)):(t.setAttribute("height",D(e)),t.setAttribute("depth",D(-e))),t.setAttribute("voffset",D(e)),t}});let $e=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"],Ze=(Vt({type:"sizing",names:$e,props:{numArgs:0,allowedInText:!0},handler:(e,t)=>{var{breakOnTokenText:e,funcName:r,parser:n}=e,e=n.parseExpression(!1,e);return{type:"sizing",mode:n.mode,size:$e.indexOf(r)+1,body:e}},htmlBuilder:(e,t)=>{var r=t.havingSize(e.size);return mr(e.body,r,t)},mathmlBuilder:(e,t)=>(t=t.havingSize(e.size),e=x(e.body,t),(e=new Ut.MathNode("mstyle",e)).setAttribute("mathsize",D(t.sizeMultiplier)),e)}),Vt({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:(e,t,r)=>{let n=e.parser,a=!1,i=!1,o=r[0]&&Xt(r[0],"ordgroup"),s;if(o)for(let e=0;e{var r=Pt.makeSpan([],[P(e.body,t)]);if(!e.smashHeight&&!e.smashDepth)return r;if(e.smashHeight&&(r.height=0,r.children))for(let e=0;e(t=new Ut.MathNode("mpadded",[w(e.body,t)]),e.smashHeight&&t.setAttribute("height","0px"),e.smashDepth&&t.setAttribute("depth","0px"),t)}),Vt({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){return e=e.parser,r=r[0],t=t[0],{type:"sqrt",mode:e.mode,body:t,index:r}},htmlBuilder(e,t){let r=P(e.body,t.havingCrampedStyle()),n=(0===r.height&&(r.height=t.fontMetrics().xHeight),r=Pt.wrapFragment(r,t),t.fontMetrics().defaultRuleThickness),a=n,i=n+(t.style.idr.height+r.depth+i&&(i=(i+m-r.height-r.depth)/2);var c,p=s.height-r.height-i-l,p=(r.style.paddingLeft=D(h),Pt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+p)},{type:"elem",elem:s},{type:"kern",size:l}]},t));return e.index?(c=t.havingStyle(yt.SCRIPTSCRIPT),e=P(e.index,c,t),c=.6*(p.height-p.depth),c=Pt.makeVList({positionType:"shift",positionData:-c,children:[{type:"elem",elem:e}]},t),e=Pt.makeSpan(["root"],[c]),Pt.makeSpan(["mord","sqrt"],[e,p],t)):Pt.makeSpan(["mord","sqrt"],[p],t)},mathmlBuilder(e,t){var{body:e,index:r}=e;return r?new Ut.MathNode("mroot",[w(e,t),w(r,t)]):new Ut.MathNode("msqrt",[w(e,t)])}}),{display:yt.DISPLAY,text:yt.TEXT,script:yt.SCRIPT,scriptscript:yt.SCRIPTSCRIPT}),Ke=(Vt({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e,t){var{breakOnTokenText:e,funcName:r,parser:n}=e,e=n.parseExpression(!0,e),r=r.slice(1,r.length-5);return{type:"styling",mode:n.mode,style:r,body:e}},htmlBuilder(e,t){var r=Ze[e.style],r=t.havingStyle(r).withFont("");return mr(e.body,r,t)},mathmlBuilder(e,t){var r=Ze[e.style],t=t.havingStyle(r),r=x(e.body,t),t=new Ut.MathNode("mstyle",r),r={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[e.style];return t.setAttribute("scriptlevel",r[0]),t.setAttribute("displaystyle",r[1]),t}}),S0({type:"supsub",htmlBuilder(e,t){var r=t;if(i=(a=(n=e).base)?"op"===a.type?a.limits&&(r.style.size===yt.DISPLAY.size||a.alwaysHandleSupSub)?N:null:"operatorname"===a.type?a.alwaysHandleSupSub&&(r.style.size===yt.DISPLAY.size||a.limits)?_e:null:"accent"===a.type?bt.isCharacterBox(a.base)?v:null:"horizBrace"===a.type&&!n.sub===a.isOver?Ge:null:null)return i(e,t);var{base:r,sup:n,sub:a}=e,i=P(r,t);let o,s,l=t.fontMetrics(),h=0,m=0;r=r&&bt.isCharacterBox(r),n&&(d=t.havingStyle(t.style.sup()),o=P(n,d,t),r||(h=i.height-d.fontMetrics().supDrop*d.sizeMultiplier/t.sizeMultiplier)),a&&(d=t.havingStyle(t.style.sub()),s=P(a,d,t),r||(m=i.depth+d.fontMetrics().subDrop*d.sizeMultiplier/t.sizeMultiplier)),n=t.style===yt.DISPLAY?l.sup1:t.style.cramped?l.sup3:l.sup2,a=t.sizeMultiplier,r=D(.5/l.ptPerEm/a);let c,p=null;if(s&&(d=e.base&&"op"===e.base.type&&e.base.name&&("\\oiint"===e.base.name||"\\oiiint"===e.base.name),i instanceof jt||d)&&(p=D(-i.italic)),o&&s)h=Math.max(h,n,o.depth+.25*l.xHeight),m=Math.max(m,l.sub2),e=4*l.defaultRuleThickness,h-o.depth-(s.height-m){var e=new Ut.MathNode("mtd",[]);return e.setAttribute("width","50%"),e}),et=(S0({type:"tag",mathmlBuilder(e,t){return(e=new Ut.MathNode("mtable",[new Ut.MathNode("mtr",[Qe(),new Ut.MathNode("mtd",[I0(e.body,t)]),Qe(),new Ut.MathNode("mtd",[I0(e.tag,t)])])])).setAttribute("width","100%"),e}}),{"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"}),tt={"\\textbf":"textbf","\\textmd":"textmd"},rt={"\\textit":"textit","\\textup":"textup"},nt=(e,t)=>(e=e.font)?et[e]?t.withTextFontFamily(et[e]):tt[e]?t.withTextFontWeight(tt[e]):"\\emph"===e?"textit"===t.fontShape?t.withTextFontShape("textup"):t.withTextFontShape("textit"):t.withTextFontShape(rt[e]):t,at=(Vt({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(e,t){var{parser:e,funcName:r}=e,t=t[0];return{type:"text",mode:e.mode,body:Ft(t),font:r}},htmlBuilder(e,t){return t=nt(e,t),e=Gt(e.body,t,!0),Pt.makeSpan(["mord","text"],e,t)},mathmlBuilder(e,t){return t=nt(e,t),I0(e.body,t)}}),Vt({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(e,t){return{type:"underline",mode:(e=e.parser).mode,body:t[0]}},htmlBuilder(e,t){var e=P(e.body,t),r=Pt.makeLineSpan("underline-line",t),n=t.fontMetrics().defaultRuleThickness,r=Pt.makeVList({positionType:"top",positionData:e.height,children:[{type:"kern",size:n},{type:"elem",elem:r},{type:"kern",size:3*n},{type:"elem",elem:e}]},t);return Pt.makeSpan(["mord","underline"],[r],t)},mathmlBuilder(e,t){var r=new Ut.MathNode("mo",[new Ut.TextNode("‾")]);return r.setAttribute("stretchy","true"),(e=new Ut.MathNode("munder",[w(e.body,t),r])).setAttribute("accentunder","true"),e}}),Vt({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(e,t){return{type:"vcenter",mode:(e=e.parser).mode,body:t[0]}},htmlBuilder(e,t){var e=P(e.body,t),r=t.fontMetrics().axisHeight,r=.5*(e.height-r-(e.depth+r));return Pt.makeVList({positionType:"shift",positionData:r,children:[{type:"elem",elem:e}]},t)},mathmlBuilder(e,t){return new Ut.MathNode("mpadded",[w(e.body,t)],["vcenter"])}}),Vt({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(e,t,r){throw new ft("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(r,e){var n=at(r),a=[],i=e.havingStyle(e.style.text());for(let t=0;te.body.replace(/ /g,e.star?"␣":" "));var cr=se;let it=new RegExp("[̀-ͯ]+$");class Tr{constructor(e,t){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=e,this.settings=t,this.tokenRegex=new RegExp("([ \r\n\t]+)|\\\\(\n|[ \r\t]+\n?)[ \r\t]*|([!-\\[\\]-‧-豈-][̀-ͯ]*|[\ud800-\udbff][\udc00-\udfff][̀-ͯ]*|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5|(\\\\[a-zA-Z@]+)[ \r\n\t]*|\\\\[^\ud800-\udfff])","g"),this.catcodes={"%":14,"~":13}}setCatcode(e,t){this.catcodes[e]=t}lex(){var e=this.input,t=this.tokenRegex.lastIndex;if(t===e.length)return new Kt("EOF",new Zt(this,t,t));var r=this.tokenRegex.exec(e);if(null===r||r.index!==t)throw new ft("Unexpected character: '"+e[t]+"'",new Kt(e[t],new Zt(this,t,t+1)));return r=r[6]||r[3]||(r[2]?"\\ ":" "),14!==this.catcodes[r]?new Kt(r,new Zt(this,t,this.tokenRegex.lastIndex)):(-1===(r=e.indexOf("\n",this.tokenRegex.lastIndex))?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=r+1,this.lex())}}class Br{constructor(e,t){void 0===e&&(e={}),void 0===t&&(t={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=t,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(0===this.undefStack.length)throw new ft("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e,t=this.undefStack.pop();for(e in t)t.hasOwnProperty(e)&&(null==t[e]?delete this.current[e]:this.current[e]=t[e])}endGroups(){for(;0=t)throw new ft("Invalid base-"+t+" digit "+r.text);for(var a;null!=(a=ot[e.future().text])&&a{let a=r.consumeArg().tokens;if(1!==a.length)throw new ft("\\newcommand's first argument must be a macro name");var i=a[0].text,o=r.isDefined(i);if(o&&!e)throw new ft("\\newcommand{"+i+"} attempting to redefine "+i+"; use \\renewcommand");if(!o&&!t)throw new ft("\\renewcommand{"+i+"} when command "+i+" does not yet exist; use \\newcommand");let s=0;if(1===(a=r.consumeArg().tokens).length&&"["===a[0].text){let e="",t=r.expandNextToken();for(;"]"!==t.text&&"EOF"!==t.text;)e+=t.text,t=r.expandNextToken();if(!e.match(/^\s*[0-9]+\s*$/))throw new ft("Invalid number of arguments: "+e);s=parseInt(e),a=r.consumeArg().tokens}return o&&n||r.macros.set(i,{tokens:a,numArgs:s}),""}),lt=(Wt("\\newcommand",e=>st(e,!1,!0,!1)),Wt("\\renewcommand",e=>st(e,!0,!1,!1)),Wt("\\providecommand",e=>st(e,!0,!0,!0)),Wt("\\message",e=>(e=e.consumeArgs(1)[0],console.log(e.reverse().map(e=>e.text).join("")),"")),Wt("\\errmessage",e=>(e=e.consumeArgs(1)[0],console.error(e.reverse().map(e=>e.text).join("")),"")),Wt("\\show",e=>{var t=e.popToken(),r=t.text;return console.log(t,e.macros.get(r),cr[r],vt.math[r],vt.text[r]),""}),Wt("\\bgroup","{"),Wt("\\egroup","}"),Wt("~","\\nobreakspace"),Wt("\\lq","`"),Wt("\\rq","'"),Wt("\\aa","\\r a"),Wt("\\AA","\\r A"),Wt("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`©}"),Wt("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"),Wt("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`®}"),Wt("ℬ","\\mathscr{B}"),Wt("ℰ","\\mathscr{E}"),Wt("ℱ","\\mathscr{F}"),Wt("ℋ","\\mathscr{H}"),Wt("ℐ","\\mathscr{I}"),Wt("ℒ","\\mathscr{L}"),Wt("ℳ","\\mathscr{M}"),Wt("ℛ","\\mathscr{R}"),Wt("ℭ","\\mathfrak{C}"),Wt("ℌ","\\mathfrak{H}"),Wt("ℨ","\\mathfrak{Z}"),Wt("\\Bbbk","\\Bbb{k}"),Wt("·","\\cdotp"),Wt("\\llap","\\mathllap{\\textrm{#1}}"),Wt("\\rlap","\\mathrlap{\\textrm{#1}}"),Wt("\\clap","\\mathclap{\\textrm{#1}}"),Wt("\\mathstrut","\\vphantom{(}"),Wt("\\underbar","\\underline{\\text{#1}}"),Wt("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'),Wt("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`≠}}"),Wt("\\ne","\\neq"),Wt("≠","\\neq"),Wt("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`∉}}"),Wt("∉","\\notin"),Wt("≘","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`≘}}"),Wt("≙","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`≘}}"),Wt("≚","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`≚}}"),Wt("≛","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`≛}}"),Wt("≝","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`≝}}"),Wt("≞","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`≞}}"),Wt("≟","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`≟}}"),Wt("⟂","\\perp"),Wt("‼","\\mathclose{!\\mkern-0.8mu!}"),Wt("∌","\\notni"),Wt("⌜","\\ulcorner"),Wt("⌝","\\urcorner"),Wt("⌞","\\llcorner"),Wt("⌟","\\lrcorner"),Wt("©","\\copyright"),Wt("®","\\textregistered"),Wt("️","\\textregistered"),Wt("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}'),Wt("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}'),Wt("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}'),Wt("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}'),Wt("\\vdots","{\\varvdots\\rule{0pt}{15pt}}"),Wt("⋮","\\vdots"),Wt("\\varGamma","\\mathit{\\Gamma}"),Wt("\\varDelta","\\mathit{\\Delta}"),Wt("\\varTheta","\\mathit{\\Theta}"),Wt("\\varLambda","\\mathit{\\Lambda}"),Wt("\\varXi","\\mathit{\\Xi}"),Wt("\\varPi","\\mathit{\\Pi}"),Wt("\\varSigma","\\mathit{\\Sigma}"),Wt("\\varUpsilon","\\mathit{\\Upsilon}"),Wt("\\varPhi","\\mathit{\\Phi}"),Wt("\\varPsi","\\mathit{\\Psi}"),Wt("\\varOmega","\\mathit{\\Omega}"),Wt("\\substack","\\begin{subarray}{c}#1\\end{subarray}"),Wt("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax"),Wt("\\boxed","\\fbox{$\\displaystyle{#1}$}"),Wt("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;"),Wt("\\implies","\\DOTSB\\;\\Longrightarrow\\;"),Wt("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;"),Wt("\\dddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ...}}{#1}}"),Wt("\\ddddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ....}}{#1}}"),{",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"}),ht=(Wt("\\dots",function(e){let t="\\dotso";return(e=e.expandAfterFuture().text)in lt?t=lt[e]:("\\not"===e.slice(0,4)||e in vt.math&&bt.contains(["bin","rel"],vt.math[e].group))&&(t="\\dotsb"),t}),{")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0}),mt=(Wt("\\dotso",function(e){return e.future().text in ht?"\\ldots\\,":"\\ldots"}),Wt("\\dotsc",function(e){return(e=e.future().text)in ht&&","!==e?"\\ldots\\,":"\\ldots"}),Wt("\\cdots",function(e){return e.future().text in ht?"\\@cdots\\,":"\\@cdots"}),Wt("\\dotsb","\\cdots"),Wt("\\dotsm","\\cdots"),Wt("\\dotsi","\\!\\cdots"),Wt("\\dotsx","\\ldots\\,"),Wt("\\DOTSI","\\relax"),Wt("\\DOTSB","\\relax"),Wt("\\DOTSX","\\relax"),Wt("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),Wt("\\,","\\tmspace+{3mu}{.1667em}"),Wt("\\thinspace","\\,"),Wt("\\>","\\mskip{4mu}"),Wt("\\:","\\tmspace+{4mu}{.2222em}"),Wt("\\medspace","\\:"),Wt("\\;","\\tmspace+{5mu}{.2777em}"),Wt("\\thickspace","\\;"),Wt("\\!","\\tmspace-{3mu}{.1667em}"),Wt("\\negthinspace","\\!"),Wt("\\negmedspace","\\tmspace-{4mu}{.2222em}"),Wt("\\negthickspace","\\tmspace-{5mu}{.277em}"),Wt("\\enspace","\\kern.5em "),Wt("\\enskip","\\hskip.5em\\relax"),Wt("\\quad","\\hskip1em\\relax"),Wt("\\qquad","\\hskip2em\\relax"),Wt("\\tag","\\@ifstar\\tag@literal\\tag@paren"),Wt("\\tag@paren","\\tag@literal{({#1})}"),Wt("\\tag@literal",e=>{if(e.macros.get("\\df@tag"))throw new ft("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"}),Wt("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),Wt("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),Wt("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),Wt("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),Wt("\\newline","\\\\\\relax"),Wt("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}"),Wt("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+(Ct=D(xt["Main-Regular"]["T".charCodeAt(0)][1]-.7*xt["Main-Regular"]["A".charCodeAt(0)][1]))+"}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}"),Wt("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+Ct+"}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}"),Wt("\\hspace","\\@ifstar\\@hspacer\\@hspace"),Wt("\\@hspace","\\hskip #1\\relax"),Wt("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),Wt("\\ordinarycolon",":"),Wt("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),Wt("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),Wt("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),Wt("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),Wt("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),Wt("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),Wt("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),Wt("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),Wt("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),Wt("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),Wt("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),Wt("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),Wt("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),Wt("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),Wt("∷","\\dblcolon"),Wt("∹","\\eqcolon"),Wt("≔","\\coloneqq"),Wt("≕","\\eqqcolon"),Wt("⩴","\\Coloneqq"),Wt("\\ratio","\\vcentcolon"),Wt("\\coloncolon","\\dblcolon"),Wt("\\colonequals","\\coloneqq"),Wt("\\coloncolonequals","\\Coloneqq"),Wt("\\equalscolon","\\eqqcolon"),Wt("\\equalscoloncolon","\\Eqqcolon"),Wt("\\colonminus","\\coloneq"),Wt("\\coloncolonminus","\\Coloneq"),Wt("\\minuscolon","\\eqcolon"),Wt("\\minuscoloncolon","\\Eqcolon"),Wt("\\coloncolonapprox","\\Colonapprox"),Wt("\\coloncolonsim","\\Colonsim"),Wt("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Wt("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Wt("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Wt("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Wt("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`∌}}"),Wt("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),Wt("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),Wt("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}"),Wt("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}"),Wt("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}"),Wt("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}"),Wt("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}"),Wt("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}"),Wt("\\gvertneqq","\\html@mathml{\\@gvertneqq}{≩}"),Wt("\\lvertneqq","\\html@mathml{\\@lvertneqq}{≨}"),Wt("\\ngeqq","\\html@mathml{\\@ngeqq}{≱}"),Wt("\\ngeqslant","\\html@mathml{\\@ngeqslant}{≱}"),Wt("\\nleqq","\\html@mathml{\\@nleqq}{≰}"),Wt("\\nleqslant","\\html@mathml{\\@nleqslant}{≰}"),Wt("\\nshortmid","\\html@mathml{\\@nshortmid}{∤}"),Wt("\\nshortparallel","\\html@mathml{\\@nshortparallel}{∦}"),Wt("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{⊈}"),Wt("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{⊉}"),Wt("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{⊊}"),Wt("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{⫋}"),Wt("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{⊋}"),Wt("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{⫌}"),Wt("\\imath","\\html@mathml{\\@imath}{ı}"),Wt("\\jmath","\\html@mathml{\\@jmath}{ȷ}"),Wt("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`⟦}}"),Wt("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`⟧}}"),Wt("⟦","\\llbracket"),Wt("⟧","\\rrbracket"),Wt("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`⦃}}"),Wt("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`⦄}}"),Wt("⦃","\\lBrace"),Wt("⦄","\\rBrace"),Wt("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`⦵}}"),Wt("⦵","\\minuso"),Wt("\\darr","\\downarrow"),Wt("\\dArr","\\Downarrow"),Wt("\\Darr","\\Downarrow"),Wt("\\lang","\\langle"),Wt("\\rang","\\rangle"),Wt("\\uarr","\\uparrow"),Wt("\\uArr","\\Uparrow"),Wt("\\Uarr","\\Uparrow"),Wt("\\N","\\mathbb{N}"),Wt("\\R","\\mathbb{R}"),Wt("\\Z","\\mathbb{Z}"),Wt("\\alef","\\aleph"),Wt("\\alefsym","\\aleph"),Wt("\\Alpha","\\mathrm{A}"),Wt("\\Beta","\\mathrm{B}"),Wt("\\bull","\\bullet"),Wt("\\Chi","\\mathrm{X}"),Wt("\\clubs","\\clubsuit"),Wt("\\cnums","\\mathbb{C}"),Wt("\\Complex","\\mathbb{C}"),Wt("\\Dagger","\\ddagger"),Wt("\\diamonds","\\diamondsuit"),Wt("\\empty","\\emptyset"),Wt("\\Epsilon","\\mathrm{E}"),Wt("\\Eta","\\mathrm{H}"),Wt("\\exist","\\exists"),Wt("\\harr","\\leftrightarrow"),Wt("\\hArr","\\Leftrightarrow"),Wt("\\Harr","\\Leftrightarrow"),Wt("\\hearts","\\heartsuit"),Wt("\\image","\\Im"),Wt("\\infin","\\infty"),Wt("\\Iota","\\mathrm{I}"),Wt("\\isin","\\in"),Wt("\\Kappa","\\mathrm{K}"),Wt("\\larr","\\leftarrow"),Wt("\\lArr","\\Leftarrow"),Wt("\\Larr","\\Leftarrow"),Wt("\\lrarr","\\leftrightarrow"),Wt("\\lrArr","\\Leftrightarrow"),Wt("\\Lrarr","\\Leftrightarrow"),Wt("\\Mu","\\mathrm{M}"),Wt("\\natnums","\\mathbb{N}"),Wt("\\Nu","\\mathrm{N}"),Wt("\\Omicron","\\mathrm{O}"),Wt("\\plusmn","\\pm"),Wt("\\rarr","\\rightarrow"),Wt("\\rArr","\\Rightarrow"),Wt("\\Rarr","\\Rightarrow"),Wt("\\real","\\Re"),Wt("\\reals","\\mathbb{R}"),Wt("\\Reals","\\mathbb{R}"),Wt("\\Rho","\\mathrm{P}"),Wt("\\sdot","\\cdot"),Wt("\\sect","\\S"),Wt("\\spades","\\spadesuit"),Wt("\\sub","\\subset"),Wt("\\sube","\\subseteq"),Wt("\\supe","\\supseteq"),Wt("\\Tau","\\mathrm{T}"),Wt("\\thetasym","\\vartheta"),Wt("\\weierp","\\wp"),Wt("\\Zeta","\\mathrm{Z}"),Wt("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),Wt("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),Wt("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits"),Wt("\\bra","\\mathinner{\\langle{#1}|}"),Wt("\\ket","\\mathinner{|{#1}\\rangle}"),Wt("\\braket","\\mathinner{\\langle{#1}\\rangle}"),Wt("\\Bra","\\left\\langle#1\\right|"),Wt("\\Ket","\\left|#1\\right\\rangle"),Wt("\\bra@ket",(Rt=l=>e=>{let t=e.consumeArg().tokens,n=e.consumeArg().tokens,a=e.consumeArg().tokens,r=e.consumeArg().tokens,i=e.macros.get("|"),o=e.macros.get("\\|");e.macros.beginGroup();var s=r=>e=>{l&&(e.macros.set("|",i),a.length)&&e.macros.set("\\|",o);let t=r;return!r&&a.length&&"|"===e.future().text&&(e.popToken(),t=!0),{tokens:t?a:n,numArgs:0}},s=(e.macros.set("|",s(!1)),a.length&&e.macros.set("\\|",s(!0)),e.consumeArg().tokens),s=e.expandTokens([...r,...s,...t]);return e.macros.endGroup(),{tokens:s.reverse(),numArgs:0}})(!1)),Wt("\\bra@set",Rt(!0)),Wt("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}"),Wt("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}"),Wt("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}"),Wt("\\angln","{\\angl n}"),Wt("\\blue","\\textcolor{##6495ed}{#1}"),Wt("\\orange","\\textcolor{##ffa500}{#1}"),Wt("\\pink","\\textcolor{##ff00af}{#1}"),Wt("\\red","\\textcolor{##df0030}{#1}"),Wt("\\green","\\textcolor{##28ae7b}{#1}"),Wt("\\gray","\\textcolor{gray}{#1}"),Wt("\\purple","\\textcolor{##9d38bd}{#1}"),Wt("\\blueA","\\textcolor{##ccfaff}{#1}"),Wt("\\blueB","\\textcolor{##80f6ff}{#1}"),Wt("\\blueC","\\textcolor{##63d9ea}{#1}"),Wt("\\blueD","\\textcolor{##11accd}{#1}"),Wt("\\blueE","\\textcolor{##0c7f99}{#1}"),Wt("\\tealA","\\textcolor{##94fff5}{#1}"),Wt("\\tealB","\\textcolor{##26edd5}{#1}"),Wt("\\tealC","\\textcolor{##01d1c1}{#1}"),Wt("\\tealD","\\textcolor{##01a995}{#1}"),Wt("\\tealE","\\textcolor{##208170}{#1}"),Wt("\\greenA","\\textcolor{##b6ffb0}{#1}"),Wt("\\greenB","\\textcolor{##8af281}{#1}"),Wt("\\greenC","\\textcolor{##74cf70}{#1}"),Wt("\\greenD","\\textcolor{##1fab54}{#1}"),Wt("\\greenE","\\textcolor{##0d923f}{#1}"),Wt("\\goldA","\\textcolor{##ffd0a9}{#1}"),Wt("\\goldB","\\textcolor{##ffbb71}{#1}"),Wt("\\goldC","\\textcolor{##ff9c39}{#1}"),Wt("\\goldD","\\textcolor{##e07d10}{#1}"),Wt("\\goldE","\\textcolor{##a75a05}{#1}"),Wt("\\redA","\\textcolor{##fca9a9}{#1}"),Wt("\\redB","\\textcolor{##ff8482}{#1}"),Wt("\\redC","\\textcolor{##f9685d}{#1}"),Wt("\\redD","\\textcolor{##e84d39}{#1}"),Wt("\\redE","\\textcolor{##bc2612}{#1}"),Wt("\\maroonA","\\textcolor{##ffbde0}{#1}"),Wt("\\maroonB","\\textcolor{##ff92c6}{#1}"),Wt("\\maroonC","\\textcolor{##ed5fa6}{#1}"),Wt("\\maroonD","\\textcolor{##ca337c}{#1}"),Wt("\\maroonE","\\textcolor{##9e034e}{#1}"),Wt("\\purpleA","\\textcolor{##ddd7ff}{#1}"),Wt("\\purpleB","\\textcolor{##c6b9fc}{#1}"),Wt("\\purpleC","\\textcolor{##aa87ff}{#1}"),Wt("\\purpleD","\\textcolor{##7854ab}{#1}"),Wt("\\purpleE","\\textcolor{##543b78}{#1}"),Wt("\\mintA","\\textcolor{##f5f9e8}{#1}"),Wt("\\mintB","\\textcolor{##edf2df}{#1}"),Wt("\\mintC","\\textcolor{##e0e5cc}{#1}"),Wt("\\grayA","\\textcolor{##f6f7f7}{#1}"),Wt("\\grayB","\\textcolor{##f0f1f2}{#1}"),Wt("\\grayC","\\textcolor{##e3e5e6}{#1}"),Wt("\\grayD","\\textcolor{##d6d8da}{#1}"),Wt("\\grayE","\\textcolor{##babec2}{#1}"),Wt("\\grayF","\\textcolor{##888d93}{#1}"),Wt("\\grayG","\\textcolor{##626569}{#1}"),Wt("\\grayH","\\textcolor{##3b3e40}{#1}"),Wt("\\grayI","\\textcolor{##21242c}{#1}"),Wt("\\kaBlue","\\textcolor{##314453}{#1}"),Wt("\\kaGreen","\\textcolor{##71B307}{#1}"),{"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0});class Cr{constructor(e,t,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new Br(pr,t.macros),this.mode=r,this.stack=[]}feed(e){this.lexer=new Tr(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){let t,r,n;if(e){if(this.consumeSpaces(),"["!==this.future().text)return null;t=this.popToken(),{tokens:n,end:r}=this.consumeArg(["]"])}else({tokens:n,start:t,end:r}=this.consumeArg());return this.pushToken(new Kt("EOF",r.loc)),this.pushTokens(n),new Kt("",Zt.range(t,r))}consumeSpaces(){for(;" "===this.future().text;)this.stack.pop()}consumeArg(e){let t=[],r=e&&0this.settings.maxExpand)throw new ft("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var t=this.popToken(),r=t.text,n=t.noexpand?null:this._getExpansion(r);if(null==n||e&&n.unexpandable){if(e&&null==n&&"\\"===r[0]&&!this.isDefined(r))throw new ft("Undefined control sequence: "+r);return this.pushToken(t),!1}this.countExpansion(1);let a=n.tokens,i=this.consumeArgs(n.numArgs,n.delimiters);if(n.numArgs)for(let e=(a=a.slice()).length-1;0<=e;--e){var o=a[e];if("#"===o.text){if(0===e)throw new ft("Incomplete placeholder at end of macro body",o);if("#"===(o=a[--e]).text)a.splice(e+1,1);else{if(!/^[1-9]$/.test(o.text))throw new ft("Not a valid argument number",o);a.splice(e,2,...i[+o.text-1])}}}return this.pushTokens(a),a.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;){var e;if(!1===this.expandOnce())return(e=this.stack.pop()).treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new Kt(e)]):void 0}expandTokens(e){var t,r=[],n=this.stack.length;for(this.pushTokens(e);this.stack.length>n;)!1===this.expandOnce(!0)&&((t=this.stack.pop()).treatAsRelax&&(t.noexpand=!1,t.treatAsRelax=!1),r.push(t));return this.countExpansion(r.length),r}expandMacroAsText(e){return(e=this.expandMacro(e))&&e.map(e=>e.text).join("")}_getExpansion(a){var e=this.macros.get(a);if(null==e)return e;if(1===a.length){var t=this.lexer.catcodes[a];if(null!=t&&13!==t)return}if("string"!=typeof(a="function"==typeof e?e(this):e))return a;{let e=0;if(-1!==a.indexOf("#"))for(var i=a.replace(/##/g,"");-1!==i.indexOf("#"+(e+1));)++e;let t=new Tr(a,this.settings),r=[],n=t.lex();for(;"EOF"!==n.text;)r.push(n),n=t.lex();return r.reverse(),{tokens:r,numArgs:e}}}isDefined(e){return this.macros.has(e)||cr.hasOwnProperty(e)||vt.math.hasOwnProperty(e)||vt.text.hasOwnProperty(e)||mt.hasOwnProperty(e)}isExpandable(e){var t=this.macros.get(e);return null!=t?"string"==typeof t||"function"==typeof t||!t.unexpandable:cr.hasOwnProperty(e)&&!cr[e].primitive}}let ct=/^[\u208a\u208b\u208c\u208d\u208e\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2090\u2091\u2095\u1d62\u2c7c\u2096\u2097\u2098\u2099\u2092\u209a\u1d63\u209b\u209c\u1d64\u1d65\u2093\u1d66\u1d67\u1d68\u1d69\u1d6a]/,R=Object.freeze({"₊":"+","₋":"-","₌":"=","₍":"(","₎":")","₀":"0","₁":"1","₂":"2","₃":"3","₄":"4","₅":"5","₆":"6","₇":"7","₈":"8","₉":"9","ₐ":"a","ₑ":"e","ₕ":"h","ᵢ":"i","ⱼ":"j","ₖ":"k","ₗ":"l","ₘ":"m","ₙ":"n","ₒ":"o","ₚ":"p","ᵣ":"r","ₛ":"s","ₜ":"t","ᵤ":"u","ᵥ":"v","ₓ":"x","ᵦ":"β","ᵧ":"γ","ᵨ":"ρ","ᵩ":"ϕ","ᵪ":"χ","⁺":"+","⁻":"-","⁼":"=","⁽":"(","⁾":")","⁰":"0","¹":"1","²":"2","³":"3","⁴":"4","⁵":"5","⁶":"6","⁷":"7","⁸":"8","⁹":"9","ᴬ":"A","ᴮ":"B","ᴰ":"D","ᴱ":"E","ᴳ":"G","ᴴ":"H","ᴵ":"I","ᴶ":"J","ᴷ":"K","ᴸ":"L","ᴹ":"M","ᴺ":"N","ᴼ":"O","ᴾ":"P","ᴿ":"R","ᵀ":"T","ᵁ":"U","ⱽ":"V","ᵂ":"W","ᵃ":"a","ᵇ":"b","ᶜ":"c","ᵈ":"d","ᵉ":"e","ᶠ":"f","ᵍ":"g","ʰ":"h","ⁱ":"i","ʲ":"j","ᵏ":"k","ˡ":"l","ᵐ":"m","ⁿ":"n","ᵒ":"o","ᵖ":"p","ʳ":"r","ˢ":"s","ᵗ":"t","ᵘ":"u","ᵛ":"v","ʷ":"w","ˣ":"x","ʸ":"y","ᶻ":"z","ᵝ":"β","ᵞ":"γ","ᵟ":"δ","ᵠ":"ϕ","ᵡ":"χ","ᶿ":"θ"}),pt={"́":{text:"\\'",math:"\\acute"},"̀":{text:"\\`",math:"\\grave"},"̈":{text:'\\"',math:"\\ddot"},"̃":{text:"\\~",math:"\\tilde"},"̄":{text:"\\=",math:"\\bar"},"̆":{text:"\\u",math:"\\breve"},"̌":{text:"\\v",math:"\\check"},"̂":{text:"\\^",math:"\\hat"},"̇":{text:"\\.",math:"\\dot"},"̊":{text:"\\r",math:"\\mathring"},"̋":{text:"\\H"},"̧":{text:"\\c"}},dt={"á":"á","à":"à","ä":"ä","ǟ":"ǟ","ã":"ã","ā":"ā","ă":"ă","ắ":"ắ","ằ":"ằ","ẵ":"ẵ","ǎ":"ǎ","â":"â","ấ":"ấ","ầ":"ầ","ẫ":"ẫ","ȧ":"ȧ","ǡ":"ǡ","å":"å","ǻ":"ǻ","ḃ":"ḃ","ć":"ć","ḉ":"ḉ","č":"č","ĉ":"ĉ","ċ":"ċ","ç":"ç","ď":"ď","ḋ":"ḋ","ḑ":"ḑ","é":"é","è":"è","ë":"ë","ẽ":"ẽ","ē":"ē","ḗ":"ḗ","ḕ":"ḕ","ĕ":"ĕ","ḝ":"ḝ","ě":"ě","ê":"ê","ế":"ế","ề":"ề","ễ":"ễ","ė":"ė","ȩ":"ȩ","ḟ":"ḟ","ǵ":"ǵ","ḡ":"ḡ","ğ":"ğ","ǧ":"ǧ","ĝ":"ĝ","ġ":"ġ","ģ":"ģ","ḧ":"ḧ","ȟ":"ȟ","ĥ":"ĥ","ḣ":"ḣ","ḩ":"ḩ","í":"í","ì":"ì","ï":"ï","ḯ":"ḯ","ĩ":"ĩ","ī":"ī","ĭ":"ĭ","ǐ":"ǐ","î":"î","ǰ":"ǰ","ĵ":"ĵ","ḱ":"ḱ","ǩ":"ǩ","ķ":"ķ","ĺ":"ĺ","ľ":"ľ","ļ":"ļ","ḿ":"ḿ","ṁ":"ṁ","ń":"ń","ǹ":"ǹ","ñ":"ñ","ň":"ň","ṅ":"ṅ","ņ":"ņ","ó":"ó","ò":"ò","ö":"ö","ȫ":"ȫ","õ":"õ","ṍ":"ṍ","ṏ":"ṏ","ȭ":"ȭ","ō":"ō","ṓ":"ṓ","ṑ":"ṑ","ŏ":"ŏ","ǒ":"ǒ","ô":"ô","ố":"ố","ồ":"ồ","ỗ":"ỗ","ȯ":"ȯ","ȱ":"ȱ","ő":"ő","ṕ":"ṕ","ṗ":"ṗ","ŕ":"ŕ","ř":"ř","ṙ":"ṙ","ŗ":"ŗ","ś":"ś","ṥ":"ṥ","š":"š","ṧ":"ṧ","ŝ":"ŝ","ṡ":"ṡ","ş":"ş","ẗ":"ẗ","ť":"ť","ṫ":"ṫ","ţ":"ţ","ú":"ú","ù":"ù","ü":"ü","ǘ":"ǘ","ǜ":"ǜ","ǖ":"ǖ","ǚ":"ǚ","ũ":"ũ","ṹ":"ṹ","ū":"ū","ṻ":"ṻ","ŭ":"ŭ","ǔ":"ǔ","û":"û","ů":"ů","ű":"ű","ṽ":"ṽ","ẃ":"ẃ","ẁ":"ẁ","ẅ":"ẅ","ŵ":"ŵ","ẇ":"ẇ","ẘ":"ẘ","ẍ":"ẍ","ẋ":"ẋ","ý":"ý","ỳ":"ỳ","ÿ":"ÿ","ỹ":"ỹ","ȳ":"ȳ","ŷ":"ŷ","ẏ":"ẏ","ẙ":"ẙ","ź":"ź","ž":"ž","ẑ":"ẑ","ż":"ż","Á":"Á","À":"À","Ä":"Ä","Ǟ":"Ǟ","Ã":"Ã","Ā":"Ā","Ă":"Ă","Ắ":"Ắ","Ằ":"Ằ","Ẵ":"Ẵ","Ǎ":"Ǎ","Â":"Â","Ấ":"Ấ","Ầ":"Ầ","Ẫ":"Ẫ","Ȧ":"Ȧ","Ǡ":"Ǡ","Å":"Å","Ǻ":"Ǻ","Ḃ":"Ḃ","Ć":"Ć","Ḉ":"Ḉ","Č":"Č","Ĉ":"Ĉ","Ċ":"Ċ","Ç":"Ç","Ď":"Ď","Ḋ":"Ḋ","Ḑ":"Ḑ","É":"É","È":"È","Ë":"Ë","Ẽ":"Ẽ","Ē":"Ē","Ḗ":"Ḗ","Ḕ":"Ḕ","Ĕ":"Ĕ","Ḝ":"Ḝ","Ě":"Ě","Ê":"Ê","Ế":"Ế","Ề":"Ề","Ễ":"Ễ","Ė":"Ė","Ȩ":"Ȩ","Ḟ":"Ḟ","Ǵ":"Ǵ","Ḡ":"Ḡ","Ğ":"Ğ","Ǧ":"Ǧ","Ĝ":"Ĝ","Ġ":"Ġ","Ģ":"Ģ","Ḧ":"Ḧ","Ȟ":"Ȟ","Ĥ":"Ĥ","Ḣ":"Ḣ","Ḩ":"Ḩ","Í":"Í","Ì":"Ì","Ï":"Ï","Ḯ":"Ḯ","Ĩ":"Ĩ","Ī":"Ī","Ĭ":"Ĭ","Ǐ":"Ǐ","Î":"Î","İ":"İ","Ĵ":"Ĵ","Ḱ":"Ḱ","Ǩ":"Ǩ","Ķ":"Ķ","Ĺ":"Ĺ","Ľ":"Ľ","Ļ":"Ļ","Ḿ":"Ḿ","Ṁ":"Ṁ","Ń":"Ń","Ǹ":"Ǹ","Ñ":"Ñ","Ň":"Ň","Ṅ":"Ṅ","Ņ":"Ņ","Ó":"Ó","Ò":"Ò","Ö":"Ö","Ȫ":"Ȫ","Õ":"Õ","Ṍ":"Ṍ","Ṏ":"Ṏ","Ȭ":"Ȭ","Ō":"Ō","Ṓ":"Ṓ","Ṑ":"Ṑ","Ŏ":"Ŏ","Ǒ":"Ǒ","Ô":"Ô","Ố":"Ố","Ồ":"Ồ","Ỗ":"Ỗ","Ȯ":"Ȯ","Ȱ":"Ȱ","Ő":"Ő","Ṕ":"Ṕ","Ṗ":"Ṗ","Ŕ":"Ŕ","Ř":"Ř","Ṙ":"Ṙ","Ŗ":"Ŗ","Ś":"Ś","Ṥ":"Ṥ","Š":"Š","Ṧ":"Ṧ","Ŝ":"Ŝ","Ṡ":"Ṡ","Ş":"Ş","Ť":"Ť","Ṫ":"Ṫ","Ţ":"Ţ","Ú":"Ú","Ù":"Ù","Ü":"Ü","Ǘ":"Ǘ","Ǜ":"Ǜ","Ǖ":"Ǖ","Ǚ":"Ǚ","Ũ":"Ũ","Ṹ":"Ṹ","Ū":"Ū","Ṻ":"Ṻ","Ŭ":"Ŭ","Ǔ":"Ǔ","Û":"Û","Ů":"Ů","Ű":"Ű","Ṽ":"Ṽ","Ẃ":"Ẃ","Ẁ":"Ẁ","Ẅ":"Ẅ","Ŵ":"Ŵ","Ẇ":"Ẇ","Ẍ":"Ẍ","Ẋ":"Ẋ","Ý":"Ý","Ỳ":"Ỳ","Ÿ":"Ÿ","Ỹ":"Ỹ","Ȳ":"Ȳ","Ŷ":"Ŷ","Ẏ":"Ẏ","Ź":"Ź","Ž":"Ž","Ẑ":"Ẑ","Ż":"Ż","ά":"ά","ὰ":"ὰ","ᾱ":"ᾱ","ᾰ":"ᾰ","έ":"έ","ὲ":"ὲ","ή":"ή","ὴ":"ὴ","ί":"ί","ὶ":"ὶ","ϊ":"ϊ","ΐ":"ΐ","ῒ":"ῒ","ῑ":"ῑ","ῐ":"ῐ","ό":"ό","ὸ":"ὸ","ύ":"ύ","ὺ":"ὺ","ϋ":"ϋ","ΰ":"ΰ","ῢ":"ῢ","ῡ":"ῡ","ῠ":"ῠ","ώ":"ώ","ὼ":"ὼ","Ύ":"Ύ","Ὺ":"Ὺ","Ϋ":"Ϋ","Ῡ":"Ῡ","Ῠ":"Ῠ","Ώ":"Ώ","Ὼ":"Ὼ"};class Nr{constructor(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new Cr(e,t,this.mode),this.settings=t,this.leftrightDepth=0}expect(e,t){if(void 0===t&&(t=!0),this.fetch().text!==e)throw new ft("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()}consume(){this.nextToken=null}fetch(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var t=this.nextToken,e=(this.consume(),this.gullet.pushToken(new Kt("}")),this.gullet.pushTokens(e),this.parseExpression(!1));return this.expect("}"),this.nextToken=t,e}parseExpression(e,t){for(var r=[];;){"math"===this.mode&&this.consumeSpaces();var n=this.fetch();if(-1!==Nr.endOfExpression.indexOf(n.text))break;if(t&&n.text===t)break;if(e&&cr[n.text]&&cr[n.text].infix)break;if(!(n=this.parseAtom(t)))break;"internal"!==n.type&&r.push(n)}return"text"===this.mode&&this.formLigatures(r),this.handleInfixNodes(r)}handleInfixNodes(t){let r,n=-1;for(let e=0;e{"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)})("undefined"!=typeof self?self:this,function(t){return r={771:function(e){e.exports=t}},a={},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.d(p={},{default:function(){return o}}),e=n(771),s=n.n(e),l=function(e,t,r){for(var n=r,a=0,i=e.length;n{var t=" "+a.className+" ";-1===r.ignoredTags.indexOf(a.nodeName.toLowerCase())&&r.ignoredClasses.every(function(e){return-1===t.indexOf(" "+e+" ")})&&e(a,r)})()}},o=function(e,t){if(!e)throw Error("No element provided to render");var r,n={};for(r in t)t.hasOwnProperty(r)&&(n[r]=t[r]);n.delimiters=n.delimiters||[{left:"$$",right:"$$",display:!0},{left:"$",right:"$",display:!1},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}],n.ignoredTags=n.ignoredTags||["script","noscript","style","textarea","pre","code","option"],n.ignoredClasses=n.ignoredClasses||[],n.errorCallback=n.errorCallback||console.error,n.macros=n.macros||{},i(e,n)},p.default;function n(e){var t=a[e];return void 0===t&&(t=a[e]={exports:{}},r[e](t,t.exports,n)),t.exports}var r,a,e,s,l,h,m,c,i,o,p}),document.addEventListener("DOMContentLoaded",function(){renderMathInElement(document.body)});
diff --git a/static/js/mermaid.min.js b/static/js/mermaid.min.js
new file mode 100644
index 0000000..e8d5125
--- /dev/null
+++ b/static/js/mermaid.min.js
@@ -0,0 +1,2768 @@
+var __esbuild_esm_mermaid_nm;(__esbuild_esm_mermaid_nm||={}).mermaid=(()=>{var w,k,T,C,_,S,A,N,I=Object.create,R=Object.defineProperty,M=Object.getOwnPropertyDescriptor,$=Object.getOwnPropertyNames,F=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty,mt=(e,t)=>R(e,"name",{value:t,configurable:!0}),G=(t,r,n,i)=>{if(r&&"object"==typeof r||"function"==typeof r)for(let e of $(r))z.call(t,e)||e===n||R(t,e,{get:()=>r[e],enumerable:!(i=M(r,e))||i.enumerable});return t},U=(e,t,r)=>(G(e,t,"default"),r&&G(r,t,"default")),q=(e,t,r)=>(r=null!=e?I(F(e)):{},G(!t&&e&&e.__esModule?r:R(r,"default",{value:e,enumerable:!0}),e)),j=(b=(e,t)=>()=>t=e?e(e=0):t)(()=>{w=Object.freeze({left:0,top:0,width:16,height:16}),k=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),T=Object.freeze({...w,...k}),C=Object.freeze({...T,body:"",hidden:!1})}),Y=b(()=>{j(),_=Object.freeze({width:null,height:null}),S=Object.freeze({..._,...k})}),W=b(()=>{A=mt((e,t,r,n="")=>{var i,a=e.split(":");if("@"===e.slice(0,1)){if(a.length<2||3!!e&&!(!(t&&""===e.prefix||e.prefix)||!e.name),"validateIconName")});function ee(e,t){var r={};return!e.hFlip!=!t.hFlip&&(r.hFlip=!0),!e.vFlip!=!t.vFlip&&(r.vFlip=!0),(e=((e.rotate||0)+(t.rotate||0))%4)&&(r.rotate=e),r}var te=b(()=>{mt(ee,"mergeIconTransformations")});function re(e,t){var r,n=ee(e,t);for(r in C)r in k?r in e&&!(r in n)&&(n[r]=k[r]):r in t?n[r]=t[r]:r in e&&(n[r]=e[r]);return n}var ne=b(()=>{j(),te(),mt(re,"mergeIconData")});function ie(e,t){let n=e.icons,i=e.aliases||Object.create(null),a=Object.create(null);function s(e){var t,r;return n[e]?a[e]=[]:(e in a||(a[e]=null,(r=(t=i[e]&&i[e].parent)&&s(t))&&(a[e]=[t].concat(r))),a[e])}return mt(s,"resolve"),(t||Object.keys(n).concat(Object.keys(i))).forEach(s),a}var ae=b(()=>{mt(ie,"getIconsTree")});function se(e,t,r){let n=e.icons,i=e.aliases||Object.create(null),a={};function s(e){a=re(n[e]||i[e],a)}return mt(s,"parse"),s(t),r.forEach(s),re(e,a)}function oe(e,t){var r;return e.icons[t]?se(e,t,[]):(r=ie(e,[t])[t])?se(e,t,r):null}var le=b(()=>{ne(),ae(),mt(se,"internalGetIconData"),mt(oe,"getIconData")});function ce(e,t,r){if(1===t)return e;if(r=r||100,"number"==typeof e)return Math.ceil(e*t*r)/r;if("string"!=typeof e)return e;var n,i=e.split(ue);if(null===i||!i.length)return e;let a=[],s=i.shift(),o=de.test(s);for(;;){if(!o||(n=parseFloat(s),isNaN(n))?a.push(s):a.push(Math.ceil(n*t*r)/r),void 0===(s=i.shift()))return a.join("");o=!o}}var ue,de,pe=b(()=>{ue=/(-?[0-9.]*[0-9]+[0-9.]*)/g,de=/^-?[0-9.]*[0-9]+[0-9.]*$/g,mt(ce,"calculateSize")});function ge(e,t="defs"){let r="",n=e.indexOf("<"+t);for(;0<=n;){var i=e.indexOf(">",n),a=e.indexOf(""+t);if(-1===i||-1===a)break;var s=e.indexOf(">",a);if(-1===s)break;r+=e.slice(i+1,a).trim(),e=e.slice(0,n).trim()+e.slice(s+1)}return{defs:r,content:e}}function fe(e,t){return e?""+e+" "+t:t}function me(e,t,r){return fe((e=ge(e)).defs,t+e.content+r)}var ye=b(()=>{mt(ge,"splitSVGDefs"),mt(fe,"mergeDefsAndContent"),mt(me,"wrapSVGContent")});function ve(e,t){let r={...T,...e},n={...S,...t},s={left:r.left,top:r.top,width:r.width,height:r.height},o=r.body,i=([r,n].forEach(e=>{let t=[],r=e.hFlip,n=e.vFlip,i=e.rotate;r?n?i+=2:(t.push("translate("+(s.width+s.left).toString()+" "+(0-s.top).toString()+")"),t.push("scale(-1 1)"),s.top=s.left=0):n&&(t.push("translate("+(0-s.left).toString()+" "+(s.height+s.top).toString()+")"),t.push("scale(1 -1)"),s.top=s.left=0);let a;switch(i<0&&(i-=4*Math.floor(i/4)),i%=4){case 1:a=s.height/2+s.top,t.unshift("rotate(90 "+a.toString()+" "+a.toString()+")");break;case 2:t.unshift("rotate(180 "+(s.width/2+s.left).toString()+" "+(s.height/2+s.top).toString()+")");break;case 3:a=s.width/2+s.left,t.unshift("rotate(-90 "+a.toString()+" "+a.toString()+")")}i%2==1&&(s.left!==s.top&&(a=s.left,s.left=s.top,s.top=a),s.width!==s.height)&&(a=s.width,s.width=s.height,s.height=a),t.length&&(o=me(o,''," "))}),n.width),a=n.height,l=s.width,c=s.height,h,u,d=(null===i?(u=null===a?"1em":"auto"===a?c:a,h=ce(u,l/c)):(h="auto"===i?l:i,u=null===a?ce(h,c/l):"auto"===a?c:a),{}),p=mt((e,t)=>{xe(t)||(d[e]=t.toString())},"setAttr");return p("width",h),p("height",u),e=[s.left,s.top,l,c],d.viewBox=e.join(" "),{attributes:d,viewBox:e,body:o}}var xe,be=b(()=>{j(),Y(),pe(),ye(),xe=mt(e=>"unset"===e||"undefined"===e||"none"===e,"isUnsetKeyword"),mt(ve,"iconToSVG")});function we(n,i=Te){for(var e,t=[];e=ke.exec(n);)t.push(e[1]);if(t.length){let r="suffix"+(16777216*Math.random()|Date.now()).toString(16);t.forEach(e=>{var t="function"==typeof i?i(e):i+(Ee++).toString(),e=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");n=n.replace(new RegExp('([#;"])('+e+')([")]|\\.[a-z])',"g"),"$1"+t+r+"$3")}),n=n.replace(new RegExp(r,"g"),"")}return n}var ke,Te,Ee,Ce=b(()=>{ke=/\sid="(\S+)"/g,Te="IconifyId"+Date.now().toString(16)+(16777216*Math.random()|0).toString(16),Ee=0,mt(we,"replaceIDs")});function _e(e,t){let r=-1===e.indexOf("xlink:")?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(var n in t)r+=" "+n+'="'+t[n]+'"';return'"+e+" "}var Se,Ae,Le,Ne,D,Ie,Re,Me,De,Oe,Pe,Be,$e,Fe,ze,Ge,Ue,qe,je,Ye,We,He,Ve,Xe,Ke,Ze,Qe,Je,et,tt,rt,nt,it,at,st,ot,lt,ct,ht,ut,dt,pt,gt,ft,vt,xt,bt,a,wt,kt,Tt,r,Et,Ct,_t,n,St,At,Lt,Nt,It,Rt,Mt,Dt,Ot,Pt,Bt,$t,Ft,zt,Gt,Ut,qt,jt,Yt,Wt,Ht,Vt,Xt,Kt,Zt,Qt,Jt,er,tr,rr,nr,ir,ar,sr,or,lr,cr,hr,ur,dr,pr,gr=b(()=>{mt(_e,"iconToHTML")}),fr=b(()=>{W(),le(),be(),Ce(),gr()}),mr=b(()=>{Se=mt((t,r,{depth:n=2,clobber:i=!1}={})=>{let a={depth:n,clobber:i};return Array.isArray(r)&&!Array.isArray(t)?(r.forEach(e=>Se(t,e,a)),t):Array.isArray(r)&&Array.isArray(t)?(r.forEach(e=>{t.includes(e)||t.push(e)}),t):void 0===t||n<=0?null!=t&&"object"==typeof t&&"object"==typeof r?Object.assign(t,r):r:(void 0!==r&&"object"==typeof t&&"object"==typeof r&&Object.keys(r).forEach(e=>{"object"!=typeof r[e]||void 0!==t[e]&&"object"!=typeof t[e]?(i||"object"!=typeof t[e]&&"object"!=typeof r[e])&&(t[e]=r[e]):(void 0===t[e]&&(t[e]=Array.isArray(r[e])?[]:{}),t[e]=Se(t[e],r[e],{depth:n-1,clobber:i}))}),t)},"assignWithDepth"),Ae=Se}),yr=(NFe=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports))((e,t)=>{function r(){var i="millisecond",u="second",d="minute",p="hour",g="day",f="week",m="month",y="year",v="date",t="Invalid Date",s=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,x=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,e={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:mt(function(e){var t=["th","st","nd","rd"],r=e%100;return"["+e+(t[(r-20)%10]||t[r]||t[0])+"]"},"ordinal")},n=mt(function(e,t,r){var n=String(e);return!n||n.length>=t?e:""+Array(t+1-n.length).join(r)+e},"m"),r={s:n,z:mt(function(e){var e=-e.utcOffset(),t=Math.abs(e),r=Math.floor(t/60),t=t%60;return(e<=0?"+":"-")+n(r,2,"0")+":"+n(t,2,"0")},"z"),m:mt(function e(t,r){var n,i,a;return t.date(){var e=a.date,t=a.utc;if(null===e)return new Date(NaN);if(w.u(e))return new Date;if(!(e instanceof Date||"string"!=typeof e||/Z$/i.test(e))){var r,n,i=e.match(s);if(i)return r=i[2]-1||0,n=(i[7]||"0").substring(0,3),t?new Date(Date.UTC(i[1],r,i[3]||1,i[4]||0,i[5]||0,i[6]||0,n)):new Date(i[1],r,i[3]||1,i[4]||0,i[5]||0,i[6]||0,n)}return new Date(e)})(),this.init()},e.init=function(){var e=this.$d;this.$y=e.getFullYear(),this.$M=e.getMonth(),this.$D=e.getDate(),this.$W=e.getDay(),this.$H=e.getHours(),this.$m=e.getMinutes(),this.$s=e.getSeconds(),this.$ms=e.getMilliseconds()},e.$utils=function(){return w},e.isValid=function(){return this.$d.toString()!==t},e.isSame=function(e,t){return e=b(e),this.startOf(t)<=e&&e<=this.endOf(t)},e.isAfter=function(e,t){return b(e){switch(e){case"YY":return String(d.$y).slice(-2);case"YYYY":return w.s(d.$y,4,"0");case"M":return s+1;case"MM":return w.s(s+1,2,"0");case"MMM":return c(p.monthsShort,s,l,3);case"MMMM":return c(l,s);case"D":return d.$D;case"DD":return w.s(d.$D,2,"0");case"d":return String(d.$W);case"dd":return c(p.weekdaysMin,d.$W,o,2);case"ddd":return c(p.weekdaysShort,d.$W,o,3);case"dddd":return o[d.$W];case"H":return String(n);case"HH":return w.s(n,2,"0");case"h":return h(1);case"hh":return h(2);case"a":return u(n,a,!0);case"A":return u(n,a,!1);case"m":return String(a);case"mm":return w.s(a,2,"0");case"s":return String(d.$s);case"ss":return w.s(d.$s,2,"0");case"SSS":return w.s(d.$ms,3,"0");case"Z":return r}return null})()||r.replace(":","")})):p.invalidDate||t},e.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},e.diff=function(e,t,r){var n,i=this,t=w.p(t),a=b(e),s=6e4*(a.utcOffset()-this.utcOffset()),o=this-a,l=mt(function(){return w.m(i,a)},"D");switch(t){case y:n=l()/12;break;case m:n=l();break;case"quarter":n=l()/3;break;case f:n=(o-s)/6048e5;break;case g:n=(o-s)/864e5;break;case p:n=o/36e5;break;case d:n=o/6e4;break;case u:n=o/1e3;break;default:n=o}return r?n:w.a(n)},e.daysInMonth=function(){return this.endOf(m).$D},e.$locale=function(){return l[this.$L]},e.locale=function(e,t){var r;return e?(r=this.clone(),(e=h(e,t,!0))&&(r.$L=e),r):this.$L},e.clone=function(){return w.w(this.$d,this)},e.toDate=function(){return new Date(this.valueOf())},e.toJSON=function(){return this.isValid()?this.toISOString():null},e.toISOString=function(){return this.$d.toISOString()},e.toString=function(){return this.$d.toUTCString()},E),T=k.prototype;function E(e){this.$L=h(e.locale,null,!0),this.parse(e),this.$x=this.$x||e.x||{},this[a]=!0}return b.prototype=T,[["$ms",i],["$s",u],["$m",d],["$H",p],["$W",g],["$M",m],["$y",y],["$D",v]].forEach(function(t){T[t[1]]=function(e){return this.$g(e,t[0],t[1])}}),b.extend=function(e,t){return e.$i||(e(t,k,b),e.$i=!0),b},b.locale=h,b.isDayjs=c,b.unix=function(e){return b(1e3*e)},b.en=l[o],b.Ls=l,b.p={},b}"object"==typeof e&&typeof t<"u"?t.exports=r():"function"==typeof define&&define.amd?define(r):(e=typeof globalThis<"u"?globalThis:e||self).dayjs=r()}),e=b(()=>{Le=q(yr(),1),Ne={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},D={trace:mt(()=>{},"trace"),debug:mt(()=>{},"debug"),info:mt(()=>{},"info"),warn:mt(()=>{},"warn"),error:mt(()=>{},"error"),fatal:mt(()=>{},"fatal")},Ie=mt(function(e="fatal"){let t=Ne.fatal;"string"==typeof e?e.toLowerCase()in Ne&&(t=Ne[e]):"number"==typeof e&&(t=e),D.trace=()=>{},D.debug=()=>{},D.info=()=>{},D.warn=()=>{},D.error=()=>{},D.fatal=()=>{},t<=Ne.fatal&&(D.fatal=console.error?console.error.bind(console,Re("FATAL"),"color: orange"):console.log.bind(console,"[35m",Re("FATAL"))),t<=Ne.error&&(D.error=console.error?console.error.bind(console,Re("ERROR"),"color: orange"):console.log.bind(console,"[31m",Re("ERROR"))),t<=Ne.warn&&(D.warn=console.warn?console.warn.bind(console,Re("WARN"),"color: orange"):console.log.bind(console,"[33m",Re("WARN"))),t<=Ne.info&&(D.info=console.info?console.info.bind(console,Re("INFO"),"color: lightblue"):console.log.bind(console,"[34m",Re("INFO"))),t<=Ne.debug&&(D.debug=console.debug?console.debug.bind(console,Re("DEBUG"),"color: lightgreen"):console.log.bind(console,"[32m",Re("DEBUG"))),t<=Ne.trace&&(D.trace=console.debug?console.debug.bind(console,Re("TRACE"),"color: lightgreen"):console.log.bind(console,"[32m",Re("TRACE")))},"setLogLevel"),Re=mt(e=>`%c${(0,Le.default)().format("ss.SSS")} : ${e} : `,"format")}),vr=b(()=>{Me={min:{r:0,g:0,b:0,s:0,l:0,a:0},max:{r:255,g:255,b:255,h:360,s:100,l:100,a:1},clamp:{r:mt(e=>255<=e?255:e<0?0:e,"r"),g:mt(e=>255<=e?255:e<0?0:e,"g"),b:mt(e=>255<=e?255:e<0?0:e,"b"),h:mt(e=>e%360,"h"),s:mt(e=>100<=e?100:e<0?0:e,"s"),l:mt(e=>100<=e?100:e<0?0:e,"l"),a:mt(e=>1<=e?1:e<0?0:e,"a")},toLinear:mt(e=>{var t=e/255;return.03928(r<0&&(r+=1),1{if(!t)return 2.55*r;e/=360,t/=100;var i=(r/=100)<.5?r*(1+t):r+t-r*t,a=2*r-i;switch(n){case"r":return 255*Me.hue2rgb(a,i,e+.3333333333333333);case"g":return 255*Me.hue2rgb(a,i,e);case"b":return 255*Me.hue2rgb(a,i,e-.3333333333333333)}},"hsl2rgb"),rgb2hsl:mt(({r:e,g:t,b:r},n)=>{e/=255,t/=255,r/=255;var i=Math.max(e,t,r),a=Math.min(e,t,r),s=(i+a)/2;if("l"===n)return 100*s;if(i===a)return 0;var o=i-a;if("s"===n)return 100*(.5{Oe={clamp:mt((e,t,r)=>rMath.round(1e10*e)/1e10,"round")},Pe=Oe}),br=b(()=>{Be={dec2hex:mt(e=>1<(e=Math.round(e).toString(16)).length?e:"0"+e,"dec2hex")},$e=Be}),wr=b(()=>{vr(),xr(),br(),Fe={channel:De,lang:Pe,unit:$e}}),kr=b(()=>{wr(),ze={};for(let e=0;e<=255;e++)ze[e]=Fe.unit.dec2hex(e);Ge={ALL:0,RGB:1,HSL:2}}),Tr=b(()=>{kr(),Ue=class{static{mt(this,"Type")}constructor(){this.type=Ge.ALL}get(){return this.type}set(e){if(this.type&&this.type!==e)throw new Error("Cannot change both RGB and HSL channels at the same time");this.type=e}reset(){this.type=Ge.ALL}is(e){return this.type===e}},qe=Ue}),Er=b(()=>{wr(),Tr(),kr(),je=class{static{mt(this,"Channels")}constructor(e,t){this.color=t,this.changed=!1,this.data=e,this.type=new qe}set(e,t){return this.color=t,this.changed=!1,this.data=e,this.type.type=Ge.ALL,this}_ensureHSL(){var e=this.data,{h:t,s:r,l:n}=e;void 0===t&&(e.h=Fe.channel.rgb2hsl(e,"h")),void 0===r&&(e.s=Fe.channel.rgb2hsl(e,"s")),void 0===n&&(e.l=Fe.channel.rgb2hsl(e,"l"))}_ensureRGB(){var e=this.data,{r:t,g:r,b:n}=e;void 0===t&&(e.r=Fe.channel.hsl2rgb(e,"r")),void 0===r&&(e.g=Fe.channel.hsl2rgb(e,"g")),void 0===n&&(e.b=Fe.channel.hsl2rgb(e,"b"))}get r(){var e=this.data,t=e.r;return this.type.is(Ge.HSL)||void 0===t?(this._ensureHSL(),Fe.channel.hsl2rgb(e,"r")):t}get g(){var e=this.data,t=e.g;return this.type.is(Ge.HSL)||void 0===t?(this._ensureHSL(),Fe.channel.hsl2rgb(e,"g")):t}get b(){var e=this.data,t=e.b;return this.type.is(Ge.HSL)||void 0===t?(this._ensureHSL(),Fe.channel.hsl2rgb(e,"b")):t}get h(){var e=this.data,t=e.h;return this.type.is(Ge.RGB)||void 0===t?(this._ensureRGB(),Fe.channel.rgb2hsl(e,"h")):t}get s(){var e=this.data,t=e.s;return this.type.is(Ge.RGB)||void 0===t?(this._ensureRGB(),Fe.channel.rgb2hsl(e,"s")):t}get l(){var e=this.data,t=e.l;return this.type.is(Ge.RGB)||void 0===t?(this._ensureRGB(),Fe.channel.rgb2hsl(e,"l")):t}get a(){return this.data.a}set r(e){this.type.set(Ge.RGB),this.changed=!0,this.data.r=e}set g(e){this.type.set(Ge.RGB),this.changed=!0,this.data.g=e}set b(e){this.type.set(Ge.RGB),this.changed=!0,this.data.b=e}set h(e){this.type.set(Ge.HSL),this.changed=!0,this.data.h=e}set s(e){this.type.set(Ge.HSL),this.changed=!0,this.data.s=e}set l(e){this.type.set(Ge.HSL),this.changed=!0,this.data.l=e}set a(e){this.changed=!0,this.data.a=e}},Ye=je}),Cr=b(()=>{Er(),We=new Ye({r:0,g:0,b:0,a:0},"transparent"),He=We}),_r=b(()=>{Cr(),kr(),Ve={re:/^#((?:[a-f0-9]{2}){2,4}|[a-f0-9]{3})$/i,parse:mt(e=>{if(35===e.charCodeAt(0)){var t,r,n,i,a,s=e.match(Ve.re);if(s)return s=s[1],t=parseInt(s,16),s=s.length,He.set({r:(t>>(n=(r=4>n*(2+i)&a)*r,b:(t>>n*(1+i)&a)*r,a:s?(t&a)*r/255:1},e)}},"parse"),stringify:mt(e=>{var{r:e,g:t,b:r,a:n}=e;return n<1?"#"+ze[Math.round(e)]+ze[Math.round(t)]+ze[Math.round(r)]+ze[Math.round(255*n)]:"#"+ze[Math.round(e)]+ze[Math.round(t)]+ze[Math.round(r)]},"stringify")},Xe=Ve}),Sr=b(()=>{wr(),Cr(),Ke={re:/^hsla?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(?:deg|grad|rad|turn)?)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(%)?))?\s*?\)$/i,hueRe:/^(.+?)(deg|grad|rad|turn)$/i,_hue2deg:mt(e=>{if(r=e.match(Ke.hueRe)){var[,t,r]=r;switch(r){case"grad":return Fe.channel.clamp.h(.9*parseFloat(t));case"rad":return Fe.channel.clamp.h(180*parseFloat(t)/Math.PI);case"turn":return Fe.channel.clamp.h(360*parseFloat(t))}}return Fe.channel.clamp.h(parseFloat(e))},"_hue2deg"),parse:mt(e=>{var t,r,n,i,a=e.charCodeAt(0);if((104===a||72===a)&&(a=e.match(Ke.re)))return[,a,t,r,n,i]=a,He.set({h:Ke._hue2deg(a),s:Fe.channel.clamp.s(parseFloat(t)),l:Fe.channel.clamp.l(parseFloat(r)),a:n?Fe.channel.clamp.a(i?parseFloat(n)/100:parseFloat(n)):1},e)},"parse"),stringify:mt(e=>{var{h:e,s:t,l:r,a:n}=e;return n<1?`hsla(${Fe.lang.round(e)}, ${Fe.lang.round(t)}%, ${Fe.lang.round(r)}%, ${n})`:`hsl(${Fe.lang.round(e)}, ${Fe.lang.round(t)}%, ${Fe.lang.round(r)}%)`},"stringify")},Ze=Ke}),Ar=b(()=>{_r(),Qe={colors:{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyanaqua:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",transparent:"#00000000",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},parse:mt(e=>{if(e=e.toLowerCase(),e=Qe.colors[e])return Xe.parse(e)},"parse"),stringify:mt(e=>{var t,r=Xe.stringify(e);for(t in Qe.colors)if(Qe.colors[t]===r)return t},"stringify")},Je=Qe}),Lr=b(()=>{wr(),Cr(),et={re:/^rgba?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?)))?\s*?\)$/i,parse:mt(e=>{var t,r,n,i,a,s,o,l=e.charCodeAt(0);if((114===l||82===l)&&(l=e.match(et.re)))return[,l,t,r,n,i,a,s,o]=l,He.set({r:Fe.channel.clamp.r(t?2.55*parseFloat(l):parseFloat(l)),g:Fe.channel.clamp.g(n?2.55*parseFloat(r):parseFloat(r)),b:Fe.channel.clamp.b(a?2.55*parseFloat(i):parseFloat(i)),a:s?Fe.channel.clamp.a(o?parseFloat(s)/100:parseFloat(s)):1},e)},"parse"),stringify:mt(e=>{var{r:e,g:t,b:r,a:n}=e;return n<1?`rgba(${Fe.lang.round(e)}, ${Fe.lang.round(t)}, ${Fe.lang.round(r)}, ${Fe.lang.round(n)})`:`rgb(${Fe.lang.round(e)}, ${Fe.lang.round(t)}, ${Fe.lang.round(r)})`},"stringify")},tt=et}),Nr=b(()=>{_r(),Sr(),Ar(),Lr(),kr(),rt={format:{keyword:Je,hex:Xe,rgb:tt,rgba:tt,hsl:Ze,hsla:Ze},parse:mt(e=>{if("string"!=typeof e)return e;var t=Xe.parse(e)||tt.parse(e)||Ze.parse(e)||Je.parse(e);if(t)return t;throw new Error(`Unsupported color format: "${e}"`)},"parse"),stringify:mt(e=>!e.changed&&e.color?e.color:(e.type.is(Ge.HSL)||void 0===e.data.r?Ze:e.a<1||!Number.isInteger(e.r)||!Number.isInteger(e.g)||!Number.isInteger(e.b)?tt:Xe).stringify(e),"stringify")},nt=rt}),Ir=b(()=>{wr(),Nr(),it=mt((e,t)=>{var r,n=nt.parse(e);for(r in t)n[r]=Fe.channel.clamp[r](t[r]);return nt.stringify(n)},"change"),at=it}),Rr=b(()=>{wr(),Cr(),Nr(),Ir(),st=mt((e,t,r=0,n=1)=>"number"!=typeof e?at(e,{a:t}):(e=He.set({r:Fe.channel.clamp.r(e),g:Fe.channel.clamp.g(t),b:Fe.channel.clamp.b(r),a:Fe.channel.clamp.a(n)}),nt.stringify(e)),"rgba"),ot=st}),Mr=b(()=>{wr(),Nr(),lt=mt((e,t)=>Fe.lang.round(nt.parse(e)[t]),"channel"),ct=lt}),Dr=b(()=>{wr(),Nr(),ht=mt(e=>{var{r:e,g:t,b:r}=nt.parse(e),e=.2126*Fe.channel.toLinear(e)+.7152*Fe.channel.toLinear(t)+.0722*Fe.channel.toLinear(r);return Fe.lang.round(e)},"luminance"),ut=ht}),Or=b(()=>{Dr(),dt=mt(e=>.5<=ut(e),"isLight"),pt=dt}),Pr=b(()=>{Or(),gt=mt(e=>!pt(e),"isDark"),ft=gt}),Br=b(()=>{wr(),Nr(),vt=mt((e,t,r)=>{var n=(e=nt.parse(e))[t];return n!==(r=Fe.channel.clamp[t](n+r))&&(e[t]=r),nt.stringify(e)},"adjustChannel"),xt=vt}),$r=b(()=>{Br(),bt=mt((e,t)=>xt(e,"l",t),"lighten"),a=bt}),Fr=b(()=>{Br(),wt=mt((e,t)=>xt(e,"l",-t),"darken"),kt=wt}),zr=b(()=>{Nr(),Ir(),Tt=mt((e,t)=>{var r,n=nt.parse(e),i={};for(r in t)t[r]&&(i[r]=n[r]+t[r]);return at(e,i)},"adjust"),r=Tt}),Gr=b(()=>{Nr(),Rr(),Et=mt((e,t,r=50)=>{var{r:e,g:n,b:i,a}=nt.parse(e),{r:t,g:s,b:o,a:l}=nt.parse(t),c=2*(r/=100)-1,h=a-l;return ot(e*(c=(1+(c*h==-1?c:(c+h)/(1+c*h)))/2)+t*(h=1-c),n*c+s*h,i*c+o*h,a*r+l*(1-r))},"mix"),Ct=Et}),Ur=b(()=>{Nr(),Gr(),_t=mt((e,t=100)=>{var r=nt.parse(e);return r.r=255-r.r,r.g=255-r.g,r.b=255-r.b,Ct(r,e,t)},"invert"),n=_t}),qr=b(()=>{Rr(),Mr(),Pr(),$r(),Fr(),zr(),Ur()}),jr=b(()=>{qr()}),Yr=b(()=>{St="#ffffff",At="#f2f2f2"}),Wr=b(()=>{jr(),Lt=mt((e,t)=>r(e,t?{s:-40,l:10}:{s:-40,l:-10}),"mkBorder")}),Hr=b(()=>{jr(),Yr(),Wr(),Nt=class{static{mt(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#fff4dd",this.noteBkgColor="#fff5ad",this.noteTextColor="#333",this.THEME_COLOR_LIMIT=12,this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px"}updateColors(){if(this.primaryTextColor=this.primaryTextColor||(this.darkMode?"#eee":"#333"),this.secondaryColor=this.secondaryColor||r(this.primaryColor,{h:-120}),this.tertiaryColor=this.tertiaryColor||r(this.primaryColor,{h:180,l:5}),this.primaryBorderColor=this.primaryBorderColor||Lt(this.primaryColor,this.darkMode),this.secondaryBorderColor=this.secondaryBorderColor||Lt(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=this.tertiaryBorderColor||Lt(this.tertiaryColor,this.darkMode),this.noteBorderColor=this.noteBorderColor||Lt(this.noteBkgColor,this.darkMode),this.noteBkgColor=this.noteBkgColor||"#fff5ad",this.noteTextColor=this.noteTextColor||"#333",this.secondaryTextColor=this.secondaryTextColor||n(this.secondaryColor),this.tertiaryTextColor=this.tertiaryTextColor||n(this.tertiaryColor),this.lineColor=this.lineColor||n(this.background),this.arrowheadColor=this.arrowheadColor||n(this.background),this.textColor=this.textColor||this.primaryTextColor,this.border2=this.border2||this.tertiaryBorderColor,this.nodeBkg=this.nodeBkg||this.primaryColor,this.mainBkg=this.mainBkg||this.primaryColor,this.nodeBorder=this.nodeBorder||this.primaryBorderColor,this.clusterBkg=this.clusterBkg||this.tertiaryColor,this.clusterBorder=this.clusterBorder||this.tertiaryBorderColor,this.defaultLinkColor=this.defaultLinkColor||this.lineColor,this.titleColor=this.titleColor||this.tertiaryTextColor,this.edgeLabelBackground=this.edgeLabelBackground||(this.darkMode?kt(this.secondaryColor,30):this.secondaryColor),this.nodeTextColor=this.nodeTextColor||this.primaryTextColor,this.actorBorder=this.actorBorder||this.primaryBorderColor,this.actorBkg=this.actorBkg||this.mainBkg,this.actorTextColor=this.actorTextColor||this.primaryTextColor,this.actorLineColor=this.actorLineColor||this.actorBorder,this.labelBoxBkgColor=this.labelBoxBkgColor||this.actorBkg,this.signalColor=this.signalColor||this.textColor,this.signalTextColor=this.signalTextColor||this.textColor,this.labelBoxBorderColor=this.labelBoxBorderColor||this.actorBorder,this.labelTextColor=this.labelTextColor||this.actorTextColor,this.loopTextColor=this.loopTextColor||this.actorTextColor,this.activationBorderColor=this.activationBorderColor||kt(this.secondaryColor,10),this.activationBkgColor=this.activationBkgColor||this.secondaryColor,this.sequenceNumberColor=this.sequenceNumberColor||n(this.lineColor),this.sectionBkgColor=this.sectionBkgColor||this.tertiaryColor,this.altSectionBkgColor=this.altSectionBkgColor||"white",this.sectionBkgColor=this.sectionBkgColor||this.secondaryColor,this.sectionBkgColor2=this.sectionBkgColor2||this.primaryColor,this.excludeBkgColor=this.excludeBkgColor||"#eeeeee",this.taskBorderColor=this.taskBorderColor||this.primaryBorderColor,this.taskBkgColor=this.taskBkgColor||this.primaryColor,this.activeTaskBorderColor=this.activeTaskBorderColor||this.primaryColor,this.activeTaskBkgColor=this.activeTaskBkgColor||a(this.primaryColor,23),this.gridColor=this.gridColor||"lightgrey",this.doneTaskBkgColor=this.doneTaskBkgColor||"lightgrey",this.doneTaskBorderColor=this.doneTaskBorderColor||"grey",this.critBorderColor=this.critBorderColor||"#ff8888",this.critBkgColor=this.critBkgColor||"red",this.todayLineColor=this.todayLineColor||"red",this.vertLineColor=this.vertLineColor||"navy",this.taskTextColor=this.taskTextColor||this.textColor,this.taskTextOutsideColor=this.taskTextOutsideColor||this.textColor,this.taskTextLightColor=this.taskTextLightColor||this.textColor,this.taskTextColor=this.taskTextColor||this.primaryTextColor,this.taskTextDarkColor=this.taskTextDarkColor||this.textColor,this.taskTextClickableColor=this.taskTextClickableColor||"#003163",this.personBorder=this.personBorder||this.primaryBorderColor,this.personBkg=this.personBkg||this.mainBkg,this.darkMode?(this.rowOdd=this.rowOdd||kt(this.mainBkg,5)||"#ffffff",this.rowEven=this.rowEven||kt(this.mainBkg,10)):(this.rowOdd=this.rowOdd||a(this.mainBkg,75)||"#ffffff",this.rowEven=this.rowEven||a(this.mainBkg,5)),this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||this.tertiaryColor,this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.specialStateColor=this.lineColor,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||r(this.primaryColor,{h:30}),this.cScale4=this.cScale4||r(this.primaryColor,{h:60}),this.cScale5=this.cScale5||r(this.primaryColor,{h:90}),this.cScale6=this.cScale6||r(this.primaryColor,{h:120}),this.cScale7=this.cScale7||r(this.primaryColor,{h:150}),this.cScale8=this.cScale8||r(this.primaryColor,{h:210,l:150}),this.cScale9=this.cScale9||r(this.primaryColor,{h:270}),this.cScale10=this.cScale10||r(this.primaryColor,{h:300}),this.cScale11=this.cScale11||r(this.primaryColor,{h:330}),this.darkMode)for(let e=0;e{this[e]=t[e]}),this.updateColors(),e.forEach(e=>{this[e]=t[e]}))}},It=mt(e=>{var t=new Nt;return t.calculate(e),t},"getThemeVariables")}),Vr=b(()=>{jr(),Wr(),Rt=class{static{mt(this,"Theme")}constructor(){this.background="#333",this.primaryColor="#1f2020",this.secondaryColor=a(this.primaryColor,16),this.tertiaryColor=r(this.primaryColor,{h:-160}),this.primaryBorderColor=n(this.background),this.secondaryBorderColor=Lt(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Lt(this.tertiaryColor,this.darkMode),this.primaryTextColor=n(this.primaryColor),this.secondaryTextColor=n(this.secondaryColor),this.tertiaryTextColor=n(this.tertiaryColor),this.lineColor=n(this.background),this.textColor=n(this.background),this.mainBkg="#1f2020",this.secondBkg="calculated",this.mainContrastColor="lightgrey",this.darkTextColor=a(n("#323D47"),10),this.lineColor="calculated",this.border1="#ccc",this.border2=ot(255,255,255,.25),this.arrowheadColor="calculated",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#181818",this.textColor="#ccc",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#F9FFFE",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="calculated",this.activationBkgColor="calculated",this.sequenceNumberColor="black",this.sectionBkgColor=kt("#EAE8D9",30),this.altSectionBkgColor="calculated",this.sectionBkgColor2="#EAE8D9",this.excludeBkgColor=kt(this.sectionBkgColor,10),this.taskBorderColor=ot(255,255,255,70),this.taskBkgColor="calculated",this.taskTextColor="calculated",this.taskTextLightColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor=ot(255,255,255,50),this.activeTaskBkgColor="#81B1DB",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="grey",this.critBorderColor="#E83737",this.critBkgColor="#E83737",this.taskTextDarkColor="calculated",this.todayLineColor="#DB5757",this.vertLineColor="#00BFFF",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd=this.rowOdd||a(this.mainBkg,5)||"#ffffff",this.rowEven=this.rowEven||kt(this.mainBkg,10),this.labelColor="calculated",this.errorBkgColor="#a44141",this.errorTextColor="#ddd"}updateColors(){this.secondBkg=a(this.mainBkg,16),this.lineColor=this.mainContrastColor,this.arrowheadColor=this.mainContrastColor,this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.edgeLabelBackground=a(this.labelBackground,25),this.actorBorder=this.border1,this.actorBkg=this.mainBkg,this.actorTextColor=this.mainContrastColor,this.actorLineColor=this.actorBorder,this.signalColor=this.mainContrastColor,this.signalTextColor=this.mainContrastColor,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.mainContrastColor,this.loopTextColor=this.mainContrastColor,this.noteBorderColor=this.secondaryBorderColor,this.noteBkgColor=this.secondBkg,this.noteTextColor=this.secondaryTextColor,this.activationBorderColor=this.border1,this.activationBkgColor=this.secondBkg,this.altSectionBkgColor=this.background,this.taskBkgColor=a(this.mainBkg,23),this.taskTextColor=this.darkTextColor,this.taskTextLightColor=this.mainContrastColor,this.taskTextOutsideColor=this.taskTextLightColor,this.gridColor=this.mainContrastColor,this.doneTaskBkgColor=this.mainContrastColor,this.taskTextDarkColor=this.darkTextColor,this.archEdgeColor=this.lineColor,this.archEdgeArrowColor=this.lineColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#555",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#f4f4f4",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=r(this.primaryColor,{h:64}),this.fillType3=r(this.secondaryColor,{h:64}),this.fillType4=r(this.primaryColor,{h:-64}),this.fillType5=r(this.secondaryColor,{h:-64}),this.fillType6=r(this.primaryColor,{h:128}),this.fillType7=r(this.secondaryColor,{h:128}),this.cScale1=this.cScale1||"#0b0000",this.cScale2=this.cScale2||"#4d1037",this.cScale3=this.cScale3||"#3f5258",this.cScale4=this.cScale4||"#4f2f1b",this.cScale5=this.cScale5||"#6e0a0a",this.cScale6=this.cScale6||"#3b0048",this.cScale7=this.cScale7||"#995a01",this.cScale8=this.cScale8||"#154706",this.cScale9=this.cScale9||"#161722",this.cScale10=this.cScale10||"#00296f",this.cScale11=this.cScale11||"#01629c",this.cScale12=this.cScale12||"#010029",this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||r(this.primaryColor,{h:30}),this.cScale4=this.cScale4||r(this.primaryColor,{h:60}),this.cScale5=this.cScale5||r(this.primaryColor,{h:90}),this.cScale6=this.cScale6||r(this.primaryColor,{h:120}),this.cScale7=this.cScale7||r(this.primaryColor,{h:150}),this.cScale8=this.cScale8||r(this.primaryColor,{h:210}),this.cScale9=this.cScale9||r(this.primaryColor,{h:270}),this.cScale10=this.cScale10||r(this.primaryColor,{h:300}),this.cScale11=this.cScale11||r(this.primaryColor,{h:330});for(let e=0;e{this[e]=t[e]}),this.updateColors(),e.forEach(e=>{this[e]=t[e]}))}},Mt=mt(e=>{var t=new Rt;return t.calculate(e),t},"getThemeVariables")}),Xr=b(()=>{jr(),Wr(),Yr(),Dt=class{static{mt(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#ECECFF",this.secondaryColor=r(this.primaryColor,{h:120}),this.secondaryColor="#ffffde",this.tertiaryColor=r(this.primaryColor,{h:-160}),this.primaryBorderColor=Lt(this.primaryColor,this.darkMode),this.secondaryBorderColor=Lt(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Lt(this.tertiaryColor,this.darkMode),this.primaryTextColor=n(this.primaryColor),this.secondaryTextColor=n(this.secondaryColor),this.tertiaryTextColor=n(this.tertiaryColor),this.lineColor=n(this.background),this.textColor=n(this.background),this.background="white",this.mainBkg="#ECECFF",this.secondBkg="#ffffde",this.lineColor="#333333",this.border1="#9370DB",this.border2="#aaaa33",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="rgba(232,232,232, 0.8)",this.textColor="#333",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="calculated",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="calculated",this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor="calculated",this.taskTextOutsideColor=this.taskTextDarkColor,this.taskTextClickableColor="calculated",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBorderColor="calculated",this.critBkgColor="calculated",this.todayLineColor="calculated",this.vertLineColor="calculated",this.sectionBkgColor=ot(102,102,255,.49),this.altSectionBkgColor="white",this.sectionBkgColor2="#fff400",this.taskBorderColor="#534fbc",this.taskBkgColor="#8a90dd",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="#534fbc",this.activeTaskBkgColor="#bfc7ff",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.vertLineColor="navy",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd="calculated",this.rowEven="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222",this.updateColors()}updateColors(){this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||r(this.primaryColor,{h:30}),this.cScale4=this.cScale4||r(this.primaryColor,{h:60}),this.cScale5=this.cScale5||r(this.primaryColor,{h:90}),this.cScale6=this.cScale6||r(this.primaryColor,{h:120}),this.cScale7=this.cScale7||r(this.primaryColor,{h:150}),this.cScale8=this.cScale8||r(this.primaryColor,{h:210}),this.cScale9=this.cScale9||r(this.primaryColor,{h:270}),this.cScale10=this.cScale10||r(this.primaryColor,{h:300}),this.cScale11=this.cScale11||r(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||kt(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||kt(this.tertiaryColor,40);for(let e=0;e{"calculated"===this[e]&&(this[e]=void 0)}),"object"!=typeof t?this.updateColors():((e=Object.keys(t)).forEach(e=>{this[e]=t[e]}),this.updateColors(),e.forEach(e=>{this[e]=t[e]}))}},Ot=mt(e=>{var t=new Dt;return t.calculate(e),t},"getThemeVariables")}),Kr=b(()=>{jr(),Yr(),Wr(),Pt=class{static{mt(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#cde498",this.secondaryColor="#cdffb2",this.background="white",this.mainBkg="#cde498",this.secondBkg="#cdffb2",this.lineColor="green",this.border1="#13540c",this.border2="#6eaa49",this.arrowheadColor="green",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.tertiaryColor=a("#cde498",10),this.primaryBorderColor=Lt(this.primaryColor,this.darkMode),this.secondaryBorderColor=Lt(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Lt(this.tertiaryColor,this.darkMode),this.primaryTextColor=n(this.primaryColor),this.secondaryTextColor=n(this.secondaryColor),this.tertiaryTextColor=n(this.primaryColor),this.lineColor=n(this.background),this.textColor=n(this.background),this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#333",this.edgeLabelBackground="#e8e8e8",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="#333",this.signalTextColor="#333",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="#326932",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="#6eaa49",this.altSectionBkgColor="white",this.sectionBkgColor2="#6eaa49",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="#487e3a",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.vertLineColor="#00BFFF",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.actorBorder=kt(this.mainBkg,20),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.actorLineColor=this.actorBorder,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||r(this.primaryColor,{h:30}),this.cScale4=this.cScale4||r(this.primaryColor,{h:60}),this.cScale5=this.cScale5||r(this.primaryColor,{h:90}),this.cScale6=this.cScale6||r(this.primaryColor,{h:120}),this.cScale7=this.cScale7||r(this.primaryColor,{h:150}),this.cScale8=this.cScale8||r(this.primaryColor,{h:210}),this.cScale9=this.cScale9||r(this.primaryColor,{h:270}),this.cScale10=this.cScale10||r(this.primaryColor,{h:300}),this.cScale11=this.cScale11||r(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||kt(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||kt(this.tertiaryColor,40);for(let e=0;e{this[e]=t[e]}),this.updateColors(),e.forEach(e=>{this[e]=t[e]}))}},Bt=mt(e=>{var t=new Pt;return t.calculate(e),t},"getThemeVariables")}),Zr=b(()=>{jr(),Wr(),Yr(),$t=class{static{mt(this,"Theme")}constructor(){this.primaryColor="#eee",this.contrast="#707070",this.secondaryColor=a(this.contrast,55),this.background="#ffffff",this.tertiaryColor=r(this.primaryColor,{h:-160}),this.primaryBorderColor=Lt(this.primaryColor,this.darkMode),this.secondaryBorderColor=Lt(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Lt(this.tertiaryColor,this.darkMode),this.primaryTextColor=n(this.primaryColor),this.secondaryTextColor=n(this.secondaryColor),this.tertiaryTextColor=n(this.tertiaryColor),this.lineColor=n(this.background),this.textColor=n(this.background),this.mainBkg="#eee",this.secondBkg="calculated",this.lineColor="#666",this.border1="#999",this.border2="calculated",this.note="#ffa",this.text="#333",this.critical="#d42",this.done="#bbb",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="white",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor=this.actorBorder,this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="calculated",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="white",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBkgColor="calculated",this.critBorderColor="calculated",this.todayLineColor="calculated",this.vertLineColor="calculated",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd=this.rowOdd||a(this.mainBkg,75)||"#ffffff",this.rowEven=this.rowEven||"#f4f4f4",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.secondBkg=a(this.contrast,55),this.border2=this.contrast,this.actorBorder=a(this.border1,23),this.actorBkg=this.mainBkg,this.actorTextColor=this.text,this.actorLineColor=this.actorBorder,this.signalColor=this.text,this.signalTextColor=this.text,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.text,this.loopTextColor=this.text,this.noteBorderColor="#999",this.noteBkgColor="#666",this.noteTextColor="#fff",this.cScale0=this.cScale0||"#555",this.cScale1=this.cScale1||"#F4F4F4",this.cScale2=this.cScale2||"#555",this.cScale3=this.cScale3||"#BBB",this.cScale4=this.cScale4||"#777",this.cScale5=this.cScale5||"#999",this.cScale6=this.cScale6||"#DDD",this.cScale7=this.cScale7||"#FFF",this.cScale8=this.cScale8||"#DDD",this.cScale9=this.cScale9||"#BBB",this.cScale10=this.cScale10||"#999",this.cScale11=this.cScale11||"#777";for(let e=0;e{this[e]=t[e]}),this.updateColors(),e.forEach(e=>{this[e]=t[e]}))}},Ft=mt(e=>{var t=new $t;return t.calculate(e),t},"getThemeVariables")}),Qr=b(()=>{Hr(),Vr(),Xr(),Kr(),Zr(),zt={base:{getThemeVariables:It},dark:{getThemeVariables:Mt},default:{getThemeVariables:Ot},forest:{getThemeVariables:Bt},neutral:{getThemeVariables:Ft}}}),Jr=b(()=>{Gt={flowchart:{useMaxWidth:!0,titleTopMargin:25,subGraphTitleMargin:{top:0,bottom:0},diagramPadding:8,htmlLabels:!0,nodeSpacing:50,rankSpacing:50,curve:"basis",padding:15,defaultRenderer:"dagre-wrapper",wrappingWidth:200,inheritDir:!1},sequence:{useMaxWidth:!0,hideUnusedParticipants:!1,activationWidth:10,diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",mirrorActors:!0,forceMenus:!1,bottomMarginAdj:1,rightAngles:!1,showSequenceNumbers:!1,actorFontSize:14,actorFontFamily:'"Open Sans", sans-serif',actorFontWeight:400,noteFontSize:14,noteFontFamily:'"trebuchet ms", verdana, arial, sans-serif',noteFontWeight:400,noteAlign:"center",messageFontSize:16,messageFontFamily:'"trebuchet ms", verdana, arial, sans-serif',messageFontWeight:400,wrap:!1,wrapPadding:10,labelBoxWidth:50,labelBoxHeight:20},gantt:{useMaxWidth:!0,titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,rightPadding:75,leftPadding:75,gridLineStartPadding:35,fontSize:11,sectionFontSize:11,numberSectionStyles:4,axisFormat:"%Y-%m-%d",topAxis:!1,displayMode:"",weekday:"sunday"},journey:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,maxLabelWidth:360,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],titleColor:"",titleFontFamily:'"trebuchet ms", verdana, arial, sans-serif',titleFontSize:"4ex"},class:{useMaxWidth:!0,titleTopMargin:25,arrowMarkerAbsolute:!1,dividerMargin:10,padding:5,textHeight:10,defaultRenderer:"dagre-wrapper",htmlLabels:!1,hideEmptyMembersBox:!1},state:{useMaxWidth:!0,titleTopMargin:25,dividerMargin:10,sizeUnit:5,padding:8,textHeight:10,titleShift:-15,noteMargin:10,forkWidth:70,forkHeight:7,miniPadding:2,fontSizeFactor:5.02,fontSize:24,labelHeight:16,edgeLengthFactor:"20",compositTitleSize:35,radius:5,defaultRenderer:"dagre-wrapper"},er:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:20,layoutDirection:"TB",minEntityWidth:100,minEntityHeight:75,entityPadding:15,nodeSpacing:140,rankSpacing:80,stroke:"gray",fill:"honeydew",fontSize:12},pie:{useMaxWidth:!0,textPosition:.75},quadrantChart:{useMaxWidth:!0,chartWidth:500,chartHeight:500,titleFontSize:20,titlePadding:10,quadrantPadding:5,xAxisLabelPadding:5,yAxisLabelPadding:5,xAxisLabelFontSize:16,yAxisLabelFontSize:16,quadrantLabelFontSize:16,quadrantTextTopPadding:5,pointTextPadding:5,pointLabelFontSize:12,pointRadius:5,xAxisPosition:"top",yAxisPosition:"left",quadrantInternalBorderStrokeWidth:1,quadrantExternalBorderStrokeWidth:2},xyChart:{useMaxWidth:!0,width:700,height:500,titleFontSize:20,titlePadding:10,showDataLabel:!1,showTitle:!0,xAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},yAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},chartOrientation:"vertical",plotReservedSpacePercent:50},requirement:{useMaxWidth:!0,rect_fill:"#f9f9f9",text_color:"#333",rect_border_size:"0.5px",rect_border_color:"#bbb",rect_min_width:200,rect_min_height:200,fontSize:14,rect_padding:10,line_height:20},mindmap:{useMaxWidth:!0,padding:10,maxNodeWidth:200,layoutAlgorithm:"cose-bilkent"},kanban:{useMaxWidth:!0,padding:8,sectionWidth:200,ticketBaseUrl:""},timeline:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],disableMulticolor:!1},gitGraph:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:8,nodeLabel:{width:75,height:100,x:-25,y:0},mainBranchName:"main",mainBranchOrder:0,showCommitLabel:!0,showBranches:!0,rotateCommitLabel:!0,parallelCommits:!1,arrowMarkerAbsolute:!1},c4:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,c4ShapeMargin:50,c4ShapePadding:20,width:216,height:60,boxMargin:10,c4ShapeInRow:4,nextLinePaddingX:0,c4BoundaryInRow:2,personFontSize:14,personFontFamily:'"Open Sans", sans-serif',personFontWeight:"normal",external_personFontSize:14,external_personFontFamily:'"Open Sans", sans-serif',external_personFontWeight:"normal",systemFontSize:14,systemFontFamily:'"Open Sans", sans-serif',systemFontWeight:"normal",external_systemFontSize:14,external_systemFontFamily:'"Open Sans", sans-serif',external_systemFontWeight:"normal",system_dbFontSize:14,system_dbFontFamily:'"Open Sans", sans-serif',system_dbFontWeight:"normal",external_system_dbFontSize:14,external_system_dbFontFamily:'"Open Sans", sans-serif',external_system_dbFontWeight:"normal",system_queueFontSize:14,system_queueFontFamily:'"Open Sans", sans-serif',system_queueFontWeight:"normal",external_system_queueFontSize:14,external_system_queueFontFamily:'"Open Sans", sans-serif',external_system_queueFontWeight:"normal",boundaryFontSize:14,boundaryFontFamily:'"Open Sans", sans-serif',boundaryFontWeight:"normal",messageFontSize:12,messageFontFamily:'"Open Sans", sans-serif',messageFontWeight:"normal",containerFontSize:14,containerFontFamily:'"Open Sans", sans-serif',containerFontWeight:"normal",external_containerFontSize:14,external_containerFontFamily:'"Open Sans", sans-serif',external_containerFontWeight:"normal",container_dbFontSize:14,container_dbFontFamily:'"Open Sans", sans-serif',container_dbFontWeight:"normal",external_container_dbFontSize:14,external_container_dbFontFamily:'"Open Sans", sans-serif',external_container_dbFontWeight:"normal",container_queueFontSize:14,container_queueFontFamily:'"Open Sans", sans-serif',container_queueFontWeight:"normal",external_container_queueFontSize:14,external_container_queueFontFamily:'"Open Sans", sans-serif',external_container_queueFontWeight:"normal",componentFontSize:14,componentFontFamily:'"Open Sans", sans-serif',componentFontWeight:"normal",external_componentFontSize:14,external_componentFontFamily:'"Open Sans", sans-serif',external_componentFontWeight:"normal",component_dbFontSize:14,component_dbFontFamily:'"Open Sans", sans-serif',component_dbFontWeight:"normal",external_component_dbFontSize:14,external_component_dbFontFamily:'"Open Sans", sans-serif',external_component_dbFontWeight:"normal",component_queueFontSize:14,component_queueFontFamily:'"Open Sans", sans-serif',component_queueFontWeight:"normal",external_component_queueFontSize:14,external_component_queueFontFamily:'"Open Sans", sans-serif',external_component_queueFontWeight:"normal",wrap:!0,wrapPadding:10,person_bg_color:"#08427B",person_border_color:"#073B6F",external_person_bg_color:"#686868",external_person_border_color:"#8A8A8A",system_bg_color:"#1168BD",system_border_color:"#3C7FC0",system_db_bg_color:"#1168BD",system_db_border_color:"#3C7FC0",system_queue_bg_color:"#1168BD",system_queue_border_color:"#3C7FC0",external_system_bg_color:"#999999",external_system_border_color:"#8A8A8A",external_system_db_bg_color:"#999999",external_system_db_border_color:"#8A8A8A",external_system_queue_bg_color:"#999999",external_system_queue_border_color:"#8A8A8A",container_bg_color:"#438DD5",container_border_color:"#3C7FC0",container_db_bg_color:"#438DD5",container_db_border_color:"#3C7FC0",container_queue_bg_color:"#438DD5",container_queue_border_color:"#3C7FC0",external_container_bg_color:"#B3B3B3",external_container_border_color:"#A6A6A6",external_container_db_bg_color:"#B3B3B3",external_container_db_border_color:"#A6A6A6",external_container_queue_bg_color:"#B3B3B3",external_container_queue_border_color:"#A6A6A6",component_bg_color:"#85BBF0",component_border_color:"#78A8D8",component_db_bg_color:"#85BBF0",component_db_border_color:"#78A8D8",component_queue_bg_color:"#85BBF0",component_queue_border_color:"#78A8D8",external_component_bg_color:"#CCCCCC",external_component_border_color:"#BFBFBF",external_component_db_bg_color:"#CCCCCC",external_component_db_border_color:"#BFBFBF",external_component_queue_bg_color:"#CCCCCC",external_component_queue_border_color:"#BFBFBF"},sankey:{useMaxWidth:!0,width:600,height:400,linkColor:"gradient",nodeAlignment:"justify",showValues:!0,prefix:"",suffix:""},block:{useMaxWidth:!0,padding:8},packet:{useMaxWidth:!0,rowHeight:32,bitWidth:32,bitsPerRow:32,showBits:!0,paddingX:5,paddingY:5},architecture:{useMaxWidth:!0,padding:40,iconSize:80,fontSize:16},radar:{useMaxWidth:!0,width:600,height:600,marginTop:50,marginRight:50,marginBottom:50,marginLeft:50,axisScaleFactor:1,axisLabelFactor:1.05,curveTension:.17},theme:"default",look:"classic",handDrawnSeed:0,layout:"dagre",maxTextSize:5e4,maxEdges:500,darkMode:!1,fontFamily:'"trebuchet ms", verdana, arial, sans-serif;',logLevel:5,securityLevel:"strict",startOnLoad:!0,arrowMarkerAbsolute:!1,secure:["secure","securityLevel","startOnLoad","maxTextSize","suppressErrorRendering","maxEdges"],legacyMathML:!1,forceLegacyMathML:!1,deterministicIds:!1,fontSize:16,markdownAutoWrap:!0,suppressErrorRendering:!1}}),en=b(()=>{Qr(),Jr(),Ut={...Gt,deterministicIDSeed:void 0,elk:{mergeEdges:!1,nodePlacementStrategy:"BRANDES_KOEPF",forceNodeModelOrder:!1,considerModelOrder:"NODES_AND_EDGES"},themeCSS:void 0,themeVariables:zt.default.getThemeVariables(),sequence:{...Gt.sequence,messageFont:mt(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont"),noteFont:mt(function(){return{fontFamily:this.noteFontFamily,fontSize:this.noteFontSize,fontWeight:this.noteFontWeight}},"noteFont"),actorFont:mt(function(){return{fontFamily:this.actorFontFamily,fontSize:this.actorFontSize,fontWeight:this.actorFontWeight}},"actorFont")},class:{hideEmptyMembersBox:!1},gantt:{...Gt.gantt,tickInterval:void 0,useWidth:void 0},c4:{...Gt.c4,useWidth:void 0,personFont:mt(function(){return{fontFamily:this.personFontFamily,fontSize:this.personFontSize,fontWeight:this.personFontWeight}},"personFont"),flowchart:{...Gt.flowchart,inheritDir:!1},external_personFont:mt(function(){return{fontFamily:this.external_personFontFamily,fontSize:this.external_personFontSize,fontWeight:this.external_personFontWeight}},"external_personFont"),systemFont:mt(function(){return{fontFamily:this.systemFontFamily,fontSize:this.systemFontSize,fontWeight:this.systemFontWeight}},"systemFont"),external_systemFont:mt(function(){return{fontFamily:this.external_systemFontFamily,fontSize:this.external_systemFontSize,fontWeight:this.external_systemFontWeight}},"external_systemFont"),system_dbFont:mt(function(){return{fontFamily:this.system_dbFontFamily,fontSize:this.system_dbFontSize,fontWeight:this.system_dbFontWeight}},"system_dbFont"),external_system_dbFont:mt(function(){return{fontFamily:this.external_system_dbFontFamily,fontSize:this.external_system_dbFontSize,fontWeight:this.external_system_dbFontWeight}},"external_system_dbFont"),system_queueFont:mt(function(){return{fontFamily:this.system_queueFontFamily,fontSize:this.system_queueFontSize,fontWeight:this.system_queueFontWeight}},"system_queueFont"),external_system_queueFont:mt(function(){return{fontFamily:this.external_system_queueFontFamily,fontSize:this.external_system_queueFontSize,fontWeight:this.external_system_queueFontWeight}},"external_system_queueFont"),containerFont:mt(function(){return{fontFamily:this.containerFontFamily,fontSize:this.containerFontSize,fontWeight:this.containerFontWeight}},"containerFont"),external_containerFont:mt(function(){return{fontFamily:this.external_containerFontFamily,fontSize:this.external_containerFontSize,fontWeight:this.external_containerFontWeight}},"external_containerFont"),container_dbFont:mt(function(){return{fontFamily:this.container_dbFontFamily,fontSize:this.container_dbFontSize,fontWeight:this.container_dbFontWeight}},"container_dbFont"),external_container_dbFont:mt(function(){return{fontFamily:this.external_container_dbFontFamily,fontSize:this.external_container_dbFontSize,fontWeight:this.external_container_dbFontWeight}},"external_container_dbFont"),container_queueFont:mt(function(){return{fontFamily:this.container_queueFontFamily,fontSize:this.container_queueFontSize,fontWeight:this.container_queueFontWeight}},"container_queueFont"),external_container_queueFont:mt(function(){return{fontFamily:this.external_container_queueFontFamily,fontSize:this.external_container_queueFontSize,fontWeight:this.external_container_queueFontWeight}},"external_container_queueFont"),componentFont:mt(function(){return{fontFamily:this.componentFontFamily,fontSize:this.componentFontSize,fontWeight:this.componentFontWeight}},"componentFont"),external_componentFont:mt(function(){return{fontFamily:this.external_componentFontFamily,fontSize:this.external_componentFontSize,fontWeight:this.external_componentFontWeight}},"external_componentFont"),component_dbFont:mt(function(){return{fontFamily:this.component_dbFontFamily,fontSize:this.component_dbFontSize,fontWeight:this.component_dbFontWeight}},"component_dbFont"),external_component_dbFont:mt(function(){return{fontFamily:this.external_component_dbFontFamily,fontSize:this.external_component_dbFontSize,fontWeight:this.external_component_dbFontWeight}},"external_component_dbFont"),component_queueFont:mt(function(){return{fontFamily:this.component_queueFontFamily,fontSize:this.component_queueFontSize,fontWeight:this.component_queueFontWeight}},"component_queueFont"),external_component_queueFont:mt(function(){return{fontFamily:this.external_component_queueFontFamily,fontSize:this.external_component_queueFontSize,fontWeight:this.external_component_queueFontWeight}},"external_component_queueFont"),boundaryFont:mt(function(){return{fontFamily:this.boundaryFontFamily,fontSize:this.boundaryFontSize,fontWeight:this.boundaryFontWeight}},"boundaryFont"),messageFont:mt(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont")},pie:{...Gt.pie,useWidth:984},xyChart:{...Gt.xyChart,useWidth:void 0},requirement:{...Gt.requirement,useWidth:void 0},packet:{...Gt.packet},radar:{...Gt.radar},treemap:{useMaxWidth:!0,padding:10,diagramPadding:8,showValues:!0,nodeWidth:100,nodeHeight:40,borderWidth:1,valueFontSize:12,labelFontSize:14,valueFormat:","}},qt=mt((r,n="")=>Object.keys(r).reduce((e,t)=>Array.isArray(r[t])?e:"object"==typeof r[t]&&null!==r[t]?[...e,n+t,...qt(r[t],"")]:[...e,n+t],[]),"keyify"),jt=new Set(qt(Ut,"")),Yt=Ut}),tn=b(()=>{en(),e(),Wt=mt(e=>{if(D.debug("sanitizeDirective called with",e),"object"==typeof e&&null!=e)if(Array.isArray(e))e.forEach(e=>Wt(e));else{for(var t of Object.keys(e)){var r;if(D.debug("Checking key",t),t.startsWith("__")||t.includes("proto")||t.includes("constr")||!jt.has(t)||null==e[t])D.debug("sanitize deleting key: ",t),delete e[t];else if("object"==typeof e[t])D.debug("sanitizing object",t),Wt(e[t]);else for(r of["themeCSS","fontFamily","altFontFamily"])t.includes(r)&&(D.debug("sanitizing css option",t),e[t]=Ht(e[t]))}if(e.themeVariables)for(var n of Object.keys(e.themeVariables)){var i=e.themeVariables[n];i?.match&&!i.match(/^[\d "#%(),.;A-Za-z]+$/)&&(e.themeVariables[n]="")}D.debug("After sanitization",e)}},"sanitizeDirective"),Ht=mt(e=>{let t=0,r=0;for(var n of e){if(t{mr(),e(),Qr(),en(),tn(),Vt=Object.freeze(Yt),Xt=Ae({},Vt),Zt=[],Qt=Ae({},Vt),Jt=mt((e,t)=>{let r=Ae({},e),n={};for(var i of t)sr(i),n=Ae(n,i);return r=Ae(r,n),n.theme&&n.theme in zt&&(e=Ae({},Kt),t=Ae(e.themeVariables||{},n.themeVariables),r.theme)&&r.theme in zt&&(r.themeVariables=zt[r.theme].getThemeVariables(t)),dr(Qt=r),Qt},"updateCurrentConfig"),er=mt(e=>(Xt=Ae({},Vt),Xt=Ae(Xt,e),e.theme&&zt[e.theme]&&(Xt.themeVariables=zt[e.theme].getThemeVariables(e.themeVariables)),Jt(Xt,Zt),Xt),"setSiteConfig"),tr=mt(e=>{Kt=Ae({},e)},"saveConfigFromInitialize"),rr=mt(e=>(Xt=Ae(Xt,e),Jt(Xt,Zt),Xt),"updateSiteConfig"),nr=mt(()=>Ae({},Xt),"getSiteConfig"),ir=mt(e=>(dr(e),Ae(Qt,e),ar()),"setConfig"),ar=mt(()=>Ae({},Qt),"getConfig"),sr=mt(t=>{t&&(["secure",...Xt.secure??[]].forEach(e=>{Object.hasOwn(t,e)&&(D.debug("Denied attempt to modify a secure key "+e,t[e]),delete t[e])}),Object.keys(t).forEach(e=>{e.startsWith("__")&&delete t[e]}),Object.keys(t).forEach(e=>{"string"==typeof t[e]&&(t[e].includes("<")||t[e].includes(">")||t[e].includes("url(data:"))&&delete t[e],"object"==typeof t[e]&&sr(t[e])}))},"sanitize"),or=mt(e=>{Wt(e),e.fontFamily&&!e.themeVariables?.fontFamily&&(e.themeVariables={...e.themeVariables,fontFamily:e.fontFamily}),Zt.push(e),Jt(Xt,Zt)},"addDirective"),lr=mt((e=Xt)=>{Jt(e,Zt=[])},"reset"),cr={LAZY_LOAD_DEPRECATED:"The configuration options lazyLoadedDiagrams and loadExternalDiagramsAtStartup are deprecated. Please use registerExternalDiagrams instead."},hr={},ur=mt(e=>{hr[e]||(D.warn(cr[e]),hr[e]=!0)},"issueWarning"),dr=mt(e=>{e&&(e.lazyLoadedDiagrams||e.loadExternalDiagramsAtStartup)&&ur("LAZY_LOAD_DEPRECATED")},"checkConfig"),pr=mt(()=>{let e={};Kt&&(e=Ae(e,Kt));for(var t of Zt)e=Ae(e,t);return e},"getUserDefinedConfig")});function nn(i){return function(e){e instanceof RegExp&&(e.lastIndex=0);for(var t=arguments.length,r=new Array(1hn(e),"DOMPurify");if(d.version="3.2.6",d.removed=[],!e||!e.document||e.document.nodeType!==ri.document||!e.Element)return d.isSupported=!1,d;let i=e.document,O=i,P=O.currentScript,{DocumentFragment:B,HTMLTemplateElement:$,Node:F,Element:z,NodeFilter:t,NamedNodeMap:G=e.NamedNodeMap||e.MozNamedAttrMap,HTMLFormElement:U,DOMParser:q,trustedTypes:p}=e,r=z.prototype,j=cn(r,"cloneNode"),Y=cn(r,"remove"),W=cn(r,"nextSibling"),H=cn(r,"childNodes"),s=cn(r,"parentNode");var V;"function"==typeof $&&(V=i.createElement("template")).content&&V.content.ownerDocument&&(i=V.content.ownerDocument);let g,c="",{implementation:X,createNodeIterator:K,createDocumentFragment:Z,getElementsByTagName:Q}=i,J=O.importNode,f=ai(),{MUSTACHE_EXPR:ee,ERB_EXPR:te,TMPLIT_EXPR:re,DATA_ATTR:ne,ARIA_ATTR:ie,IS_SCRIPT_OR_DATA:ae,ATTR_WHITESPACE:se,CUSTOM_ELEMENT:oe}=(d.isSupported="function"==typeof un&&"function"==typeof s&&X&&void 0!==X.createHTMLDocument,ti),le=ti.IS_ALLOWED_URI,h=null,ce=sn({},[...Dn,...On,...Pn,...$n,...zn]),m=null,he=sn({},[...Gn,...Un,...qn,...jn]),o=Object.seal(yn(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),u=null,ue=null,de=!0,pe=!0,ge=!1,fe=!0,y=!1,v=!0,x=!1,me=!1,ye=!1,b=!1,w=!1,k=!1,ve=!0,xe=!1,be=!0,T=!1,n,l=null,we=sn({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),ke=null,Te=sn({},["audio","video","img","source","image","track"]),Ee=null,Ce=sn({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),a="http://www.w3.org/1998/Math/MathML",E="http://www.w3.org/2000/svg",C="http://www.w3.org/1999/xhtml",_=C,_e=!1,Se=null,Ae=sn({},[a,E,C],_n),S=sn({},["mi","mo","mn","ms","mtext"]),A=sn({},["annotation-xml"]),Le=sn({},["title","style","font","a","script"]),L=null,Ne=["application/xhtml+xml","text/html"],N=null,I=null,Ie=i.createElement("form"),Re=mt(function(e){return e instanceof RegExp||e instanceof Function},"isRegexOrFunction"),Me=mt(function(){var e=0"+e:(n=Sn(e,/^[\r\n\t ]+/),r=n&&n[0]),"application/xhtml+xml"===L&&_===C&&(e=''+e+"");var n=g?g.createHTML(e):e;if(_===C)try{t=(new q).parseFromString(n,L)}catch{}if(!t||!t.documentElement){t=X.createDocument(_,"template",null);try{t.documentElement.innerHTML=_e?c:n}catch{}}return n=t.body||t.documentElement,e&&r&&n.insertBefore(i.createTextNode(r),n.childNodes[0]||null),_===C?Q.call(t,x?"html":"body")[0]:x?t.documentElement:n},"_initDocument"),$e=mt(function(e){return K.call(e.ownerDocument||e,e,t.SHOW_ELEMENT|t.SHOW_COMMENT|t.SHOW_TEXT|t.SHOW_PROCESSING_INSTRUCTION|t.SHOW_CDATA_SECTION,null)},"_createNodeIterator"),Fe=mt(function(e){return e instanceof U&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof G)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes)},"_isClobbered"),ze=mt(function(e){return"function"==typeof F&&e instanceof F},"_isNode");function D(e,t,r){bn(e,e=>{e.call(d,t,r,I)})}mt(D,"_executeHooks");let Ge=mt(function(t){let r=null;if(D(f.beforeSanitizeElements,t,null),!Fe(t)){var e=N(t.nodeName);if(D(f.uponSanitizeElement,t,{tagName:e,allowedTags:h}),!(v&&t.hasChildNodes()&&!ze(t.firstElementChild)&&Rn(/<[/\w!]/g,t.innerHTML)&&Rn(/<[/\w!]/g,t.textContent)||t.nodeType===ri.progressingInstruction||v&&t.nodeType===ri.comment&&Rn(/<[/\w]/g,t.data))){if(h[e]&&!u[e])return t instanceof z&&!Pe(t)||("noscript"===e||"noembed"===e||"noframes"===e)&&Rn(/<\/no(script|embed|frames)/i,t.innerHTML)?(R(t),!0):(y&&t.nodeType===ri.text&&(r=t.textContent,bn([ee,te,re],e=>{r=An(r,e," ")}),t.textContent!==r)&&(Tn(d.removed,{element:t.cloneNode()}),t.textContent=r),D(f.afterSanitizeElements,t,null),!1);if(!u[e]&&qe(e)&&(o.tagNameCheck instanceof RegExp&&Rn(o.tagNameCheck,e)||o.tagNameCheck instanceof Function&&o.tagNameCheck(e)))return!1;if(be&&!l[e]){var n=s(t)||t.parentNode,i=H(t)||t.childNodes;if(i&&n)for(let e=i.length-1;0<=e;--e){var a=j(i[e],!0);a.__removalCount=(t.__removalCount||0)+1,n.insertBefore(a,W(t))}}}}return R(t),!0},"_sanitizeElements"),Ue=mt(function(e,t,r){if(ve&&("id"===t||"name"===t)&&(r in i||r in Ie))return!1;if((!pe||ue[t]||!Rn(ne,t))&&(!de||!Rn(ie,t)))if(!m[t]||ue[t]){if(!(qe(e)&&(o.tagNameCheck instanceof RegExp&&Rn(o.tagNameCheck,e)||o.tagNameCheck instanceof Function&&o.tagNameCheck(e))&&(o.attributeNameCheck instanceof RegExp&&Rn(o.attributeNameCheck,t)||o.attributeNameCheck instanceof Function&&o.attributeNameCheck(t))||"is"===t&&o.allowCustomizedBuiltInElements&&(o.tagNameCheck instanceof RegExp&&Rn(o.tagNameCheck,r)||o.tagNameCheck instanceof Function&&o.tagNameCheck(r))))return!1}else if(!Ee[t]&&!Rn(le,An(r,se,""))&&("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==Ln(r,"data:")||!ke[e])&&(!ge||Rn(ae,An(r,se,"")))&&r)return!1;return!0},"_isValidAttribute"),qe=mt(function(e){return"annotation-xml"!==e&&Sn(e,oe)},"_isBasicCustomElement"),je=mt(function(c){D(f.beforeSanitizeAttributes,c,null);var h=c.attributes;if(h&&!Fe(c)){let o={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:m,forceKeepAttr:void 0},l=h.length;for(;l--;){let e=h[l],{name:t,namespaceURI:r,value:n}=e,i=N(t),a=n,s="value"===t?a:Nn(a);if(o.attrName=i,o.attrValue=s,o.keepAttr=!0,o.forceKeepAttr=void 0,D(f.uponSanitizeAttribute,c,o),s=o.attrValue,!xe||"id"!==i&&"name"!==i||(M(t,c),s="user-content-"+s),v&&Rn(/((--!?|])>)|<\/(style|title)/i,s))M(t,c);else if(!o.forceKeepAttr)if(o.keepAttr)if(!fe&&Rn(/\/>/i,s))M(t,c);else{y&&bn([ee,te,re],e=>{s=An(s,e," ")});var u=N(c.nodeName);if(Ue(u,i,s)){if(g&&"object"==typeof p&&"function"==typeof p.getAttributeType&&!r)switch(p.getAttributeType(u,i)){case"TrustedHTML":s=g.createHTML(s);break;case"TrustedScriptURL":s=g.createScriptURL(s)}if(s!==a)try{r?c.setAttributeNS(r,t,s):c.setAttribute(t,s),Fe(c)?R(c):kn(d.removed)}catch{M(t,c)}}else M(t,c)}else M(t,c)}D(f.afterSanitizeAttributes,c,null)}},"_sanitizeAttributes"),Ye=mt(function e(t){var r,n=$e(t);for(D(f.beforeSanitizeShadowDOM,t,null);r=n.nextNode();)D(f.uponSanitizeShadowNode,r,null),Ge(r),je(r),r.content instanceof B&&e(r.content);D(f.afterSanitizeShadowDOM,t,null)},"_sanitizeShadowDOM");return d.sanitize=function(e){let t=1
+`+l),y&&bn([ee,te,re],e=>{l=An(l,e," ")}),g&&k?g.createHTML(l):l},d.setConfig=function(){var e=0{({entries:un,setPrototypeOf:dn,isFrozen:pn,getPrototypeOf:gn,getOwnPropertyDescriptor:fn}=Object),{freeze:mn,seal:ei,create:yn}=Object,{apply:vn,construct:xn}=typeof Reflect<"u"&&Reflect,mn=mn||mt(function(e){return e},"freeze"),ei=ei||mt(function(e){return e},"seal"),vn=vn||mt(function(e,t,r){return e.apply(t,r)},"apply"),xn=xn||mt(function(e,t){return new e(...t)},"construct"),bn=nn(Array.prototype.forEach),wn=nn(Array.prototype.lastIndexOf),kn=nn(Array.prototype.pop),Tn=nn(Array.prototype.push),En=nn(Array.prototype.splice),Cn=nn(String.prototype.toLowerCase),_n=nn(String.prototype.toString),Sn=nn(String.prototype.match),An=nn(String.prototype.replace),Ln=nn(String.prototype.indexOf),Nn=nn(String.prototype.trim),In=nn(Object.prototype.hasOwnProperty),Rn=nn(RegExp.prototype.test),Mn=an(TypeError),mt(nn,"unapply"),mt(an,"unconstruct"),mt(sn,"addToSet"),mt(on,"cleanArray"),mt(ln,"clone"),mt(cn,"lookupGetter"),Dn=mn(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),On=mn(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),Pn=mn(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),Bn=mn(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),$n=mn(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),Fn=mn(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),zn=mn(["#text"]),Gn=mn(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns","slot"]),Un=mn(["accent-height","accumulate","additive","alignment-baseline","amplitude","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","exponent","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","intercept","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","slope","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","tablevalues","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),qn=mn(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),jn=mn(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),Yn=ei(/\{\{[\w\W]*|[\w\W]*\}\}/gm),Wn=ei(/<%[\w\W]*|[\w\W]*%>/gm),Hn=ei(/\$\{[\w\W]*/gm),Vn=ei(/^data-[\-\w.\u00B7-\uFFFF]+$/),Xn=ei(/^aria-[\-\w]+$/),Kn=ei(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Zn=ei(/^(?:\w+script|data):/i),Qn=ei(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Jn=ei(/^html$/i),ei=ei(/^[a-z][.\w]*(-[.\w]+)+$/i),ti=Object.freeze({__proto__:null,ARIA_ATTR:Xn,ATTR_WHITESPACE:Qn,CUSTOM_ELEMENT:ei,DATA_ATTR:Vn,DOCTYPE_NAME:Jn,ERB_EXPR:Wn,IS_ALLOWED_URI:Kn,IS_SCRIPT_OR_DATA:Zn,MUSTACHE_EXPR:Yn,TMPLIT_EXPR:Hn}),ri={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},ni=mt(function(){return"u"Ui[e])}function hi(e){if(e.default)return e.default;if(e=e.type,"string"!=typeof(e=Array.isArray(e)?e[0]:e))return e.enum[0];switch(e){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}function ui(e){for(var t=0;t=i[0]&&e<=i[1])return r.name}return null}function di(e){for(var t=0;t but got "+String(e)+".")}function t(e,t,r,n,i,a){ja[e][i]={font:t,group:r,replace:n},a&&n&&(ja[e][n]=ja[e][i])}function o(e){for(var{type:e,names:t,props:r,handler:n,htmlBuilder:i,mathmlBuilder:a}=e,s={type:e,numArgs:r.numArgs,argTypes:r.argTypes,allowedInArgument:!!r.allowedInArgument,allowedInText:!!r.allowedInText,allowedInMath:void 0===r.allowedInMath||r.allowedInMath,numOptionalArgs:r.numOptionalArgs||0,infix:!!r.infix,primitive:!!r.primitive,handler:n},o=0;oAV".indexOf(c)))throw new X('Expected one of "<>AV=|." after @',s[l]);for(var u=0;u<2;u++){for(var d=!0,p=l+1;p{for(var r in t)R(e,r,{get:t[r],enumerable:!0})})(li,{ParseError:()=>X,SETTINGS_SCHEMA:()=>Hi,__defineFunction:()=>o,__defineMacro:()=>l,__defineSymbol:()=>t,__domTree:()=>Jl,__parse:()=>Vl,__renderToDomTree:()=>Kl,__renderToHTMLTree:()=>Zl,__setFontMetrics:()=>pi,default:()=>ec,render:()=>Wl,renderToString:()=>Hl,version:()=>Ql});var Fi,zi,X,Gi,Ui,qi,ji,Yi,Wi,Hi,Vi,Xi,Ki,Zi,Qi,Ji,ea,ta,ra,na,ia,aa,sa,oa,la,ca,ha,ua,da,pa,ga,fa,ma,ya,va,xa,ba,wa,ka,Ta,Ea,Ca,_a,Sa,Aa,K,La,Na,Ia,Ra,Ma,Da,Oa,Pa,Ba,$a,Fa,za,Ga,Ua,qa,ja,h,u,d,Ya,p,Wa,Ha,Va,Xa,Ka,Za,Qa,Ja,es,ts,rs,ns,is,as,ss,os,ls,cs,hs,us,ds,ps,gs,fs,ms,ys,vs,xs,bs,ws,ks,Ts,Es,Z,Cs,_s,Ss,As,Ls,Ns,Is,Rs,Ms,Ds,Os,Ps,Bs,$s,Fs,zs,Gs,Us,qs,js,Ys,E,Ws,Hs,Vs,Xs,Ks,Zs,Qs,Js,eo,to,ro,no,io,ao,so,oo,lo,co,ho,uo,po,go,fo,mo,yo,vo,xo,bo,wo,ko,To,Eo,Co,_o,So,Ao,Lo,No,Io,Ro,Mo,Do,Oo,Po,Bo,$o,Fo,zo,Go,Uo,qo,jo,Yo,Wo,Ho,Vo,Xo,Ko,g,Zo,Qo,Jo,el,tl,rl,nl,f,il,al,sl,ol,ll,cl,hl,ul,dl,pl,gl,fl,ml,yl,vl,xl,bl,wl,kl,Tl,El,Cl,_l,Sl,m,Al,Ll,Nl,Il,Rl,Ml,Dl,Ol,Pl,Bl,$l,Fl,zl,Gl,Ul,ql,jl,Yl,Wl,Hl,Vl,Xl,Kl,Zl,Ql,Jl,ec,tc=b(()=>{for(Fi=class r{static{mt(this,"SourceLocation")}constructor(e,t,r){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=e,this.start=t,this.end=r}static range(e,t){return t?e&&e.loc&&t.loc&&e.loc.lexer===t.loc.lexer?new r(e.loc.lexer,e.loc.start,t.loc.end):null:e&&e.loc}},zi=class n{static{mt(this,"Token")}constructor(e,t){this.text=void 0,this.loc=void 0,this.noexpand=void 0,this.treatAsRelax=void 0,this.text=e,this.loc=t}range(e,t){return new n(t,Fi.range(this,e))}},(X=class s{static{mt(this,"ParseError")}constructor(e,t){this.name=void 0,this.position=void 0,this.length=void 0,this.rawMessage=void 0;var r,n,i,a="KaTeX parse error: "+e;return(t=t&&t.loc)&&t.start<=t.end&&(r=t.lexer.input,n=t.start,i=t.end,n===r.length?a+=" at end of input: ":a+=" at position "+(n+1)+": ",t=r.slice(n,i).replace(/[^]/g,"$&̲"),a+=(15":">","<":"<",'"':""","'":"'"},qi=/[&><"']/g,mt(ci,"escape"),ji=mt(function e(t){return"ordgroup"===t.type||"color"===t.type?1===t.body.length?e(t.body[0]):t:"font"===t.type?e(t.body):t},"getBaseElem"),g=mt(function(e){return"mathord"===(e=ji(e)).type||"textord"===e.type||"atom"===e.type},"isCharacterBox"),Yi=mt(function(e){if(e)return e;throw new Error("Expected non-null, but got "+String(e))},"assert"),cl=mt(function(e){return(e=/^[\x00-\x20]*([^\\/#?]*?)(:|*58|*3a|&colon)/i.exec(e))?":"===e[2]&&/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(e[1])?e[1].toLowerCase():null:"_relative"},"protocolFromUrl"),Wi={contains:fl,deflt:f,escape:ci,hyphenate:Bl,getBaseElem:ji,isCharacterBox:g,protocolFromUrl:cl},Hi={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:mt(e=>"#"+e,"cliProcessor")},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:mt((e,t)=>(t.push(e),t),"cliProcessor")},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:mt(e=>Math.max(0,e),"processor"),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:mt(e=>Math.max(0,e),"processor"),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:mt(e=>Math.max(0,e),"processor"),cli:"-e, --max-expand ",cliProcessor:mt(e=>"Infinity"===e?1/0:parseInt(e),"cliProcessor")},globalGroup:{type:"boolean",cli:!1}},mt(hi,"getDefaultValue"),Vi=class{static{mt(this,"Settings")}constructor(e){for(var t in this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{},Hi){var r;Hi.hasOwnProperty(t)&&(r=Hi[t],this[t]=void 0!==e[t]?r.processor?r.processor(e[t]):e[t]:hi(r))}}reportNonstrict(e,t,r){var n=this.strict;if((n="function"==typeof n?n(e,t,r):n)&&"ignore"!==n){if(!0===n||"error"===n)throw new X("LaTeX-incompatible input and strict mode is set to 'error': "+t+" ["+e+"]",r);"warn"===n?typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+n+"': "+t+" ["+e+"]")}}useStrictBehavior(e,t,r){var n=this.strict;if("function"==typeof n)try{n=n(e,t,r)}catch{n="error"}return!(!n||"ignore"===n||!0!==n&&"error"!==n&&("warn"===n?typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+n+"': "+t+" ["+e+"]"),1))}isTrusted(e){if(e.url&&!e.protocol){var t=Wi.protocolFromUrl(e.url);if(null==t)return!1;e.protocol=t}return!!("function"==typeof this.trust?this.trust(e):this.trust)}},fl=class{static{mt(this,"Style")}constructor(e,t,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=t,this.cramped=r}sup(){return Xi[Ki[this.id]]}sub(){return Xi[Zi[this.id]]}fracNum(){return Xi[Qi[this.id]]}fracDen(){return Xi[Ji[this.id]]}cramp(){return Xi[ea[this.id]]}text(){return Xi[ta[this.id]]}isTight(){return 2<=this.size}},Xi=[new fl(0,0,!1),new fl(1,0,!0),new fl(2,1,!1),new fl(3,1,!0),new fl(4,2,!1),new fl(5,2,!0),new fl(6,3,!1),new fl(7,3,!0)],Ki=[4,5,4,5,6,7,6,7],Zi=[5,5,5,5,7,7,7,7],Qi=[2,3,4,5,6,7,6,7],Ji=[3,3,5,5,7,7,7,7],ea=[1,1,3,3,5,5,7,7],ta=[0,1,2,3,2,3,2,3],ra={DISPLAY:Xi[0],TEXT:Xi[2],SCRIPT:Xi[4],SCRIPTSCRIPT:Xi[6]},na=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}],mt(ui,"scriptFromCodepoint"),ia=[],na.forEach(e=>e.blocks.forEach(e=>ia.push(...e))),mt(di,"supportedCodepoint"),aa=mt(function(e,t){return"M95,"+(622+e+t)+`
+c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14
+c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54
+c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10
+s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429
+c69,-144,104.5,-217.7,106.5,-221
+l`+e/2.075+" -"+e+`
+c5.3,-9.3,12,-14,20,-14
+H400000v`+(40+e)+`H845.2724
+s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7
+c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z
+M`+(834+e)+" "+t+"h400000v"+(40+e)+"h-400000z"},"sqrtMain"),sa=mt(function(e,t){return"M263,"+(601+e+t)+`c0.7,0,18,39.7,52,119
+c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120
+c340,-704.7,510.7,-1060.3,512,-1067
+l`+e/2.084+" -"+e+`
+c4.7,-7.3,11,-11,19,-11
+H40000v`+(40+e)+`H1012.3
+s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232
+c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1
+s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26
+c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z
+M`+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"},"sqrtSize1"),oa=mt(function(e,t){return"M983 "+(10+e+t)+`
+l`+e/3.13+" -"+e+`
+c4,-6.7,10,-10,18,-10 H400000v`+(40+e)+`
+H1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7
+s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744
+c-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30
+c26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722
+c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5
+c53.7,-170.3,84.5,-266.8,92.5,-289.5z
+M`+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"},"sqrtSize2"),la=mt(function(e,t){return"M424,"+(2398+e+t)+`
+c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514
+c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20
+s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121
+s209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081
+l`+e/4.223+" -"+e+`c4,-6.7,10,-10,18,-10 H400000
+v`+(40+e)+`H1014.6
+s-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185
+c-2,6,-10,9,-24,9
+c-8,0,-12,-0.7,-12,-2z M`+(1001+e)+" "+t+`
+h400000v`+(40+e)+"h-400000z"},"sqrtSize3"),ca=mt(function(e,t){return"M473,"+(2713+e+t)+`
+c339.3,-1799.3,509.3,-2700,510,-2702 l`+e/5.298+" -"+e+`
+c3.3,-7.3,9.3,-11,18,-11 H400000v`+(40+e)+`H1017.7
+s-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9
+c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200
+c0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26
+s76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,
+606zM`+(1001+e)+" "+t+"h400000v"+(40+e)+"H1017.7z"},"sqrtSize4"),ha=mt(function(e){return"M400000 "+e+" H0 L"+e/2+" 0 l65 45 L145 "+(e-80)+" H400000z"},"phasePath"),ua=mt(function(e,t,r){return"M702 "+(e+t)+"H400000"+(40+e)+`
+H742v`+(r-54-t-e)+`l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1
+h-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170
+c-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667
+219 661 l218 661zM702 `+t+"H400000v"+(40+e)+"H742z"},"sqrtTall"),da=mt(function(e,t,r){t*=1e3;var n="";switch(e){case"sqrtMain":n=aa(t,80);break;case"sqrtSize1":n=sa(t,80);break;case"sqrtSize2":n=oa(t,80);break;case"sqrtSize3":n=la(t,80);break;case"sqrtSize4":n=ca(t,80);break;case"sqrtTall":n=ua(t,80,r)}return n},"sqrtPath"),pa=mt(function(e,t){switch(e){case"⎜":return"M291 0 H417 V"+t+" H291z M291 0 H417 V"+t+" H291z";case"∣":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145z";case"∥":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145zM367 0 H410 V"+t+" H367z M367 0 H410 V"+t+" H367z";case"⎟":return"M457 0 H583 V"+t+" H457z M457 0 H583 V"+t+" H457z";case"⎢":return"M319 0 H403 V"+t+" H319z M319 0 H403 V"+t+" H319z";case"⎥":return"M263 0 H347 V"+t+" H263z M263 0 H347 V"+t+" H263z";case"⎪":return"M384 0 H504 V"+t+" H384z M384 0 H504 V"+t+" H384z";case"⏐":return"M312 0 H355 V"+t+" H312z M312 0 H355 V"+t+" H312z";case"‖":return"M257 0 H300 V"+t+" H257z M257 0 H300 V"+t+" H257zM478 0 H521 V"+t+" H478z M478 0 H521 V"+t+" H478z";default:return""}},"innerPath"),ga={doubleleftarrow:`M262 157
+l10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3
+ 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28
+ 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5
+c2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5
+ 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87
+-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7
+-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z
+m8 0v40h399730v-40zm0 194v40h399730v-40z`,doublerightarrow:`M399738 392l
+-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5
+ 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88
+-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68
+-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18
+-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782
+c-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3
+-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z`,leftarrow:`M400000 241H110l3-3c68.7-52.7 113.7-120
+ 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8
+-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247
+c-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208
+ 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3
+ 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202
+ l-3-3h399890zM100 241v40h399900v-40z`,leftbrace:`M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117
+-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7
+ 5-6 9-10 13-.7 1-7.3 1-20 1H6z`,leftbraceunder:`M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13
+ 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688
+ 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7
+-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z`,leftgroup:`M400000 80
+H435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0
+ 435 0h399565z`,leftgroupunder:`M400000 262
+H435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219
+ 435 219h399565z`,leftharpoon:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3
+-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5
+-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7
+-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z`,leftharpoonplus:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5
+ 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3
+-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7
+-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z
+m0 0v40h400000v-40z`,leftharpoondown:`M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333
+ 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5
+ 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667
+-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z`,leftharpoondownplus:`M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12
+ 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7
+-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0
+v40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z`,lefthook:`M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5
+-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3
+-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21
+ 71.5 23h399859zM103 281v-40h399897v40z`,leftlinesegment:`M40 281 V428 H0 V94 H40 V241 H400000 v40z
+M40 281 V428 H0 V94 H40 V241 H400000 v40z`,leftmapsto:`M40 281 V448H0V74H40V241H400000v40z
+M40 281 V448H0V74H40V241H400000v40z`,leftToFrom:`M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23
+-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8
+c28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3
+ 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z`,longequal:`M0 50 h400000 v40H0z m0 194h40000v40H0z
+M0 50 h400000 v40H0z m0 194h40000v40H0z`,midbrace:`M200428 334
+c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14
+-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7
+ 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11
+ 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z`,midbraceunder:`M199572 214
+c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14
+ 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3
+ 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0
+-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z`,oiintSize1:`M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6
+-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z
+m368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8
+60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z`,oiintSize2:`M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8
+-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z
+m502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2
+c0 110 84 276 504 276s502.4-166 502.4-276z`,oiiintSize1:`M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6
+-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z
+m525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0
+85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z`,oiiintSize2:`M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8
+-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z
+m770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1
+c0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z`,rightarrow:`M0 241v40h399891c-47.3 35.3-84 78-110 128
+-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20
+ 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7
+ 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85
+-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5
+-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67
+ 151.7 139 205zm0 0v40h399900v-40z`,rightbrace:`M400000 542l
+-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5
+s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1
+c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z`,rightbraceunder:`M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3
+ 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237
+-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z`,rightgroup:`M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0
+ 3-1 3-3v-38c-76-158-257-219-435-219H0z`,rightgroupunder:`M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18
+ 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z`,rightharpoon:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3
+-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2
+-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58
+ 69.2 92 94.5zm0 0v40h399900v-40z`,rightharpoonplus:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11
+-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7
+ 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z
+m0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z`,rightharpoondown:`M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8
+ 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5
+-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95
+-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z`,rightharpoondownplus:`M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8
+ 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3
+ 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3
+-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z
+m0-194v40h400000v-40zm0 0v40h400000v-40z`,righthook:`M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3
+ 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0
+-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21
+ 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z`,rightlinesegment:`M399960 241 V94 h40 V428 h-40 V281 H0 v-40z
+M399960 241 V94 h40 V428 h-40 V281 H0 v-40z`,rightToFrom:`M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23
+ 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32
+-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142
+-167z M100 147v40h399900v-40zM0 341v40h399900v-40z`,twoheadleftarrow:`M0 167c68 40
+ 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69
+-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3
+-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19
+-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101
+ 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z`,twoheadrightarrow:`M400000 167
+c-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3
+ 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42
+ 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333
+-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70
+ 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z`,tilde1:`M200 55.538c-77 0-168 73.953-177 73.953-3 0-7
+-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0
+ 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0
+ 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128
+-68.267.847-113-73.952-191-73.952z`,tilde2:`M344 55.266c-142 0-300.638 81.316-311.5 86.418
+-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9
+ 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114
+c1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751
+ 181.476 676 181.476c-149 0-189-126.21-332-126.21z`,tilde3:`M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457
+-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0
+ 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697
+ 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696
+ -338 0-409-156.573-744-156.573z`,tilde4:`M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345
+-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409
+ 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9
+ 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409
+ -175.236-744-175.236z`,vec:`M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
+3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
+10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
+-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
+-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
+H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
+c-16-25.333-24-45-24-59z`,widehat1:`M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22
+c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z`,widehat2:`M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10
+-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat3:`M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10
+-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat4:`M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10
+-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widecheck1:`M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,
+-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z`,widecheck2:`M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,
+-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck3:`M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,
+-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck4:`M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,
+-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,baraboveleftarrow:`M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202
+c4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5
+c-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130
+s-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47
+121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6
+s2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11
+c0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z
+M100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z`,rightarrowabovebar:`M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32
+-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0
+13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39
+-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5
+-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5
+-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67
+151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z`,baraboveshortleftharpoon:`M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11
+c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17
+c2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21
+c-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40
+c-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z
+M0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z`,rightharpoonaboveshortbar:`M0,241 l0,40c399126,0,399993,0,399993,0
+c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,
+-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6
+c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z
+M0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z`,shortbaraboveleftharpoon:`M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11
+c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,
+1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,
+-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z
+M93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z`,shortrightharpoonabovebar:`M53,241l0,40c398570,0,399437,0,399437,0
+c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,
+-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6
+c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z
+M500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z`},fa=mt(function(e,t){switch(e){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+` v1759 h347 v-84
+H403z M403 1759 V0 H319 V1759 v`+t+" v1759 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+` v1759 H0 v84 H347z
+M347 1759 V0 H263 V1759 v`+t+" v1759 h84z";case"vert":return"M145 15 v585 v"+t+` v585 c2.667,10,9.667,15,21,15
+c10,0,16.667,-5,20,-15 v-585 v`+-t+` v-585 c-2.667,-10,-9.667,-15,-21,-15
+c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+t+" v585 h43z";case"doublevert":return"M145 15 v585 v"+t+` v585 c2.667,10,9.667,15,21,15
+c10,0,16.667,-5,20,-15 v-585 v`+-t+` v-585 c-2.667,-10,-9.667,-15,-21,-15
+c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+t+` v585 h43z
+M367 15 v585 v`+t+` v585 c2.667,10,9.667,15,21,15
+c10,0,16.667,-5,20,-15 v-585 v`+-t+` v-585 c-2.667,-10,-9.667,-15,-21,-15
+c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v`+t+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+t+` v1715 h263 v84 H319z
+MM319 602 V0 H403 V602 v`+t+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+t+` v1799 H0 v-84 H319z
+MM319 602 V0 H403 V602 v`+t+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+` v602 h84z
+M403 1759 V0 H319 V1759 v`+t+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+` v602 h84z
+M347 1759 V0 h-84 V1759 v`+t+" v602 h84z";case"lparen":return`M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1
+c-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349,
+-36,557 l0,`+(t+84)+`c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210,
+949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9
+c0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5,
+-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189
+l0,-`+(t+92)+`c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3,
+-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z`;case"rparen":return`M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3,
+63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5
+c11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,`+(t+9)+`
+c-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664
+c-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11
+c0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17
+c242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558
+l0,-`+(t+144)+`c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7,
+-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z`;default:throw new Error("Unknown stretchy delimiter.")}},"tallDelim"),ma=class{static{mt(this,"DocumentFragment")}constructor(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return Wi.contains(this.classes,e)}toNode(){for(var e=document.createDocumentFragment(),t=0;te.toText(),"toText");return this.children.map(e).join("")}},ya={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},va={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},xa={"Å":"A","Ð":"D","Þ":"o","å":"a","ð":"d","þ":"o","А":"A","Б":"B","В":"B","Г":"F","Д":"A","Е":"E","Ж":"K","З":"3","И":"N","Й":"N","К":"K","Л":"N","М":"M","Н":"H","О":"O","П":"N","Р":"P","С":"C","Т":"T","У":"y","Ф":"O","Х":"X","Ц":"U","Ч":"h","Ш":"W","Щ":"W","Ъ":"B","Ы":"X","Ь":"B","Э":"3","Ю":"X","Я":"R","а":"a","б":"b","в":"a","г":"r","д":"y","е":"e","ж":"m","з":"e","и":"n","й":"n","к":"n","л":"n","м":"m","н":"n","о":"o","п":"n","р":"p","с":"c","т":"o","у":"y","ф":"b","х":"x","ц":"n","ч":"n","ш":"w","щ":"w","ъ":"a","ы":"m","ь":"a","э":"e","ю":"m","я":"r"},mt(pi,"setFontMetrics"),mt(gi,"getCharacterMetrics"),ba={},mt(fi,"getGlobalMetrics"),wa=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],ka=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],Ta=mt(function(e,t){return t.size<2?e:wa[e-1][t.size-1]},"sizeAtStyle"),(Ea=class i{static{mt(this,"Options")}constructor(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||i.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=ka[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}extend(e){var t,r={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(t in e)e.hasOwnProperty(t)&&(r[t]=e[t]);return new i(r)}havingStyle(e){return this.style===e?this:this.extend({style:e,size:Ta(this.textSize,e)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(e){return this.size===e&&this.textSize===e?this:this.extend({style:this.style.text(),size:e,textSize:e,sizeMultiplier:ka[e-1]})}havingBaseStyle(e){e=e||this.style.text();var t=Ta(i.BASESIZE,e);return this.size===t&&this.textSize===i.BASESIZE&&this.style===e?this:this.extend({style:e,size:t})}havingBaseSizing(){var e;switch(this.style.id){case 4:case 5:e=3;break;case 6:case 7:e=1;break;default:e=6}return this.extend({style:this.style.text(),size:e})}withColor(e){return this.extend({color:e})}withPhantom(){return this.extend({phantom:!0})}withFont(e){return this.extend({font:e})}withTextFontFamily(e){return this.extend({fontFamily:e,font:""})}withTextFontWeight(e){return this.extend({fontWeight:e,font:""})}withTextFontShape(e){return this.extend({fontShape:e,font:""})}sizingClasses(e){return e.size!==this.size?["sizing","reset-size"+e.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==i.BASESIZE?["sizing","reset-size"+this.size,"size"+i.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=fi(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}}).BASESIZE=6,Ca={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},_a={ex:!0,em:!0,mu:!0},Sa=mt(function(e){return(e="string"!=typeof e?e.unit:e)in Ca||e in _a||"ex"===e},"validUnit"),Aa=mt(function(e,t){var r;if(e.unit in Ca)r=Ca[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if("mu"===e.unit)r=t.fontMetrics().cssEmPerMu;else{var n=t.style.isTight()?t.havingStyle(t.style.text()):t;if("ex"===e.unit)r=n.fontMetrics().xHeight;else{if("em"!==e.unit)throw new X("Invalid unit: '"+e.unit+"'");r=n.fontMetrics().quad}n!==t&&(r*=n.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*r,t.maxSize)},"calculateSize"),K=mt(function(e){return+e.toFixed(4)+"em"},"makeEm"),La=mt(function(e){return e.filter(e=>e).join(" ")},"createClass"),Na=mt(function(e,t,r){this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},t&&(t.style.isTight()&&this.classes.push("mtight"),e=t.getColor())&&(this.style.color=e)},"initNode"),Ia=mt(function(e){var t,r,n=document.createElement(e);for(t in n.className=La(this.classes),this.style)this.style.hasOwnProperty(t)&&(n.style[t]=this.style[t]);for(r in this.attributes)this.attributes.hasOwnProperty(r)&&n.setAttribute(r,this.attributes[r]);for(var i=0;i/=\x00-\x1f]/,Ma=mt(function(e){var t,r,n="<"+e,i=(this.classes.length&&(n+=' class="'+Wi.escape(La(this.classes))+'"'),"");for(t in this.style)this.style.hasOwnProperty(t)&&(i+=Wi.hyphenate(t)+":"+this.style[t]+";");for(r in i&&(n+=' style="'+Wi.escape(i)+'"'),this.attributes)if(this.attributes.hasOwnProperty(r)){if(Ra.test(r))throw new X("Invalid attribute name '"+r+"'");n+=" "+r+'="'+Wi.escape(this.attributes[r])+'"'}n+=">";for(var a=0;a"},"toMarkup"),Da=class{static{mt(this,"Span")}constructor(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,Na.call(this,e,r,n),this.children=t||[]}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return Wi.contains(this.classes,e)}toNode(){return Ia.call(this,"span")}toMarkup(){return Ma.call(this,"span")}},Oa=class{static{mt(this,"Anchor")}constructor(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,Na.call(this,t,n),this.children=r||[],this.setAttribute("href",e)}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return Wi.contains(this.classes,e)}toNode(){return Ia.call(this,"a")}toMarkup(){return Ma.call(this,"a")}},Pa=class{static{mt(this,"Img")}constructor(e,t,r){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=t,this.src=e,this.classes=["mord"],this.style=r}hasClass(e){return Wi.contains(this.classes,e)}toNode(){var e,t=document.createElement("img");for(e in t.src=this.src,t.alt=this.alt,t.className="mord",this.style)this.style.hasOwnProperty(e)&&(t.style[e]=this.style[e]);return t}toMarkup(){var e,t=' "}},Ba={"î":"ı̂","ï":"ı̈","í":"ı́","ì":"ı̀"},$a=class{static{mt(this,"SymbolNode")}constructor(e,t,r,n,i,a,s,o){this.text=void 0,this.height=void 0,this.depth=void 0,this.italic=void 0,this.skew=void 0,this.width=void 0,this.maxFontSize=void 0,this.classes=void 0,this.style=void 0,this.text=e,this.height=t||0,this.depth=r||0,this.italic=n||0,this.skew=i||0,this.width=a||0,this.classes=s||[],this.style=o||{},this.maxFontSize=0,(e=ui(this.text.charCodeAt(0)))&&this.classes.push(e+"_fallback"),/[îïíì]/.test(this.text)&&(this.text=Ba[this.text])}hasClass(e){return Wi.contains(this.classes,e)}toNode(){var e,t=document.createTextNode(this.text),r=null;for(e in 0")+i+"":i}},Fa=class{static{mt(this,"SvgNode")}constructor(e,t){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=t||{}}toNode(){var e,t=document.createElementNS("http://www.w3.org/2000/svg","svg");for(e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);for(var r=0;r";for(var r=0;r"}},za=class{static{mt(this,"PathNode")}constructor(e,t){this.pathName=void 0,this.alternate=void 0,this.pathName=e,this.alternate=t}toNode(){var e=document.createElementNS("http://www.w3.org/2000/svg","path");return this.alternate?e.setAttribute("d",this.alternate):e.setAttribute("d",ga[this.pathName]),e}toMarkup(){return this.alternate?' ':' '}},Ga=class{static{mt(this,"LineNode")}constructor(e){this.attributes=void 0,this.attributes=e||{}}toNode(){var e,t=document.createElementNS("http://www.w3.org/2000/svg","line");for(e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);return t}toMarkup(){var e,t=" "}},mt(mi,"assertSymbolDomNode"),mt(yi,"assertSpan"),Ua={bin:1,close:1,inner:1,open:1,punct:1,rel:1},qa={"accent-token":1,mathord:1,"op-token":1,spacing:1,textord:1},ja={math:{},text:{}},mt(t,"defineSymbol"),u="text",f="ams",Bl="accent-token",g="bin",cl="close",fl="inner",Ya="mathord",Pl="op-token",el="open",pl="punct",Jo="spacing",p="textord",t(h="math",d="main",m="rel","≡","\\equiv",!0),t(h,d,m,"≺","\\prec",!0),t(h,d,m,"≻","\\succ",!0),t(h,d,m,"∼","\\sim",!0),t(h,d,m,"⊥","\\perp"),t(h,d,m,"⪯","\\preceq",!0),t(h,d,m,"⪰","\\succeq",!0),t(h,d,m,"≃","\\simeq",!0),t(h,d,m,"∣","\\mid",!0),t(h,d,m,"≪","\\ll",!0),t(h,d,m,"≫","\\gg",!0),t(h,d,m,"≍","\\asymp",!0),t(h,d,m,"∥","\\parallel"),t(h,d,m,"⋈","\\bowtie",!0),t(h,d,m,"⌣","\\smile",!0),t(h,d,m,"⊑","\\sqsubseteq",!0),t(h,d,m,"⊒","\\sqsupseteq",!0),t(h,d,m,"≐","\\doteq",!0),t(h,d,m,"⌢","\\frown",!0),t(h,d,m,"∋","\\ni",!0),t(h,d,m,"∝","\\propto",!0),t(h,d,m,"⊢","\\vdash",!0),t(h,d,m,"⊣","\\dashv",!0),t(h,d,m,"∋","\\owns"),t(h,d,pl,".","\\ldotp"),t(h,d,pl,"⋅","\\cdotp"),t(h,d,p,"#","\\#"),t(u,d,p,"#","\\#"),t(h,d,p,"&","\\&"),t(u,d,p,"&","\\&"),t(h,d,p,"ℵ","\\aleph",!0),t(h,d,p,"∀","\\forall",!0),t(h,d,p,"ℏ","\\hbar",!0),t(h,d,p,"∃","\\exists",!0),t(h,d,p,"∇","\\nabla",!0),t(h,d,p,"♭","\\flat",!0),t(h,d,p,"ℓ","\\ell",!0),t(h,d,p,"♮","\\natural",!0),t(h,d,p,"♣","\\clubsuit",!0),t(h,d,p,"℘","\\wp",!0),t(h,d,p,"♯","\\sharp",!0),t(h,d,p,"♢","\\diamondsuit",!0),t(h,d,p,"ℜ","\\Re",!0),t(h,d,p,"♡","\\heartsuit",!0),t(h,d,p,"ℑ","\\Im",!0),t(h,d,p,"♠","\\spadesuit",!0),t(h,d,p,"§","\\S",!0),t(u,d,p,"§","\\S"),t(h,d,p,"¶","\\P",!0),t(u,d,p,"¶","\\P"),t(h,d,p,"†","\\dag"),t(u,d,p,"†","\\dag"),t(u,d,p,"†","\\textdagger"),t(h,d,p,"‡","\\ddag"),t(u,d,p,"‡","\\ddag"),t(u,d,p,"‡","\\textdaggerdbl"),t(h,d,cl,"⎱","\\rmoustache",!0),t(h,d,el,"⎰","\\lmoustache",!0),t(h,d,cl,"⟯","\\rgroup",!0),t(h,d,el,"⟮","\\lgroup",!0),t(h,d,g,"∓","\\mp",!0),t(h,d,g,"⊖","\\ominus",!0),t(h,d,g,"⊎","\\uplus",!0),t(h,d,g,"⊓","\\sqcap",!0),t(h,d,g,"∗","\\ast"),t(h,d,g,"⊔","\\sqcup",!0),t(h,d,g,"◯","\\bigcirc",!0),t(h,d,g,"∙","\\bullet",!0),t(h,d,g,"‡","\\ddagger"),t(h,d,g,"≀","\\wr",!0),t(h,d,g,"⨿","\\amalg"),t(h,d,g,"&","\\And"),t(h,d,m,"⟵","\\longleftarrow",!0),t(h,d,m,"⇐","\\Leftarrow",!0),t(h,d,m,"⟸","\\Longleftarrow",!0),t(h,d,m,"⟶","\\longrightarrow",!0),t(h,d,m,"⇒","\\Rightarrow",!0),t(h,d,m,"⟹","\\Longrightarrow",!0),t(h,d,m,"↔","\\leftrightarrow",!0),t(h,d,m,"⟷","\\longleftrightarrow",!0),t(h,d,m,"⇔","\\Leftrightarrow",!0),t(h,d,m,"⟺","\\Longleftrightarrow",!0),t(h,d,m,"↦","\\mapsto",!0),t(h,d,m,"⟼","\\longmapsto",!0),t(h,d,m,"↗","\\nearrow",!0),t(h,d,m,"↩","\\hookleftarrow",!0),t(h,d,m,"↪","\\hookrightarrow",!0),t(h,d,m,"↘","\\searrow",!0),t(h,d,m,"↼","\\leftharpoonup",!0),t(h,d,m,"⇀","\\rightharpoonup",!0),t(h,d,m,"↙","\\swarrow",!0),t(h,d,m,"↽","\\leftharpoondown",!0),t(h,d,m,"⇁","\\rightharpoondown",!0),t(h,d,m,"↖","\\nwarrow",!0),t(h,d,m,"⇌","\\rightleftharpoons",!0),t(h,f,m,"≮","\\nless",!0),t(h,f,m,"","\\@nleqslant"),t(h,f,m,"","\\@nleqq"),t(h,f,m,"⪇","\\lneq",!0),t(h,f,m,"≨","\\lneqq",!0),t(h,f,m,"","\\@lvertneqq"),t(h,f,m,"⋦","\\lnsim",!0),t(h,f,m,"⪉","\\lnapprox",!0),t(h,f,m,"⊀","\\nprec",!0),t(h,f,m,"⋠","\\npreceq",!0),t(h,f,m,"⋨","\\precnsim",!0),t(h,f,m,"⪹","\\precnapprox",!0),t(h,f,m,"≁","\\nsim",!0),t(h,f,m,"","\\@nshortmid"),t(h,f,m,"∤","\\nmid",!0),t(h,f,m,"⊬","\\nvdash",!0),t(h,f,m,"⊭","\\nvDash",!0),t(h,f,m,"⋪","\\ntriangleleft"),t(h,f,m,"⋬","\\ntrianglelefteq",!0),t(h,f,m,"⊊","\\subsetneq",!0),t(h,f,m,"","\\@varsubsetneq"),t(h,f,m,"⫋","\\subsetneqq",!0),t(h,f,m,"","\\@varsubsetneqq"),t(h,f,m,"≯","\\ngtr",!0),t(h,f,m,"","\\@ngeqslant"),t(h,f,m,"","\\@ngeqq"),t(h,f,m,"⪈","\\gneq",!0),t(h,f,m,"≩","\\gneqq",!0),t(h,f,m,"","\\@gvertneqq"),t(h,f,m,"⋧","\\gnsim",!0),t(h,f,m,"⪊","\\gnapprox",!0),t(h,f,m,"⊁","\\nsucc",!0),t(h,f,m,"⋡","\\nsucceq",!0),t(h,f,m,"⋩","\\succnsim",!0),t(h,f,m,"⪺","\\succnapprox",!0),t(h,f,m,"≆","\\ncong",!0),t(h,f,m,"","\\@nshortparallel"),t(h,f,m,"∦","\\nparallel",!0),t(h,f,m,"⊯","\\nVDash",!0),t(h,f,m,"⋫","\\ntriangleright"),t(h,f,m,"⋭","\\ntrianglerighteq",!0),t(h,f,m,"","\\@nsupseteqq"),t(h,f,m,"⊋","\\supsetneq",!0),t(h,f,m,"","\\@varsupsetneq"),t(h,f,m,"⫌","\\supsetneqq",!0),t(h,f,m,"","\\@varsupsetneqq"),t(h,f,m,"⊮","\\nVdash",!0),t(h,f,m,"⪵","\\precneqq",!0),t(h,f,m,"⪶","\\succneqq",!0),t(h,f,m,"","\\@nsubseteqq"),t(h,f,g,"⊴","\\unlhd"),t(h,f,g,"⊵","\\unrhd"),t(h,f,m,"↚","\\nleftarrow",!0),t(h,f,m,"↛","\\nrightarrow",!0),t(h,f,m,"⇍","\\nLeftarrow",!0),t(h,f,m,"⇏","\\nRightarrow",!0),t(h,f,m,"↮","\\nleftrightarrow",!0),t(h,f,m,"⇎","\\nLeftrightarrow",!0),t(h,f,m,"△","\\vartriangle"),t(h,f,p,"ℏ","\\hslash"),t(h,f,p,"▽","\\triangledown"),t(h,f,p,"◊","\\lozenge"),t(h,f,p,"Ⓢ","\\circledS"),t(h,f,p,"®","\\circledR"),t(u,f,p,"®","\\circledR"),t(h,f,p,"∡","\\measuredangle",!0),t(h,f,p,"∄","\\nexists"),t(h,f,p,"℧","\\mho"),t(h,f,p,"Ⅎ","\\Finv",!0),t(h,f,p,"⅁","\\Game",!0),t(h,f,p,"‵","\\backprime"),t(h,f,p,"▲","\\blacktriangle"),t(h,f,p,"▼","\\blacktriangledown"),t(h,f,p,"■","\\blacksquare"),t(h,f,p,"⧫","\\blacklozenge"),t(h,f,p,"★","\\bigstar"),t(h,f,p,"∢","\\sphericalangle",!0),t(h,f,p,"∁","\\complement",!0),t(h,f,p,"ð","\\eth",!0),t(u,d,p,"ð","ð"),t(h,f,p,"╱","\\diagup"),t(h,f,p,"╲","\\diagdown"),t(h,f,p,"□","\\square"),t(h,f,p,"□","\\Box"),t(h,f,p,"◊","\\Diamond"),t(h,f,p,"¥","\\yen",!0),t(u,f,p,"¥","\\yen",!0),t(h,f,p,"✓","\\checkmark",!0),t(u,f,p,"✓","\\checkmark"),t(h,f,p,"ℶ","\\beth",!0),t(h,f,p,"ℸ","\\daleth",!0),t(h,f,p,"ℷ","\\gimel",!0),t(h,f,p,"ϝ","\\digamma",!0),t(h,f,p,"ϰ","\\varkappa"),t(h,f,el,"┌","\\@ulcorner",!0),t(h,f,cl,"┐","\\@urcorner",!0),t(h,f,el,"└","\\@llcorner",!0),t(h,f,cl,"┘","\\@lrcorner",!0),t(h,f,m,"≦","\\leqq",!0),t(h,f,m,"⩽","\\leqslant",!0),t(h,f,m,"⪕","\\eqslantless",!0),t(h,f,m,"≲","\\lesssim",!0),t(h,f,m,"⪅","\\lessapprox",!0),t(h,f,m,"≊","\\approxeq",!0),t(h,f,g,"⋖","\\lessdot"),t(h,f,m,"⋘","\\lll",!0),t(h,f,m,"≶","\\lessgtr",!0),t(h,f,m,"⋚","\\lesseqgtr",!0),t(h,f,m,"⪋","\\lesseqqgtr",!0),t(h,f,m,"≑","\\doteqdot"),t(h,f,m,"≓","\\risingdotseq",!0),t(h,f,m,"≒","\\fallingdotseq",!0),t(h,f,m,"∽","\\backsim",!0),t(h,f,m,"⋍","\\backsimeq",!0),t(h,f,m,"⫅","\\subseteqq",!0),t(h,f,m,"⋐","\\Subset",!0),t(h,f,m,"⊏","\\sqsubset",!0),t(h,f,m,"≼","\\preccurlyeq",!0),t(h,f,m,"⋞","\\curlyeqprec",!0),t(h,f,m,"≾","\\precsim",!0),t(h,f,m,"⪷","\\precapprox",!0),t(h,f,m,"⊲","\\vartriangleleft"),t(h,f,m,"⊴","\\trianglelefteq"),t(h,f,m,"⊨","\\vDash",!0),t(h,f,m,"⊪","\\Vvdash",!0),t(h,f,m,"⌣","\\smallsmile"),t(h,f,m,"⌢","\\smallfrown"),t(h,f,m,"≏","\\bumpeq",!0),t(h,f,m,"≎","\\Bumpeq",!0),t(h,f,m,"≧","\\geqq",!0),t(h,f,m,"⩾","\\geqslant",!0),t(h,f,m,"⪖","\\eqslantgtr",!0),t(h,f,m,"≳","\\gtrsim",!0),t(h,f,m,"⪆","\\gtrapprox",!0),t(h,f,g,"⋗","\\gtrdot"),t(h,f,m,"⋙","\\ggg",!0),t(h,f,m,"≷","\\gtrless",!0),t(h,f,m,"⋛","\\gtreqless",!0),t(h,f,m,"⪌","\\gtreqqless",!0),t(h,f,m,"≖","\\eqcirc",!0),t(h,f,m,"≗","\\circeq",!0),t(h,f,m,"≜","\\triangleq",!0),t(h,f,m,"∼","\\thicksim"),t(h,f,m,"≈","\\thickapprox"),t(h,f,m,"⫆","\\supseteqq",!0),t(h,f,m,"⋑","\\Supset",!0),t(h,f,m,"⊐","\\sqsupset",!0),t(h,f,m,"≽","\\succcurlyeq",!0),t(h,f,m,"⋟","\\curlyeqsucc",!0),t(h,f,m,"≿","\\succsim",!0),t(h,f,m,"⪸","\\succapprox",!0),t(h,f,m,"⊳","\\vartriangleright"),t(h,f,m,"⊵","\\trianglerighteq"),t(h,f,m,"⊩","\\Vdash",!0),t(h,f,m,"∣","\\shortmid"),t(h,f,m,"∥","\\shortparallel"),t(h,f,m,"≬","\\between",!0),t(h,f,m,"⋔","\\pitchfork",!0),t(h,f,m,"∝","\\varpropto"),t(h,f,m,"◀","\\blacktriangleleft"),t(h,f,m,"∴","\\therefore",!0),t(h,f,m,"∍","\\backepsilon"),t(h,f,m,"▶","\\blacktriangleright"),t(h,f,m,"∵","\\because",!0),t(h,f,m,"⋘","\\llless"),t(h,f,m,"⋙","\\gggtr"),t(h,f,g,"⊲","\\lhd"),t(h,f,g,"⊳","\\rhd"),t(h,f,m,"≂","\\eqsim",!0),t(h,d,m,"⋈","\\Join"),t(h,f,m,"≑","\\Doteq",!0),t(h,f,g,"∔","\\dotplus",!0),t(h,f,g,"∖","\\smallsetminus"),t(h,f,g,"⋒","\\Cap",!0),t(h,f,g,"⋓","\\Cup",!0),t(h,f,g,"⩞","\\doublebarwedge",!0),t(h,f,g,"⊟","\\boxminus",!0),t(h,f,g,"⊞","\\boxplus",!0),t(h,f,g,"⋇","\\divideontimes",!0),t(h,f,g,"⋉","\\ltimes",!0),t(h,f,g,"⋊","\\rtimes",!0),t(h,f,g,"⋋","\\leftthreetimes",!0),t(h,f,g,"⋌","\\rightthreetimes",!0),t(h,f,g,"⋏","\\curlywedge",!0),t(h,f,g,"⋎","\\curlyvee",!0),t(h,f,g,"⊝","\\circleddash",!0),t(h,f,g,"⊛","\\circledast",!0),t(h,f,g,"⋅","\\centerdot"),t(h,f,g,"⊺","\\intercal",!0),t(h,f,g,"⋒","\\doublecap"),t(h,f,g,"⋓","\\doublecup"),t(h,f,g,"⊠","\\boxtimes",!0),t(h,f,m,"⇢","\\dashrightarrow",!0),t(h,f,m,"⇠","\\dashleftarrow",!0),t(h,f,m,"⇇","\\leftleftarrows",!0),t(h,f,m,"⇆","\\leftrightarrows",!0),t(h,f,m,"⇚","\\Lleftarrow",!0),t(h,f,m,"↞","\\twoheadleftarrow",!0),t(h,f,m,"↢","\\leftarrowtail",!0),t(h,f,m,"↫","\\looparrowleft",!0),t(h,f,m,"⇋","\\leftrightharpoons",!0),t(h,f,m,"↶","\\curvearrowleft",!0),t(h,f,m,"↺","\\circlearrowleft",!0),t(h,f,m,"↰","\\Lsh",!0),t(h,f,m,"⇈","\\upuparrows",!0),t(h,f,m,"↿","\\upharpoonleft",!0),t(h,f,m,"⇃","\\downharpoonleft",!0),t(h,d,m,"⊶","\\origof",!0),t(h,d,m,"⊷","\\imageof",!0),t(h,f,m,"⊸","\\multimap",!0),t(h,f,m,"↭","\\leftrightsquigarrow",!0),t(h,f,m,"⇉","\\rightrightarrows",!0),t(h,f,m,"⇄","\\rightleftarrows",!0),t(h,f,m,"↠","\\twoheadrightarrow",!0),t(h,f,m,"↣","\\rightarrowtail",!0),t(h,f,m,"↬","\\looparrowright",!0),t(h,f,m,"↷","\\curvearrowright",!0),t(h,f,m,"↻","\\circlearrowright",!0),t(h,f,m,"↱","\\Rsh",!0),t(h,f,m,"⇊","\\downdownarrows",!0),t(h,f,m,"↾","\\upharpoonright",!0),t(h,f,m,"⇂","\\downharpoonright",!0),t(h,f,m,"⇝","\\rightsquigarrow",!0),t(h,f,m,"⇝","\\leadsto"),t(h,f,m,"⇛","\\Rrightarrow",!0),t(h,f,m,"↾","\\restriction"),t(h,d,p,"‘","`"),t(h,d,p,"$","\\$"),t(u,d,p,"$","\\$"),t(u,d,p,"$","\\textdollar"),t(h,d,p,"%","\\%"),t(u,d,p,"%","\\%"),t(h,d,p,"_","\\_"),t(u,d,p,"_","\\_"),t(u,d,p,"_","\\textunderscore"),t(h,d,p,"∠","\\angle",!0),t(h,d,p,"∞","\\infty",!0),t(h,d,p,"′","\\prime"),t(h,d,p,"△","\\triangle"),t(h,d,p,"Γ","\\Gamma",!0),t(h,d,p,"Δ","\\Delta",!0),t(h,d,p,"Θ","\\Theta",!0),t(h,d,p,"Λ","\\Lambda",!0),t(h,d,p,"Ξ","\\Xi",!0),t(h,d,p,"Π","\\Pi",!0),t(h,d,p,"Σ","\\Sigma",!0),t(h,d,p,"Υ","\\Upsilon",!0),t(h,d,p,"Φ","\\Phi",!0),t(h,d,p,"Ψ","\\Psi",!0),t(h,d,p,"Ω","\\Omega",!0),t(h,d,p,"A","Α"),t(h,d,p,"B","Β"),t(h,d,p,"E","Ε"),t(h,d,p,"Z","Ζ"),t(h,d,p,"H","Η"),t(h,d,p,"I","Ι"),t(h,d,p,"K","Κ"),t(h,d,p,"M","Μ"),t(h,d,p,"N","Ν"),t(h,d,p,"O","Ο"),t(h,d,p,"P","Ρ"),t(h,d,p,"T","Τ"),t(h,d,p,"X","Χ"),t(h,d,p,"¬","\\neg",!0),t(h,d,p,"¬","\\lnot"),t(h,d,p,"⊤","\\top"),t(h,d,p,"⊥","\\bot"),t(h,d,p,"∅","\\emptyset"),t(h,f,p,"∅","\\varnothing"),t(h,d,Ya,"α","\\alpha",!0),t(h,d,Ya,"β","\\beta",!0),t(h,d,Ya,"γ","\\gamma",!0),t(h,d,Ya,"δ","\\delta",!0),t(h,d,Ya,"ϵ","\\epsilon",!0),t(h,d,Ya,"ζ","\\zeta",!0),t(h,d,Ya,"η","\\eta",!0),t(h,d,Ya,"θ","\\theta",!0),t(h,d,Ya,"ι","\\iota",!0),t(h,d,Ya,"κ","\\kappa",!0),t(h,d,Ya,"λ","\\lambda",!0),t(h,d,Ya,"μ","\\mu",!0),t(h,d,Ya,"ν","\\nu",!0),t(h,d,Ya,"ξ","\\xi",!0),t(h,d,Ya,"ο","\\omicron",!0),t(h,d,Ya,"π","\\pi",!0),t(h,d,Ya,"ρ","\\rho",!0),t(h,d,Ya,"σ","\\sigma",!0),t(h,d,Ya,"τ","\\tau",!0),t(h,d,Ya,"υ","\\upsilon",!0),t(h,d,Ya,"ϕ","\\phi",!0),t(h,d,Ya,"χ","\\chi",!0),t(h,d,Ya,"ψ","\\psi",!0),t(h,d,Ya,"ω","\\omega",!0),t(h,d,Ya,"ε","\\varepsilon",!0),t(h,d,Ya,"ϑ","\\vartheta",!0),t(h,d,Ya,"ϖ","\\varpi",!0),t(h,d,Ya,"ϱ","\\varrho",!0),t(h,d,Ya,"ς","\\varsigma",!0),t(h,d,Ya,"φ","\\varphi",!0),t(h,d,g,"∗","*",!0),t(h,d,g,"+","+"),t(h,d,g,"−","-",!0),t(h,d,g,"⋅","\\cdot",!0),t(h,d,g,"∘","\\circ",!0),t(h,d,g,"÷","\\div",!0),t(h,d,g,"±","\\pm",!0),t(h,d,g,"×","\\times",!0),t(h,d,g,"∩","\\cap",!0),t(h,d,g,"∪","\\cup",!0),t(h,d,g,"∖","\\setminus",!0),t(h,d,g,"∧","\\land"),t(h,d,g,"∨","\\lor"),t(h,d,g,"∧","\\wedge",!0),t(h,d,g,"∨","\\vee",!0),t(h,d,p,"√","\\surd"),t(h,d,el,"⟨","\\langle",!0),t(h,d,el,"∣","\\lvert"),t(h,d,el,"∥","\\lVert"),t(h,d,cl,"?","?"),t(h,d,cl,"!","!"),t(h,d,cl,"⟩","\\rangle",!0),t(h,d,cl,"∣","\\rvert"),t(h,d,cl,"∥","\\rVert"),t(h,d,m,"=","="),t(h,d,m,":",":"),t(h,d,m,"≈","\\approx",!0),t(h,d,m,"≅","\\cong",!0),t(h,d,m,"≥","\\ge"),t(h,d,m,"≥","\\geq",!0),t(h,d,m,"←","\\gets"),t(h,d,m,">","\\gt",!0),t(h,d,m,"∈","\\in",!0),t(h,d,m,"","\\@not"),t(h,d,m,"⊂","\\subset",!0),t(h,d,m,"⊃","\\supset",!0),t(h,d,m,"⊆","\\subseteq",!0),t(h,d,m,"⊇","\\supseteq",!0),t(h,f,m,"⊈","\\nsubseteq",!0),t(h,f,m,"⊉","\\nsupseteq",!0),t(h,d,m,"⊨","\\models"),t(h,d,m,"←","\\leftarrow",!0),t(h,d,m,"≤","\\le"),t(h,d,m,"≤","\\leq",!0),t(h,d,m,"<","\\lt",!0),t(h,d,m,"→","\\rightarrow",!0),t(h,d,m,"→","\\to"),t(h,f,m,"≱","\\ngeq",!0),t(h,f,m,"≰","\\nleq",!0),t(h,d,Jo," ","\\ "),t(h,d,Jo," ","\\space"),t(h,d,Jo," ","\\nobreakspace"),t(u,d,Jo," ","\\ "),t(u,d,Jo," "," "),t(u,d,Jo," ","\\space"),t(u,d,Jo," ","\\nobreakspace"),t(h,d,Jo,null,"\\nobreak"),t(h,d,Jo,null,"\\allowbreak"),t(h,d,pl,",",","),t(h,d,pl,";",";"),t(h,f,g,"⊼","\\barwedge",!0),t(h,f,g,"⊻","\\veebar",!0),t(h,d,g,"⊙","\\odot",!0),t(h,d,g,"⊕","\\oplus",!0),t(h,d,g,"⊗","\\otimes",!0),t(h,d,p,"∂","\\partial",!0),t(h,d,g,"⊘","\\oslash",!0),t(h,f,g,"⊚","\\circledcirc",!0),t(h,f,g,"⊡","\\boxdot",!0),t(h,d,g,"△","\\bigtriangleup"),t(h,d,g,"▽","\\bigtriangledown"),t(h,d,g,"†","\\dagger"),t(h,d,g,"⋄","\\diamond"),t(h,d,g,"⋆","\\star"),t(h,d,g,"◃","\\triangleleft"),t(h,d,g,"▹","\\triangleright"),t(h,d,el,"{","\\{"),t(u,d,p,"{","\\{"),t(u,d,p,"{","\\textbraceleft"),t(h,d,cl,"}","\\}"),t(u,d,p,"}","\\}"),t(u,d,p,"}","\\textbraceright"),t(h,d,el,"{","\\lbrace"),t(h,d,cl,"}","\\rbrace"),t(h,d,el,"[","\\lbrack",!0),t(u,d,p,"[","\\lbrack",!0),t(h,d,cl,"]","\\rbrack",!0),t(u,d,p,"]","\\rbrack",!0),t(h,d,el,"(","\\lparen",!0),t(h,d,cl,")","\\rparen",!0),t(u,d,p,"<","\\textless",!0),t(u,d,p,">","\\textgreater",!0),t(h,d,el,"⌊","\\lfloor",!0),t(h,d,cl,"⌋","\\rfloor",!0),t(h,d,el,"⌈","\\lceil",!0),t(h,d,cl,"⌉","\\rceil",!0),t(h,d,p,"\\","\\backslash"),t(h,d,p,"∣","|"),t(h,d,p,"∣","\\vert"),t(u,d,p,"|","\\textbar",!0),t(h,d,p,"∥","\\|"),t(h,d,p,"∥","\\Vert"),t(u,d,p,"∥","\\textbardbl"),t(u,d,p,"~","\\textasciitilde"),t(u,d,p,"\\","\\textbackslash"),t(u,d,p,"^","\\textasciicircum"),t(h,d,m,"↑","\\uparrow",!0),t(h,d,m,"⇑","\\Uparrow",!0),t(h,d,m,"↓","\\downarrow",!0),t(h,d,m,"⇓","\\Downarrow",!0),t(h,d,m,"↕","\\updownarrow",!0),t(h,d,m,"⇕","\\Updownarrow",!0),t(h,d,Pl,"∐","\\coprod"),t(h,d,Pl,"⋁","\\bigvee"),t(h,d,Pl,"⋀","\\bigwedge"),t(h,d,Pl,"⨄","\\biguplus"),t(h,d,Pl,"⋂","\\bigcap"),t(h,d,Pl,"⋃","\\bigcup"),t(h,d,Pl,"∫","\\int"),t(h,d,Pl,"∫","\\intop"),t(h,d,Pl,"∬","\\iint"),t(h,d,Pl,"∭","\\iiint"),t(h,d,Pl,"∏","\\prod"),t(h,d,Pl,"∑","\\sum"),t(h,d,Pl,"⨂","\\bigotimes"),t(h,d,Pl,"⨁","\\bigoplus"),t(h,d,Pl,"⨀","\\bigodot"),t(h,d,Pl,"∮","\\oint"),t(h,d,Pl,"∯","\\oiint"),t(h,d,Pl,"∰","\\oiiint"),t(h,d,Pl,"⨆","\\bigsqcup"),t(h,d,Pl,"∫","\\smallint"),t(u,d,fl,"…","\\textellipsis"),t(h,d,fl,"…","\\mathellipsis"),t(u,d,fl,"…","\\ldots",!0),t(h,d,fl,"…","\\ldots",!0),t(h,d,fl,"⋯","\\@cdots",!0),t(h,d,fl,"⋱","\\ddots",!0),t(h,d,p,"⋮","\\varvdots"),t(u,d,p,"⋮","\\varvdots"),t(h,d,Bl,"ˊ","\\acute"),t(h,d,Bl,"ˋ","\\grave"),t(h,d,Bl,"¨","\\ddot"),t(h,d,Bl,"~","\\tilde"),t(h,d,Bl,"ˉ","\\bar"),t(h,d,Bl,"˘","\\breve"),t(h,d,Bl,"ˇ","\\check"),t(h,d,Bl,"^","\\hat"),t(h,d,Bl,"⃗","\\vec"),t(h,d,Bl,"˙","\\dot"),t(h,d,Bl,"˚","\\mathring"),t(h,d,Ya,"","\\@imath"),t(h,d,Ya,"","\\@jmath"),t(h,d,p,"ı","ı"),t(h,d,p,"ȷ","ȷ"),t(u,d,p,"ı","\\i",!0),t(u,d,p,"ȷ","\\j",!0),t(u,d,p,"ß","\\ss",!0),t(u,d,p,"æ","\\ae",!0),t(u,d,p,"œ","\\oe",!0),t(u,d,p,"ø","\\o",!0),t(u,d,p,"Æ","\\AE",!0),t(u,d,p,"Œ","\\OE",!0),t(u,d,p,"Ø","\\O",!0),t(u,d,Bl,"ˊ","\\'"),t(u,d,Bl,"ˋ","\\`"),t(u,d,Bl,"ˆ","\\^"),t(u,d,Bl,"˜","\\~"),t(u,d,Bl,"ˉ","\\="),t(u,d,Bl,"˘","\\u"),t(u,d,Bl,"˙","\\."),t(u,d,Bl,"¸","\\c"),t(u,d,Bl,"˚","\\r"),t(u,d,Bl,"ˇ","\\v"),t(u,d,Bl,"¨",'\\"'),t(u,d,Bl,"˝","\\H"),t(u,d,Bl,"◯","\\textcircled"),Wa={"--":!0,"---":!0,"``":!0,"''":!0},t(u,d,p,"–","--",!0),t(u,d,p,"–","\\textendash"),t(u,d,p,"—","---",!0),t(u,d,p,"—","\\textemdash"),t(u,d,p,"‘","`",!0),t(u,d,p,"‘","\\textquoteleft"),t(u,d,p,"’","'",!0),t(u,d,p,"’","\\textquoteright"),t(u,d,p,"“","``",!0),t(u,d,p,"“","\\textquotedblleft"),t(u,d,p,"”","''",!0),t(u,d,p,"”","\\textquotedblright"),t(h,d,p,"°","\\degree",!0),t(u,d,p,"°","\\degree"),t(u,d,p,"°","\\textdegree",!0),t(h,d,p,"£","\\pounds"),t(h,d,p,"£","\\mathsterling",!0),t(u,d,p,"£","\\pounds"),t(u,d,p,"£","\\textsterling",!0),t(h,f,p,"✠","\\maltese"),t(u,f,p,"✠","\\maltese"),Ha='0123456789/@."',Xa=0;Xa{if(La(e.classes)!==La(t.classes)||e.skew!==t.skew||e.maxFontSize!==t.maxFontSize)return!1;if(1===e.classes.length){var r=e.classes[0];if("mbin"===r||"mord"===r)return!1}for(var n in e.style)if(e.style.hasOwnProperty(n)&&e.style[n]!==t.style[n])return!1;for(var i in t.style)if(t.style.hasOwnProperty(i)&&e.style[i]!==t.style[i])return!1;return!0},"canCombine"),g=mt(e=>{for(var t=0;tt&&(t=a.height),rnew Da(e,t,r,n),"makeSvgSpan"),el=mt(function(e,t,r){return(e=vs([e],[],t)).height=Math.max(r||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),e.style.borderBottomWidth=K(e.height),e.maxFontSize=1,e},"makeLineSpan"),cl=mt(function(e,t,r,n){return e=new Oa(e,t,r,n),ys(e),e},"makeAnchor"),bs=mt(function(e){return e=new ma(e),ys(e),e},"makeFragment"),m=mt(function(e,t){return e instanceof ma?vs([],[e],t):e},"wrapFragment"),ws=mt(function(e){if("individualShift"===e.positionType){for(var t=e.children,r=[t[0]],n=-t[0].shift-t[0].elem.depth,i=n,a=1;a{var r=vs(["mspace"],[],t),e=Aa(e,t);return r.style.marginRight=K(e),r},"makeGlue"),ks=mt(function(e,t,r){var n="";switch(e){case"amsrm":n="AMS";break;case"textrm":n="Main";break;case"textsf":n="SansSerif";break;case"texttt":n="Typewriter";break;default:n=e}return n+"-"+("textbf"===t&&"textit"===r?"BoldItalic":"textbf"===t?"Bold":"textit"===t?"Italic":"Regular")},"retrieveTextFontName"),Ts={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathsfit:{variant:"sans-serif-italic",fontName:"SansSerif-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},Es={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},Bl=mt(function(e,t){var[e,r,n]=Es[e],e=new za(e),e=new Fa([e],{width:K(r),height:K(n),style:"width:"+K(r),viewBox:"0 0 "+1e3*r+" "+1e3*n,preserveAspectRatio:"xMinYMin"});return(e=xs(["overlay"],[e],t)).height=n,e.style.height=K(n),e.style.width=K(r),e},"staticSvg"),Z={fontMap:Ts,makeSymbol:gs,mathsym:Jo,makeSpan:vs,makeSvgSpan:xs,makeLineSpan:el,makeAnchor:cl,makeFragment:bs,wrapFragment:m,makeVList:Pl,makeOrd:pl,makeGlue:fl,staticSvg:Bl,svgData:Es,tryCombineChars:g},Cs={mord:{mop:f={number:3,unit:"mu"},mbin:Jo={number:4,unit:"mu"},mrel:el={number:5,unit:"mu"},minner:f},mop:{mord:f,mop:f,mrel:el,minner:f},mbin:{mord:Jo,mop:Jo,mopen:Jo,minner:Jo},mrel:{mord:el,mop:el,mopen:el,minner:el},mopen:{},mclose:{mop:f,mbin:Jo,mrel:el,minner:f},mpunct:{mord:f,mop:f,mrel:el,mopen:f,mclose:f,mpunct:f,minner:f},minner:{mord:f,mop:f,mbin:Jo,mrel:el,mopen:f,mpunct:f,minner:f}},_s={mord:{mop:f},mop:{mord:f,mop:f},mbin:{},mrel:{},mopen:{},mclose:{mop:f},mpunct:{},minner:{mop:f}},Ss={},As={},Ls={},mt(o,"defineFunction"),mt(vi,"defineFunctionBuilders"),Ns=mt(function(e){return"ordgroup"===e.type&&1===e.body.length?e.body[0]:e},"normalizeArgument"),Is=mt(function(e){return"ordgroup"===e.type?e.body:[e]},"ordargument"),Rs=Z.makeSpan,Ms=["leftmost","mbin","mopen","mrel","mop","mpunct"],Ds=["rightmost","mrel","mclose","mpunct"],Os={display:ra.DISPLAY,text:ra.TEXT,script:ra.SCRIPT,scriptscript:ra.SCRIPTSCRIPT},Ps={mord:"mord",mop:"mop",mbin:"mbin",mrel:"mrel",mopen:"mopen",mclose:"mclose",mpunct:"mpunct",minner:"minner"},Bs=mt(function(e,t,r,n){void 0===n&&(n=[null,null]);for(var i,a,s=[],o=0;o{var r=t.classes[0],n=e.classes[0];"mbin"===r&&Wi.contains(Ds,n)?t.classes[0]="mord":"mbin"===n&&Wi.contains(Ms,r)&&(e.classes[0]="mord")},{node:a},n,r="root"===r),$s(s,(e,t)=>{var t=Gs(t),r=Gs(e);if(e=t&&r?(e.hasClass("mtight")?_s:Cs)[t][r]:null)return Z.makeGlue(e,i)},{node:a},n,r)),s},"buildExpression"),$s=mt(function e(r,t,n,i,a){i&&r.push(i);for(var s=0;se=>{r.splice(t+1,0,e),s++})(s))}i&&r.pop()},"traverseNonSpaceNodes"),Fs=mt(function(e){return e instanceof ma||e instanceof Oa||e instanceof Da&&e.hasClass("enclosing")?e:null},"checkPartialGroup"),zs=mt(function e(t,r){var n=Fs(t);if(n&&(n=n.children).length){if("right"===r)return e(n[n.length-1],"right");if("left"===r)return e(n[0],"left")}return t},"getOutermostNode"),Gs=mt(function(e,t){return e&&(t&&(e=zs(e,t)),Ps[e.classes[0]])||null},"getTypeOfDomTree"),Us=mt(function(e,t){return e=["nulldelimiter"].concat(e.baseSizingClasses()),Rs(t.concat(e))},"makeNullDelimiter"),qs=mt(function(e,t,r){if(!e)return Rs();var n;if(As[e.type])return n=As[e.type](e,t),r&&t.size!==r.size&&(n=Rs(t.sizingClasses(r),[n],t),t=t.sizeMultiplier/r.sizeMultiplier,n.height*=t,n.depth*=t),n;throw new X("Got group of unknown type: '"+e.type+"'")},"buildGroup"),mt(xi,"buildHTMLUnbreakable"),mt(bi,"buildHTML"),mt(wi,"newDocumentFragment"),js=class{static{mt(this,"MathNode")}constructor(e,t,r){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=t||[],this.classes=r||[]}setAttribute(e,t){this.attributes[e]=t}getAttribute(e){return this.attributes[e]}toNode(){var e,t=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);0";for(var r=0;r"}toText(){return this.children.map(e=>e.toText()).join("")}},Ys=class{static{mt(this,"TextNode")}constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return Wi.escape(this.toText())}toText(){return this.text}},cl=class{static{mt(this,"SpaceNode")}constructor(e){this.width=void 0,this.character=void 0,this.width=e,this.character=.05555<=e&&e<=.05556?" ":.1666<=e&&e<=.1667?" ":.2222<=e&&e<=.2223?" ":.2777<=e&&e<=.2778?" ":-.05556<=e&&e<=-.05555?" ":-.1667<=e&&e<=-.1666?" ":-.2223<=e&&e<=-.2222?" ":-.2778<=e&&e<=-.2777?" ":null}toNode(){var e;return this.character?document.createTextNode(this.character):((e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace")).setAttribute("width",K(this.width)),e)}toMarkup(){return this.character?""+this.character+" ":' '}toText(){return this.character||" "}},E={MathNode:js,TextNode:Ys,SpaceNode:cl,newDocumentFragment:wi},Ws=mt(function(e,t,r){return!ja[t][e]||!ja[t][e].replace||55349===e.charCodeAt(0)||Wa.hasOwnProperty(e)&&r&&(r.fontFamily&&"tt"===r.fontFamily.slice(4,6)||r.font&&"tt"===r.font.slice(4,6))||(e=ja[t][e].replace),new E.TextNode(e)},"makeText"),Hs=mt(function(e){return 1===e.length?e[0]:new E.MathNode("mrow",e)},"makeRow"),Vs=mt(function(e,t){var r;return"texttt"===t.fontFamily?"monospace":"textsf"===t.fontFamily?"textit"===t.fontShape&&"textbf"===t.fontWeight?"sans-serif-bold-italic":"textit"===t.fontShape?"sans-serif-italic":"textbf"===t.fontWeight?"bold-sans-serif":"sans-serif":"textit"===t.fontShape&&"textbf"===t.fontWeight?"bold-italic":"textit"===t.fontShape?"italic":"textbf"===t.fontWeight?"bold":(t=t.font)&&"mathnormal"!==t?(r=e.mode,"mathit"===t?"italic":"boldsymbol"===t?"textord"===e.type?"bold":"bold-italic":"mathbf"===t?"bold":"mathbb"===t?"double-struck":"mathsfit"===t?"sans-serif-italic":"mathfrak"===t?"fraktur":"mathscr"===t||"mathcal"===t?"script":"mathsf"===t?"sans-serif":"mathtt"===t?"monospace":!Wi.contains(["\\imath","\\jmath"],e=e.text)&&gi(e=ja[r][e]&&ja[r][e].replace?ja[r][e].replace:e,Z.fontMap[t].fontName,r)?Z.fontMap[t].variant:null):null},"getVariant"),mt(ki,"isNumberPunctuation"),Xs=mt(function(e,t,r){var n;if(1===e.length)return n=Zs(e[0],t),r&&n instanceof js&&"mo"===n.type&&(n.setAttribute("lspace","0em"),n.setAttribute("rspace","0em")),[n];for(var i,a=[],s=0;s{e&&"supsub"===e.type?(o=(r=Ei(e.base,"accent")).base,e.base=o,n=yi(qs(e,t)),e.base=r):o=(r=Ei(e,"accent")).base;var r,n,i,a,e=qs(o,t.havingCrampedStyle()),s=0,o=(r.isShifty&&Wi.isCharacterBox(o)&&(o=Wi.getBaseElem(o),s=mi(qs(o,t.havingCrampedStyle())).skew),"\\c"===r.label),l=o?e.height+e.depth:Math.min(e.height,t.fontMetrics().xHeight),c=r.isStretchy?(c=ao.svgSpan(r,t),Z.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:e},{type:"elem",elem:c,wrapperClasses:["svg-align"],wrapperStyle:0{var r=e.isStretchy?ao.mathMLnode(e.label):new E.MathNode("mo",[Ws(e.label,e.mode)]);return(e=new E.MathNode("mover",[Zs(e.base,t),r])).setAttribute("accent","true"),e},"mathmlBuilder$9"),oo=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(e=>"\\"+e).join("|")),o({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:mt((e,t)=>{var t=Ns(t[0]),r=!oo.test(e.funcName),n=!r||"\\widehat"===e.funcName||"\\widetilde"===e.funcName||"\\widecheck"===e.funcName;return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:r,isShifty:n,base:t}},"handler"),htmlBuilder:so,mathmlBuilder:fl}),o({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:mt((e,t)=>{var t=t[0],r=e.parser.mode;return"math"===r&&(e.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+e.funcName+" works only in text mode"),r="text"),{type:"accent",mode:r,label:e.funcName,isStretchy:!1,isShifty:!0,base:t}},"handler"),htmlBuilder:so,mathmlBuilder:fl}),o({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:mt((e,t)=>{var{parser:e,funcName:r}=e,t=t[0];return{type:"accentUnder",mode:e.mode,label:r,base:t}},"handler"),htmlBuilder:mt((e,t)=>{var r=qs(e.base,t),n=ao.svgSpan(e,t),e="\\utilde"===e.label?.12:0,n=Z.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:e},{type:"elem",elem:r}]},t);return Z.makeSpan(["mord","accentunder"],[n],t)},"htmlBuilder"),mathmlBuilder:mt((e,t)=>{var r=ao.mathMLnode(e.label);return(e=new E.MathNode("munder",[Zs(e.base,t),r])).setAttribute("accentunder","true"),e},"mathmlBuilder")}),lo=mt(e=>((e=new E.MathNode("mpadded",e?[e]:[])).setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e),"paddedNode"),o({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){var{parser:e,funcName:n}=e;return{type:"xArrow",mode:e.mode,label:n,body:t[0],below:r[0]}},htmlBuilder(e,t){var r,n=t.style,i=t.havingStyle(n.sup()),a=Z.wrapFragment(qs(e.body,i,t),t),s="\\x"===e.label.slice(0,2)?"x":"cd",n=(a.classes.push(s+"-arrow-pad"),e.below&&(i=t.havingStyle(n.sub()),(r=Z.wrapFragment(qs(e.below,i,t),t)).classes.push(s+"-arrow-pad")),ao.svgSpan(e,t)),i=-t.fontMetrics().axisHeight+.5*n.height,s=-t.fontMetrics().axisHeight-.5*n.height-.111;return(.25"atom"!==(e="ordgroup"===e.type&&e.body.length?e.body[0]:e).type||"bin"!==e.family&&"rel"!==e.family?"mord":"m"+e.family,"binrelClass"),o({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(e,t){return{type:"mclass",mode:(e=e.parser).mode,mclass:ho(t[0]),body:Is(t[1]),isCharacterBox:Wi.isCharacterBox(t[1])}}}),o({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(e,t){var{parser:e,funcName:r}=e,n=t[1],t=t[0],i="\\stackrel"!==r?ho(n):"mrel",n={type:"op",mode:n.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:"\\stackrel"!==r,body:Is(n)},n={type:"supsub",mode:t.mode,base:n,sup:"\\underset"===r?null:t,sub:"\\underset"===r?t:null};return{type:"mclass",mode:e.mode,mclass:i,body:[n],isCharacterBox:Wi.isCharacterBox(n)}},htmlBuilder:Si,mathmlBuilder:Ai}),o({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(e,t){return{type:"pmb",mode:(e=e.parser).mode,mclass:ho(t[0]),body:Is(t[0])}},htmlBuilder(e,t){var r=Bs(e.body,t,!0);return(e=Z.makeSpan([e.mclass],r,t)).style.textShadow="0.02em 0.01em 0.04px",e},mathmlBuilder(e,t){return e=Xs(e.body,t),(t=new E.MathNode("mstyle",e)).setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),t}}),uo={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},po=mt(()=>({type:"styling",body:[],mode:"math",style:"display"}),"newCell"),go=mt(e=>"textord"===e.type&&"@"===e.text,"isStartOfArrow"),fo=mt((e,t)=>("mathord"===e.type||"atom"===e.type)&&e.text===t,"isLabelEnd"),mt(Li,"cdArrow"),mt(Ni,"parseCD"),o({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(e,t){var{parser:e,funcName:r}=e;return{type:"cdlabel",mode:e.mode,side:r.slice(4),label:t[0]}},htmlBuilder(e,t){var r=t.havingStyle(t.style.sup());return(r=Z.wrapFragment(qs(e.label,r,t),t)).classes.push("cd-label-"+e.side),r.style.bottom=K(.8-r.depth),r.height=0,r.depth=0,r},mathmlBuilder(e,t){return t=new E.MathNode("mrow",[Zs(e.label,t)]),(t=new E.MathNode("mpadded",[t])).setAttribute("width","0"),"left"===e.side&&t.setAttribute("lspace","-1width"),t.setAttribute("voffset","0.7em"),(t=new E.MathNode("mstyle",[t])).setAttribute("displaystyle","false"),t.setAttribute("scriptlevel","1"),t}}),o({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(e,t){return{type:"cdlabelparent",mode:(e=e.parser).mode,fragment:t[0]}},htmlBuilder(e,t){return(e=Z.wrapFragment(qs(e.fragment,t),t)).classes.push("cd-vert-arrow"),e},mathmlBuilder(e,t){return new E.MathNode("mrow",[Zs(e.fragment,t)])}}),o({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(e,t){for(var e=e.parser,r=Ei(t[0],"ordgroup").body,n="",i=0;i>10),56320+(1023&t))),{type:"textord",mode:e.mode,text:t}}}),Bl=mt((e,t)=>(t=Bs(e.body,t.withColor(e.color),!1),Z.makeFragment(t)),"htmlBuilder$8"),g=mt((e,t)=>(t=Xs(e.body,t.withColor(e.color)),(t=new E.MathNode("mstyle",t)).setAttribute("mathcolor",e.color),t),"mathmlBuilder$7"),o({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(e,t){var e=e.parser,r=Ei(t[0],"color-token").color;return{type:"color",mode:e.mode,color:r,body:Is(t[1])}},htmlBuilder:Bl,mathmlBuilder:g}),o({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(e,t){var{parser:e,breakOnTokenText:r}=e,t=Ei(t[0],"color-token").color,r=(e.gullet.macros.set("\\current@color",t),e.parseExpression(!0,r));return{type:"color",mode:e.mode,color:t,body:r}},htmlBuilder:Bl,mathmlBuilder:g}),o({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(e,t,r){var n="["===(e=e.parser).gullet.future().text?e.parseSizeGroup(!0):null,i=!e.settings.displayMode||!e.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:e.mode,newLine:i,size:n&&Ei(n,"size").value}},htmlBuilder(e,t){var r=Z.makeSpan(["mspace"],[],t);return e.newLine&&(r.classes.push("newline"),e.size)&&(r.style.marginTop=K(Aa(e.size,t))),r},mathmlBuilder(e,t){var r=new E.MathNode("mspace");return e.newLine&&(r.setAttribute("linebreak","newline"),e.size)&&r.setAttribute("height",K(Aa(e.size,t))),r}}),mo={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},yo=mt(e=>{var t=e.text;if(/^(?:[\\{}$^_]|EOF)$/.test(t))throw new X("Expected a control sequence",e);return t},"checkControlSequence"),vo=mt(e=>{var t=e.gullet.popToken();return"="===t.text&&" "===(t=e.gullet.popToken()).text?e.gullet.popToken():t},"getRHS"),xo=mt((e,t,r,n)=>{var i=e.gullet.macros.get(r.text);null==i&&(r.noexpand=!0,i={tokens:[r],numArgs:0,unexpandable:!e.gullet.isExpandable(r.text)}),e.gullet.macros.set(t,i,n)},"letCommand"),o({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(e){var{parser:e,funcName:t}=e,r=(e.consumeSpaces(),e.fetch());if(mo[r.text])return"\\global"!==t&&"\\\\globallong"!==t||(r.text=mo[r.text]),Ei(e.parseFunction(),"internal");throw new X("Invalid token after macro prefix",r)}}),o({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){var{parser:t,funcName:e}=e,r=t.gullet.popToken(),n=r.text;if(/^(?:[\\{}$^_]|EOF)$/.test(n))throw new X("Expected a control sequence",r);for(var i,a=0,s=[[]];"{"!==t.gullet.future().text;)if("#"===(r=t.gullet.popToken()).text){if("{"===t.gullet.future().text){i=t.gullet.future(),s[a].push("{");break}if(r=t.gullet.popToken(),!/^[1-9]$/.test(r.text))throw new X('Invalid argument number "'+r.text+'"');if(parseInt(r.text)!==a+1)throw new X('Argument number "'+r.text+'" out of order');a++,s.push([])}else{if("EOF"===r.text)throw new X("Expected a macro definition");s[a].push(r.text)}var o=t.gullet.consumeArg().tokens;return i&&o.unshift(i),"\\edef"!==e&&"\\xdef"!==e||(o=t.gullet.expandTokens(o)).reverse(),t.gullet.macros.set(n,{tokens:o,numArgs:a,delimiters:s},e===mo[e]),{type:"internal",mode:t.mode}}}),o({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){var{parser:e,funcName:t}=e,r=yo(e.gullet.popToken()),n=(e.gullet.consumeSpaces(),vo(e));return xo(e,r,n,"\\\\globallet"===t),{type:"internal",mode:e.mode}}}),o({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){var{parser:e,funcName:t}=e,r=yo(e.gullet.popToken()),n=e.gullet.popToken(),i=e.gullet.popToken();return xo(e,r,i,"\\\\globalfuture"===t),e.gullet.pushToken(i),e.gullet.pushToken(n),{type:"internal",mode:e.mode}}}),bo=mt(function(e,t,r){if(r=gi(ja.math[e]&&ja.math[e].replace||e,t,r))return r;throw new Error("Unsupported symbol "+e+" and font size "+t+".")},"getMetrics"),wo=mt(function(e,t,r,n){return t=r.havingBaseStyle(t),n=Z.makeSpan(n.concat(t.sizingClasses(r)),[e],r),e=t.sizeMultiplier/r.sizeMultiplier,n.height*=e,n.depth*=e,n.maxFontSize=t.sizeMultiplier,n},"styleWrap"),ko=mt(function(e,t,r){r=t.havingBaseStyle(r),r=(1-t.sizeMultiplier/r.sizeMultiplier)*t.fontMetrics().axisHeight,e.classes.push("delimcenter"),e.style.top=K(r),e.height-=r,e.depth+=r},"centerSpan"),To=mt(function(e,t,r,n,i,a){return e=Z.makeSymbol(e,"Main-Regular",i,n),i=wo(e,t,n,a),r&&ko(i,n,t),i},"makeSmallDelim"),Eo=mt(function(e,t,r,n){return Z.makeSymbol(e,"Size"+t+"-Regular",r,n)},"mathrmSize"),Co=mt(function(e,t,r,n,i,a){return e=Eo(e,t,i,n),i=wo(Z.makeSpan(["delimsizing","size"+t],[e],n),ra.TEXT,n,a),r&&ko(i,n,ra.TEXT),i},"makeLargeDelim"),_o=mt(function(e,t,r){return{type:"elem",elem:Z.makeSpan(["delimsizinginner","Size1-Regular"===t?"delim-size1":"delim-size4"],[Z.makeSpan([],[Z.makeSymbol(e,t,r)])])}},"makeGlyphSpan"),So=mt(function(e,t,r){var n=(ya["Size4-Regular"][e.charCodeAt(0)]?ya["Size4-Regular"]:ya["Size1-Regular"])[e.charCodeAt(0)][4],e=new za("inner",pa(e,Math.round(1e3*t))),e=new Fa([e],{width:K(n),height:K(t),style:"width:"+K(n),viewBox:"0 0 "+1e3*n+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"});return(e=Z.makeSvgSpan([],[e],r)).height=t,e.style.height=K(t),e.style.width=K(n),{type:"elem",elem:e}},"makeInner"),Ao={type:"kern",size:-.008},Lo=["|","\\lvert","\\rvert","\\vert"],No=["\\|","\\lVert","\\rVert","\\Vert"],Io=mt(function(e,t,r,n,i,a){var s,o,l,c="",h=0,u=s=o=e,d=null,p="Size1-Regular",e=("\\uparrow"===e?s=o="⏐":"\\Uparrow"===e?s=o="‖":"\\downarrow"===e?u=s="⏐":"\\Downarrow"===e?u=s="‖":"\\updownarrow"===e?(u="\\uparrow",s="⏐",o="\\downarrow"):"\\Updownarrow"===e?(u="\\Uparrow",s="‖",o="\\Downarrow"):Wi.contains(Lo,e)?(s="∣",c="vert",h=333):Wi.contains(No,e)?(s="∥",c="doublevert",h=556):"["===e||"\\lbrack"===e?(u="⎡",s="⎢",o="⎣",p="Size4-Regular",c="lbrack",h=667):"]"===e||"\\rbrack"===e?(u="⎤",s="⎥",o="⎦",p="Size4-Regular",c="rbrack",h=667):"\\lfloor"===e||"⌊"===e?(s=u="⎢",o="⎣",p="Size4-Regular",c="lfloor",h=667):"\\lceil"===e||"⌈"===e?(u="⎡",s=o="⎢",p="Size4-Regular",c="lceil",h=667):"\\rfloor"===e||"⌋"===e?(s=u="⎥",o="⎦",p="Size4-Regular",c="rfloor",h=667):"\\rceil"===e||"⌉"===e?(u="⎤",s=o="⎥",p="Size4-Regular",c="rceil",h=667):"("===e||"\\lparen"===e?(u="⎛",s="⎜",o="⎝",p="Size4-Regular",c="lparen",h=875):")"===e||"\\rparen"===e?(u="⎞",s="⎟",o="⎠",p="Size4-Regular",c="rparen",h=875):"\\{"===e||"\\lbrace"===e?(u="⎧",d="⎨",o="⎩",s="⎪",p="Size4-Regular"):"\\}"===e||"\\rbrace"===e?(u="⎫",d="⎬",o="⎭",s="⎪",p="Size4-Regular"):"\\lgroup"===e||"⟮"===e?(u="⎧",o="⎩",s="⎪",p="Size4-Regular"):"\\rgroup"===e||"⟯"===e?(u="⎫",o="⎭",s="⎪",p="Size4-Regular"):"\\lmoustache"===e||"⎰"===e?(u="⎧",o="⎭",s="⎪",p="Size4-Regular"):"\\rmoustache"!==e&&"⎱"!==e||(u="⎫",o="⎩",s="⎪",p="Size4-Regular"),(e=bo(u,p,i)).height+e.depth),g=(g=bo(s,p,i)).height+g.depth,f=(f=bo(o,p,i)).height+f.depth,m=0,y=1,t=(null!==d&&(m=(v=bo(d,p,i)).height+v.depth,y=2),(v=e+f+m)+Math.max(0,Math.ceil((t-v)/(y*g)))*y*g),v=n.fontMetrics().axisHeight,y=(r&&(v*=n.sizeMultiplier),t/2-v),g=[],v=(0","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],Po=[0,1.2,1.8,2.4,3],el=mt(function(e,t,r,n,i){if("<"===e||"\\lt"===e||"⟨"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"⟩"!==e||(e="\\rangle"),Wi.contains(Mo,e)||Wi.contains(Oo,e))return Co(e,t,!1,r,n,i);if(Wi.contains(Do,e))return Io(e,Po[t],!1,r,n,i);throw new X("Illegal delimiter: '"+e+"'")},"makeSizedDelim"),Bo=[{type:"small",style:ra.SCRIPTSCRIPT},{type:"small",style:ra.SCRIPT},{type:"small",style:ra.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],$o=[{type:"small",style:ra.SCRIPTSCRIPT},{type:"small",style:ra.SCRIPT},{type:"small",style:ra.TEXT},{type:"stack"}],Fo=[{type:"small",style:ra.SCRIPTSCRIPT},{type:"small",style:ra.SCRIPT},{type:"small",style:ra.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],zo=mt(function(e){if("small"===e.type)return"Main-Regular";if("large"===e.type)return"Size"+e.size+"-Regular";if("stack"===e.type)return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},"delimTypeToFont"),Go=mt(function(e,t,r,n){for(var i=Math.min(2,3-n.style.size);i"!==e&&"\\gt"!==e&&"⟩"!==e||(e="\\rangle");var s=Wi.contains(Oo,e)?Bo:Wi.contains(Mo,e)?Fo:$o;return"small"===(s=Go(e,t,s,n)).type?To(e,s.style,r,n,i,a):"large"===s.type?Co(e,s.size,r,n,i,a):Io(e,t,r,n,i,a)},"makeCustomSizedDelim"),f=mt(function(e,t,r,n,i,a){var s=n.fontMetrics().axisHeight*n.sizeMultiplier,o=5/n.fontMetrics().ptPerEm,t=Math.max(t-s,r+s),r=Math.max(t/500*901,2*t-o);return Uo(e,r,!0,n,i,a)},"makeLeftRightDelim"),qo={sqrtImage:Jo,sizedDelim:el,sizeToMaxHeight:Po,customSizedDelim:Uo,leftRightDelim:f},jo={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},Yo=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","⌊","⌋","\\lceil","\\rceil","⌈","⌉","<",">","\\langle","⟨","\\rangle","⟩","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","⟮","⟯","\\lmoustache","\\rmoustache","⎰","⎱","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."],mt(Ii,"checkDelimiter"),o({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:mt((e,t)=>(t=Ii(t[0],e),{type:"delimsizing",mode:e.parser.mode,size:jo[e.funcName].size,mclass:jo[e.funcName].mclass,delim:t.text}),"handler"),htmlBuilder:mt((e,t)=>"."===e.delim?Z.makeSpan([e.mclass]):qo.sizedDelim(e.delim,e.size,t,e.mode,[e.mclass]),"htmlBuilder"),mathmlBuilder:mt(e=>{var t=[],t=("."!==e.delim&&t.push(Ws(e.delim,e.mode)),new E.MathNode("mo",t)),e=("mopen"===e.mclass||"mclose"===e.mclass?t.setAttribute("fence","true"):t.setAttribute("fence","false"),t.setAttribute("stretchy","true"),K(qo.sizeToMaxHeight[e.size]));return t.setAttribute("minsize",e),t.setAttribute("maxsize",e),t},"mathmlBuilder")}),mt(Ri,"assertParsed"),o({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:mt((e,t)=>{var r=e.parser.gullet.macros.get("\\current@color");if(r&&"string"!=typeof r)throw new X("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:e.parser.mode,delim:Ii(t[0],e).text,color:r}},"handler")}),o({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:mt((e,t)=>{var t=Ii(t[0],e),r=(++(e=e.parser).leftrightDepth,e.parseExpression(!1)),n=(--e.leftrightDepth,e.expect("\\right",!1),Ei(e.parseFunction(),"leftright-right"));return{type:"leftright",mode:e.mode,body:r,left:t.text,right:n.delim,rightColor:n.color}},"handler"),htmlBuilder:mt((e,t)=>{Ri(e);for(var r,n=Bs(e.body,t,!0,["mopen","mclose"]),i=0,a=0,s=!1,o=0;o{Ri(e);var r,t=Xs(e.body,t);return"."!==e.left&&((r=new E.MathNode("mo",[Ws(e.left,e.mode)])).setAttribute("fence","true"),t.unshift(r)),"."!==e.right&&((r=new E.MathNode("mo",[Ws(e.right,e.mode)])).setAttribute("fence","true"),e.rightColor&&r.setAttribute("mathcolor",e.rightColor),t.push(r)),Hs(t)},"mathmlBuilder")}),o({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:mt((e,t)=>{if(t=Ii(t[0],e),e.parser.leftrightDepth)return{type:"middle",mode:e.parser.mode,delim:t.text};throw new X("\\middle without preceding \\left",t)},"handler"),htmlBuilder:mt((e,t)=>{var r;return"."===e.delim?r=Us(t,[]):(r=qo.sizedDelim(e.delim,1,t,e.mode,[]),e={delim:e.delim,options:t},r.isMiddle=e),r},"htmlBuilder"),mathmlBuilder:mt((e,t)=>(e="\\vert"===e.delim||"|"===e.delim?Ws("|","text"):Ws(e.delim,e.mode),(e=new E.MathNode("mo",[e])).setAttribute("fence","true"),e.setAttribute("lspace","0.05em"),e.setAttribute("rspace","0.05em"),e),"mathmlBuilder")}),cl=mt((e,t)=>{var r,n,i,a,s,o=Z.wrapFragment(qs(e.body,t),t),l=e.label.slice(1),c=t.sizeMultiplier,h=0,u=Wi.isCharacterBox(e.body);return"sout"===l?((r=Z.makeSpan(["stretchy","sout"])).height=t.fontMetrics().defaultRuleThickness/c,h=-.5*t.fontMetrics().xHeight):"phase"===l?(a=Aa({number:.6,unit:"pt"},t),s=Aa({number:.35,unit:"ex"},t),c/=t.havingBaseSizing().sizeMultiplier,n=o.height+o.depth+a+s,o.style.paddingLeft=K(n/2+a),c=Math.floor(1e3*n*c),i=ha(c),i=new Fa([new za("phase",i)],{width:"400em",height:K(c/1e3),viewBox:"0 0 400000 "+c,preserveAspectRatio:"xMinYMin slice"}),(r=Z.makeSvgSpan(["hide-tail"],[i],t)).style.height=K(n),h=o.depth+a+s):(/cancel/.test(l)?u||o.classes.push("cancel-pad"):"angl"===l?o.classes.push("anglpad"):o.classes.push("boxpad"),n=i=c=0,i=/box/.test(l)?(n=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness),c=t.fontMetrics().fboxsep+("colorbox"===l?0:n)):"angl"===l?(c=4*(n=Math.max(t.fontMetrics().defaultRuleThickness,t.minRuleThickness)),Math.max(0,.25-o.depth)):c=u?.2:0,r=ao.encloseSpan(o,l,c,i,t),/fbox|boxed|fcolorbox/.test(l)?(r.style.borderStyle="solid",r.style.borderWidth=K(n)):"angl"===l&&.049!==n&&(r.style.borderTopWidth=K(n),r.style.borderRightWidth=K(n)),h=o.depth+i,e.backgroundColor&&(r.style.backgroundColor=e.backgroundColor,e.borderColor)&&(r.style.borderColor=e.borderColor)),s=e.backgroundColor?Z.makeVList({positionType:"individualShift",children:[{type:"elem",elem:r,shift:h},{type:"elem",elem:o,shift:0}]},t):(a=/cancel|phase/.test(l)?["svg-align"]:[],Z.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:0},{type:"elem",elem:r,shift:h,wrapperClasses:a}]},t)),/cancel/.test(l)&&(s.height=o.height,s.depth=o.depth),/cancel/.test(l)&&!u?Z.makeSpan(["mord","cancel-lap"],[s],t):Z.makeSpan(["mord"],[s],t)},"htmlBuilder$7"),pl=mt((e,t)=>{var r=new E.MathNode(-1{if(!e.parser.settings.displayMode)throw new X("{"+e.envName+"} can be used only in display mode.")},"validateAmsEnvironmentContext"),mt(Oi,"getAutoTag"),mt(Pi,"parseArray"),mt(Bi,"dCellStyle"),m=mt(function(e,t){var r=e.body.length,P=e.hLinesBeforeRow,n=0,i=new Array(r),a=[],s=Math.max(t.fontMetrics().arrayRuleWidth,t.minRuleThickness),o=1/t.fontMetrics().ptPerEm,l=5*o,c=(e.colSeparationType&&"small"===e.colSeparationType&&(l=t.havingStyle(ra.SCRIPT).sizeMultiplier/t.sizeMultiplier*.2778),"CD"===e.colSeparationType?Aa({number:3,unit:"ex"},t):12*o),B=3*o,$=.7*(o=e.arraystretch*c),F=.3*o,h=0;function u(e){for(var t=0;te))for(M=0;Me.length)),i.cols=new Array(n).fill({type:"align",align:r}),t?{type:"leftright",mode:e.mode,body:[i],left:t[0],right:t[1],rightColor:void 0}:i},htmlBuilder:m,mathmlBuilder:Pl}),Mi({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(e){return(e=Pi(e.parser,{arraystretch:.5},"script")).colSeparationType="small",e},htmlBuilder:m,mathmlBuilder:Pl}),Mi({type:"array",names:["subarray"],props:{numArgs:1},handler(e,t){if(1<(t=(_i(t[0])?[t[0]]:Ei(t[0],"ordgroup").body).map(function(e){var t=Ci(e).text;if(-1!=="lc".indexOf(t))return{type:"align",align:t};throw new X("Unknown column alignment: "+t,e)})).length)throw new X("{subarray} can contain only one column");if(0<(e=Pi(e.parser,{cols:t,hskipBeforeAndAfter:!1,arraystretch:.5},"script")).body.length&&1{var r=e.font,t=t.withFont(r);return qs(e.body,t)},"htmlBuilder$5"),g=mt((e,t)=>{var r=e.font,t=t.withFont(r);return Zs(e.body,t)},"mathmlBuilder$4"),Zo={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"},o({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathsfit","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:mt((e,t)=>{var{parser:e,funcName:r}=e,t=Ns(t[0]);return{type:"font",mode:e.mode,font:(r=r in Zo?Zo[r]:r).slice(1),body:t}},"handler"),htmlBuilder:Bl,mathmlBuilder:g}),o({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:mt((e,t)=>{var e=e.parser,t=t[0],r=Wi.isCharacterBox(t);return{type:"mclass",mode:e.mode,mclass:ho(t),body:[{type:"font",mode:e.mode,font:"boldsymbol",body:t}],isCharacterBox:r}},"handler")}),o({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:mt((e,t)=>{var{parser:e,funcName:r,breakOnTokenText:n}=e,i=e.mode,n=e.parseExpression(!0,n);return{type:"font",mode:i,font:"math"+r.slice(1),body:{type:"ordgroup",mode:e.mode,body:n}}},"handler"),htmlBuilder:Bl,mathmlBuilder:g}),Qo=mt((e,t)=>("display"===e?t=t.id>=ra.SCRIPT.id?t.text():ra.DISPLAY:"text"===e&&t.size===ra.DISPLAY.size?t=ra.TEXT:"script"===e?t=ra.SCRIPT:"scriptscript"===e&&(t=ra.SCRIPTSCRIPT),t),"adjustStyle"),Jo=mt((e,t)=>{var r,n,i,a,s=Qo(e.size,t.style),o=s.fracNum(),l=s.fracDen(),o=t.havingStyle(o),c=qs(e.numer,o,t),h=(e.continued&&(h=8.5/t.fontMetrics().ptPerEm,u=3.5/t.fontMetrics().ptPerEm,c.height=c.height{var r=new E.MathNode("mfrac",[Zs(e.numer,t),Zs(e.denom,t)]),n=(e.hasBarLine?e.barSize&&(n=Aa(e.barSize,t),r.setAttribute("linethickness",K(n))):r.setAttribute("linethickness","0px"),Qo(e.size,t.style));return n.size!==t.style.size&&(r=new E.MathNode("mstyle",[r]),t=n.size===ra.DISPLAY.size?"true":"false",r.setAttribute("displaystyle",t),r.setAttribute("scriptlevel","0")),null!=e.leftDelim||null!=e.rightDelim?(n=[],null!=e.leftDelim&&((t=new E.MathNode("mo",[new E.TextNode(e.leftDelim.replace("\\",""))])).setAttribute("fence","true"),n.push(t)),n.push(r),null!=e.rightDelim&&((t=new E.MathNode("mo",[new E.TextNode(e.rightDelim.replace("\\",""))])).setAttribute("fence","true"),n.push(t)),Hs(n)):r},"mathmlBuilder$3"),o({type:"genfrac",names:["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:mt((e,t)=>{var r,{parser:e,funcName:n}=e,i=t[0],t=t[1],a=null,s=null,o="auto";switch(n){case"\\dfrac":case"\\frac":case"\\tfrac":r=!0;break;case"\\\\atopfrac":r=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":r=!1,a="(",s=")";break;case"\\\\bracefrac":r=!1,a="\\{",s="\\}";break;case"\\\\brackfrac":r=!1,a="[",s="]";break;default:throw new Error("Unrecognized genfrac command")}switch(n){case"\\dfrac":case"\\dbinom":o="display";break;case"\\tfrac":case"\\tbinom":o="text"}return{type:"genfrac",mode:e.mode,continued:!1,numer:i,denom:t,hasBarLine:r,leftDelim:a,rightDelim:s,size:o,barSize:null}},"handler"),htmlBuilder:Jo,mathmlBuilder:el}),o({type:"genfrac",names:["\\cfrac"],props:{numArgs:2},handler:mt((e,t)=>{var e=e.parser,r=t[0];return{type:"genfrac",mode:e.mode,continued:!0,numer:r,denom:t[1],hasBarLine:!0,leftDelim:null,rightDelim:null,size:"display",barSize:null}},"handler")}),o({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(e){var t,{parser:e,funcName:r,token:n}=e;switch(r){case"\\over":t="\\frac";break;case"\\choose":t="\\binom";break;case"\\atop":t="\\\\atopfrac";break;case"\\brace":t="\\\\bracefrac";break;case"\\brack":t="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:e.mode,replaceWith:t,token:n}}}),tl=["display","text","script","scriptscript"],rl=mt(function(e){var t=null;return 0{var e=e.parser,r=t[0],n=Yi(Ei(t[1],"infix").size),t=t[2],i=0{var r,n,i=t.style,i="supsub"===e.type?(r=e.sup?qs(e.sup,t.havingStyle(i.sup()),t):qs(e.sub,t.havingStyle(i.sub()),t),Ei(e.base,"horizBrace")):Ei(e,"horizBrace"),e=qs(i.base,t.havingBaseStyle(ra.DISPLAY)),a=ao.svgSpan(i,t);return(i.isOver?(n=Z.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:e},{type:"kern",size:.1},{type:"elem",elem:a}]},t)).children[0].children[0].children[1]:(n=Z.makeVList({positionType:"bottom",positionData:e.depth+.1+a.height,children:[{type:"elem",elem:a},{type:"kern",size:.1},{type:"elem",elem:e}]},t)).children[0].children[0].children[0]).classes.push("svg-align"),r&&(a=Z.makeSpan(["mord",i.isOver?"mover":"munder"],[n],t),n=i.isOver?Z.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"kern",size:.2},{type:"elem",elem:r}]},t):Z.makeVList({positionType:"bottom",positionData:a.depth+.2+r.height+r.depth,children:[{type:"elem",elem:r},{type:"kern",size:.2},{type:"elem",elem:a}]},t)),Z.makeSpan(["mord",i.isOver?"mover":"munder"],[n],t)},"htmlBuilder$3"),f=mt((e,t)=>{var r=ao.mathMLnode(e.label);return new E.MathNode(e.isOver?"mover":"munder",[Zs(e.base,t),r])},"mathmlBuilder$2"),o({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(e,t){var{parser:e,funcName:r}=e;return{type:"horizBrace",mode:e.mode,label:r,isOver:/^\\over/.test(r),base:t[0]}},htmlBuilder:nl,mathmlBuilder:f}),o({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:mt((e,t)=>{var e=e.parser,r=t[1],t=Ei(t[0],"url").url;return e.settings.isTrusted({command:"\\href",url:t})?{type:"href",mode:e.mode,href:t,body:Is(r)}:e.formatUnsupportedCmd("\\href")},"handler"),htmlBuilder:mt((e,t)=>{var r=Bs(e.body,t,!1);return Z.makeAnchor(e.href,[],r,t)},"htmlBuilder"),mathmlBuilder:mt((e,t)=>((t=(t=Ks(e.body,t))instanceof js?t:new js("mrow",[t])).setAttribute("href",e.href),t),"mathmlBuilder")}),o({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:mt((e,t)=>{var e=e.parser,r=Ei(t[0],"url").url;if(!e.settings.isTrusted({command:"\\url",url:r}))return e.formatUnsupportedCmd("\\url");for(var n=[],i=0;i{var{parser:e,funcName:r}=e,n=Ei(t[0],"raw").string,t=t[1];e.settings.strict&&e.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var i,a={};switch(r){case"\\htmlClass":i={command:"\\htmlClass",class:a.class=n};break;case"\\htmlId":i={command:"\\htmlId",id:a.id=n};break;case"\\htmlStyle":i={command:"\\htmlStyle",style:a.style=n};break;case"\\htmlData":for(var s=n.split(","),o=0;o{var r,n=Bs(e.body,t,!1),i=["enclosing"],a=(e.attributes.class&&i.push(...e.attributes.class.trim().split(/\s+/)),Z.makeSpan(i,n,t));for(r in e.attributes)"class"!==r&&e.attributes.hasOwnProperty(r)&&a.setAttribute(r,e.attributes[r]);return a},"htmlBuilder"),mathmlBuilder:mt((e,t)=>Ks(e.body,t),"mathmlBuilder")}),o({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:mt((e,t)=>({type:"htmlmathml",mode:(e=e.parser).mode,html:Is(t[0]),mathml:Is(t[1])}),"handler"),htmlBuilder:mt((e,t)=>(e=Bs(e.html,t,!1),Z.makeFragment(e)),"htmlBuilder"),mathmlBuilder:mt((e,t)=>Ks(e.mathml,t),"mathmlBuilder")}),il=mt(function(e){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(e))return{number:+e,unit:"bp"};var t=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e);if(!t)throw new X("Invalid size: '"+e+"' in \\includegraphics");if(e={number:+(t[1]+t[2]),unit:t[3]},Sa(e))return e;throw new X("Invalid unit: '"+e.unit+"' in \\includegraphics.")},"sizeData"),o({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:mt((e,t,r)=>{var e=e.parser,n={number:0,unit:"em"},i={number:.9,unit:"em"},a={number:0,unit:"em"},s="";if(r[0])for(var o=Ei(r[0],"raw").string.split(","),l=0;l{var r=Aa(e.height,t),n=0,i=(0{var r=new E.MathNode("mglyph",[]),n=(r.setAttribute("alt",e.alt),Aa(e.height,t)),i=0;return 0{var{parser:e,funcName:r}=e,t=t[0];return{type:"lap",mode:e.mode,alignment:r.slice(5),body:t}},"handler"),htmlBuilder:mt((e,t)=>{var r="clap"===e.alignment?(r=Z.makeSpan([],[qs(e.body,t)]),Z.makeSpan(["inner"],[r],t)):Z.makeSpan(["inner"],[qs(e.body,t)]),n=Z.makeSpan(["fix"],[]),e=Z.makeSpan([e.alignment],[r,n],t);return(r=Z.makeSpan(["strut"])).style.height=K(e.height+e.depth),e.depth&&(r.style.verticalAlign=K(-e.depth)),e.children.unshift(r),e=Z.makeSpan(["thinbox"],[e],t),Z.makeSpan(["mord","vbox"],[e],t)},"htmlBuilder"),mathmlBuilder:mt((e,t)=>(t=new E.MathNode("mpadded",[Zs(e.body,t)]),"rlap"!==e.alignment&&(e="llap"===e.alignment?"-1":"-0.5",t.setAttribute("lspace",e+"width")),t.setAttribute("width","0px"),t),"mathmlBuilder")}),o({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){var{funcName:e,parser:r}=e,n=r.mode,e=(r.switchMode("math"),"\\("===e?"\\)":"$"),i=r.parseExpression(!1,e);return r.expect(e),r.switchMode(n),{type:"styling",mode:r.mode,style:"text",body:i}}}),o({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){throw new X("Mismatched "+e.funcName)}}),al=mt((e,t)=>{switch(t.style.size){case ra.DISPLAY.size:return e.display;case ra.TEXT.size:return e.text;case ra.SCRIPT.size:return e.script;case ra.SCRIPTSCRIPT.size:return e.scriptscript;default:return e.text}},"chooseMathStyle"),o({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:mt((e,t)=>({type:"mathchoice",mode:(e=e.parser).mode,display:Is(t[0]),text:Is(t[1]),script:Is(t[2]),scriptscript:Is(t[3])}),"handler"),htmlBuilder:mt((e,t)=>(e=al(e,t),e=Bs(e,t,!1),Z.makeFragment(e)),"htmlBuilder"),mathmlBuilder:mt((e,t)=>(e=al(e,t),Ks(e,t)),"mathmlBuilder")}),sl=mt((e,t,r,n,i,a,s)=>{e=Z.makeSpan([],[e]);var o,l,c=r&&Wi.isCharacterBox(r);if(t&&(o={elem:t=qs(t,n.havingStyle(i.sup()),n),kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-t.depth)}),r&&(l={elem:t=qs(r,n.havingStyle(i.sub()),n),kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-t.height)}),o&&l)var r=n.fontMetrics().bigOpSpacing5+l.elem.height+l.elem.depth+l.kern+e.depth+s,h=Z.makeVList({positionType:"bottom",positionData:r,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:l.elem,marginLeft:K(-a)},{type:"kern",size:l.kern},{type:"elem",elem:e},{type:"kern",size:o.kern},{type:"elem",elem:o.elem,marginLeft:K(a)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n);else if(l)i=e.height-s,h=Z.makeVList({positionType:"top",positionData:i,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:l.elem,marginLeft:K(-a)},{type:"kern",size:l.kern},{type:"elem",elem:e}]},n);else{if(!o)return e;t=e.depth+s,h=Z.makeVList({positionType:"bottom",positionData:t,children:[{type:"elem",elem:e},{type:"kern",size:o.kern},{type:"elem",elem:o.elem,marginLeft:K(a)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}return r=[h],l&&0!==a&&!c&&((i=Z.makeSpan(["mspace"],[],n)).style.marginRight=K(a),r.unshift(i)),Z.makeSpan(["mop","op-limits"],r,n)},"assembleSupSub"),ol=["\\smallint"],ll=mt((e,t)=>{var r,n,i,a=!1,s=("supsub"===e.type?(r=e.sup,n=e.sub,i=Ei(e.base,"op"),a=!0):i=Ei(e,"op"),!1);if((e=t.style).size===ra.DISPLAY.size&&i.symbol&&!Wi.contains(ol,i.name)&&(s=!0),i.symbol){var o,l=s?"Size2-Regular":"Size1-Regular",c="";"\\oiint"!==i.name&&"\\oiiint"!==i.name||(c=i.name.slice(1),i.name="oiint"===c?"\\iint":"\\iiint"),l=Z.makeSymbol(i.name,l,"math",t,["mop","op-symbol",s?"large-op":"small-op"]),0{var r;return e.symbol?(r=new js("mo",[Ws(e.name,e.mode)]),Wi.contains(ol,e.name)&&r.setAttribute("largeop","false")):r=e.body?new js("mo",Xs(e.body,t)):(r=new js("mi",[new Ys(e.name.slice(1))]),t=new js("mo",[Ws("","text")]),e.parentIsSupSub?new js("mrow",[r,t]):wi([r,t])),r},"mathmlBuilder$1"),hl={"∏":"\\prod","∐":"\\coprod","∑":"\\sum","⋀":"\\bigwedge","⋁":"\\bigvee","⋂":"\\bigcap","⋃":"\\bigcup","⨀":"\\bigodot","⨁":"\\bigoplus","⨂":"\\bigotimes","⨄":"\\biguplus","⨆":"\\bigsqcup"},o({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","∏","∐","∑","⋀","⋁","⋂","⋃","⨀","⨁","⨂","⨄","⨆"],props:{numArgs:0},handler:mt((e,t)=>{var{parser:e,funcName:r}=e;return 1===r.length&&(r=hl[r]),{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:r}},"handler"),htmlBuilder:ll,mathmlBuilder:cl}),o({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:mt((e,t)=>(e=e.parser,t=t[0],{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:Is(t)}),"handler"),htmlBuilder:ll,mathmlBuilder:cl}),ul={"∫":"\\int","∬":"\\iint","∭":"\\iiint","∮":"\\oint","∯":"\\oiint","∰":"\\oiiint"},o({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(e){var{parser:e,funcName:t}=e;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:t}},htmlBuilder:ll,mathmlBuilder:cl}),o({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(e){var{parser:e,funcName:t}=e;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:t}},htmlBuilder:ll,mathmlBuilder:cl}),o({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","∫","∬","∭","∮","∯","∰"],props:{numArgs:0},handler(e){var{parser:e,funcName:t}=e;return 1===t.length&&(t=ul[t]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:t}},htmlBuilder:ll,mathmlBuilder:cl}),dl=mt((e,t)=>{var r,n,i,a,s=!1;if("supsub"===e.type?(r=e.sup,n=e.sub,i=Ei(e.base,"operatorname"),s=!0):i=Ei(e,"operatorname"),0{var t=e.text;return"string"==typeof t?{type:"textord",mode:e.mode,text:t}:e}),o=Bs(e,t.withFont("mathrm"),!0),l=0;l{for(var r=Xs(e.body,t.withFont("mathrm")),n=!0,i=0;ie.toText()).join(""),r=[new E.TextNode(t)]),(t=new E.MathNode("mi",r)).setAttribute("mathvariant","normal");var o=new E.MathNode("mo",[Ws("","text")]);return e.parentIsSupSub?new E.MathNode("mrow",[t,o]):E.newDocumentFragment([t,o])},"mathmlBuilder"),o({type:"operatorname",names:["\\operatorname@","\\operatornamewithlimits"],props:{numArgs:1},handler:mt((e,t)=>{var{parser:e,funcName:r}=e,t=t[0];return{type:"operatorname",mode:e.mode,body:Is(t),alwaysHandleSupSub:"\\operatornamewithlimits"===r,limits:!1,parentIsSupSub:!1}},"handler"),htmlBuilder:dl,mathmlBuilder:pl}),l("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@"),vi({type:"ordgroup",htmlBuilder(e,t){return e.semisimple?Z.makeFragment(Bs(e.body,t,!1)):Z.makeSpan(["mord"],Bs(e.body,t,!0),t)},mathmlBuilder(e,t){return Ks(e.body,t,!0)}}),o({type:"overline",names:["\\overline"],props:{numArgs:1},handler(e,t){return e=e.parser,t=t[0],{type:"overline",mode:e.mode,body:t}},htmlBuilder(e,t){var e=qs(e.body,t.havingCrampedStyle()),r=Z.makeLineSpan("overline-line",t),n=t.fontMetrics().defaultRuleThickness,e=Z.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:e},{type:"kern",size:3*n},{type:"elem",elem:r},{type:"kern",size:n}]},t);return Z.makeSpan(["mord","overline"],[e],t)},mathmlBuilder(e,t){var r=new E.MathNode("mo",[new E.TextNode("‾")]);return r.setAttribute("stretchy","true"),(e=new E.MathNode("mover",[Zs(e.body,t),r])).setAttribute("accent","true"),e}}),o({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:mt((e,t)=>(e=e.parser,t=t[0],{type:"phantom",mode:e.mode,body:Is(t)}),"handler"),htmlBuilder:mt((e,t)=>(e=Bs(e.body,t.withPhantom(),!1),Z.makeFragment(e)),"htmlBuilder"),mathmlBuilder:mt((e,t)=>(e=Xs(e.body,t),new E.MathNode("mphantom",e)),"mathmlBuilder")}),o({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:mt((e,t)=>(e=e.parser,t=t[0],{type:"hphantom",mode:e.mode,body:t}),"handler"),htmlBuilder:mt((e,t)=>{var r=Z.makeSpan([],[qs(e.body,t.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(var n=0;n(e=Xs(Is(e.body),t),t=new E.MathNode("mphantom",e),(e=new E.MathNode("mpadded",[t])).setAttribute("height","0px"),e.setAttribute("depth","0px"),e),"mathmlBuilder")}),o({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:mt((e,t)=>(e=e.parser,t=t[0],{type:"vphantom",mode:e.mode,body:t}),"handler"),htmlBuilder:mt((e,t)=>{var e=Z.makeSpan(["inner"],[qs(e.body,t.withPhantom())]),r=Z.makeSpan(["fix"],[]);return Z.makeSpan(["mord","rlap"],[e,r],t)},"htmlBuilder"),mathmlBuilder:mt((e,t)=>(e=Xs(Is(e.body),t),t=new E.MathNode("mphantom",e),(e=new E.MathNode("mpadded",[t])).setAttribute("width","0px"),e),"mathmlBuilder")}),o({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(e,t){var e=e.parser,r=Ei(t[0],"size").value;return{type:"raisebox",mode:e.mode,dy:r,body:t[1]}},htmlBuilder(e,t){var r=qs(e.body,t),e=Aa(e.dy,t);return Z.makeVList({positionType:"shift",positionData:-e,children:[{type:"elem",elem:r}]},t)},mathmlBuilder(e,t){return t=new E.MathNode("mpadded",[Zs(e.body,t)]),e=e.dy.number+e.dy.unit,t.setAttribute("voffset",e),t}}),o({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0,allowedInArgument:!0},handler(e){return{type:"internal",mode:(e=e.parser).mode}}}),o({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["size","size","size"]},handler(e,t,r){var e=e.parser,r=r[0],n=Ei(t[0],"size"),t=Ei(t[1],"size");return{type:"rule",mode:e.mode,shift:r&&Ei(r,"size").value,width:n.value,height:t.value}},htmlBuilder(e,t){var r=Z.makeSpan(["mord","rule"],[],t),n=Aa(e.width,t),i=Aa(e.height,t),e=e.shift?Aa(e.shift,t):0;return r.style.borderRightWidth=K(n),r.style.borderTopWidth=K(i),r.style.bottom=K(e),r.width=n,r.height=i+e,r.depth=-e,r.maxFontSize=1.125*i*t.sizeMultiplier,r},mathmlBuilder(e,t){var r=Aa(e.width,t),n=Aa(e.height,t),e=e.shift?Aa(e.shift,t):0,t=t.color&&t.getColor()||"black",i=new E.MathNode("mspace"),t=(i.setAttribute("mathbackground",t),i.setAttribute("width",K(r)),i.setAttribute("height",K(n)),new E.MathNode("mpadded",[i]));return 0<=e?t.setAttribute("height",K(e)):(t.setAttribute("height",K(e)),t.setAttribute("depth",K(-e))),t.setAttribute("voffset",K(e)),t}}),mt($i,"sizingGroup"),gl=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"],fl=mt((e,t)=>{var r=t.havingSize(e.size);return $i(e.body,r,t)},"htmlBuilder"),o({type:"sizing",names:gl,props:{numArgs:0,allowedInText:!0},handler:mt((e,t)=>{var{breakOnTokenText:e,funcName:r,parser:n}=e,e=n.parseExpression(!1,e);return{type:"sizing",mode:n.mode,size:gl.indexOf(r)+1,body:e}},"handler"),htmlBuilder:fl,mathmlBuilder:mt((e,t)=>(t=t.havingSize(e.size),e=Xs(e.body,t),(e=new E.MathNode("mstyle",e)).setAttribute("mathsize",K(t.sizeMultiplier)),e),"mathmlBuilder")}),o({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:mt((e,t,r)=>{var e=e.parser,n=!1,i=!1,a=r[0]&&Ei(r[0],"ordgroup");if(a)for(var s,o=0;o{var r=Z.makeSpan([],[qs(e.body,t)]);if(!e.smashHeight&&!e.smashDepth)return r;if(e.smashHeight&&(r.height=0,r.children))for(var n=0;n(t=new E.MathNode("mpadded",[Zs(e.body,t)]),e.smashHeight&&t.setAttribute("height","0px"),e.smashDepth&&t.setAttribute("depth","0px"),t),"mathmlBuilder")}),o({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){return e=e.parser,r=r[0],t=t[0],{type:"sqrt",mode:e.mode,body:t,index:r}},htmlBuilder(e,t){0===(r=qs(e.body,t.havingCrampedStyle())).height&&(r.height=t.fontMetrics().xHeight);var r=Z.wrapFragment(r,t),n=i=t.fontMetrics().defaultRuleThickness,n=i+(t.style.idr.height+r.depth+n&&(n=(n+o-r.height-r.depth)/2),i.height-r.height-n-a),n=(r.style.paddingLeft=K(s),Z.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+o)},{type:"elem",elem:i},{type:"kern",size:a}]},t));return e.index?(s=t.havingStyle(ra.SCRIPTSCRIPT),r=qs(e.index,s,t),o=.6*(n.height-n.depth),i=Z.makeVList({positionType:"shift",positionData:-o,children:[{type:"elem",elem:r}]},t),a=Z.makeSpan(["root"],[i]),Z.makeSpan(["mord","sqrt"],[a,n],t)):Z.makeSpan(["mord","sqrt"],[n],t)},mathmlBuilder(e,t){var{body:e,index:r}=e;return r?new E.MathNode("mroot",[Zs(e,t),Zs(r,t)]):new E.MathNode("msqrt",[Zs(e,t)])}}),ml={display:ra.DISPLAY,text:ra.TEXT,script:ra.SCRIPT,scriptscript:ra.SCRIPTSCRIPT},o({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e,t){var{breakOnTokenText:e,funcName:r,parser:n}=e,e=n.parseExpression(!0,e),r=r.slice(1,r.length-5);return{type:"styling",mode:n.mode,style:r,body:e}},htmlBuilder(e,t){var r=ml[e.style],r=t.havingStyle(r).withFont("");return $i(e.body,r,t)},mathmlBuilder(e,t){var r=ml[e.style],t=t.havingStyle(r),r=Xs(e.body,t),t=new E.MathNode("mstyle",r),r={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[e.style];return t.setAttribute("scriptlevel",r[0]),t.setAttribute("displaystyle",r[1]),t}}),yl=mt(function(e,t){var r=e.base;return r?"op"===r.type?r.limits&&(t.style.size===ra.DISPLAY.size||r.alwaysHandleSupSub)?ll:null:"operatorname"===r.type?r.alwaysHandleSupSub&&(t.style.size===ra.DISPLAY.size||r.limits)?dl:null:"accent"===r.type?Wi.isCharacterBox(r.base)?so:null:"horizBrace"===r.type&&!e.sub===r.isOver?nl:null:null},"htmlBuilderDelegate"),vi({type:"supsub",htmlBuilder(e,t){if(a=yl(e,t))return a(e,t);var r,n,i,{base:a,sup:s,sub:o}=e,l=qs(a,t),c=t.fontMetrics(),h=0,u=0,a=a&&Wi.isCharacterBox(a),o=(s&&(i=t.havingStyle(t.style.sup()),r=qs(s,i,t),a||(h=l.height-i.fontMetrics().supDrop*i.sizeMultiplier/t.sizeMultiplier)),o&&(s=t.havingStyle(t.style.sub()),n=qs(o,s,t),a||(u=l.depth+s.fontMetrics().subDrop*s.sizeMultiplier/t.sizeMultiplier)),i=t.style===ra.DISPLAY?c.sup1:t.style.cramped?c.sup3:c.sup2,t.sizeMultiplier),a=K(.5/c.ptPerEm/o),s=null;if(n&&(o=e.base&&"op"===e.base.type&&e.base.name&&("\\oiint"===e.base.name||"\\oiiint"===e.base.name),l instanceof $a||o)&&(s=K(-l.italic)),r&&n){h=Math.max(h,i,r.depth+.25*c.xHeight),u=Math.max(u,c.sub2),e=4*c.defaultRuleThickness,h-r.depth-(n.height-u){var e=new E.MathNode("mtd",[]);return e.setAttribute("width","50%"),e},"pad"),vi({type:"tag",mathmlBuilder(e,t){return(e=new E.MathNode("mtable",[new E.MathNode("mtr",[wl(),new E.MathNode("mtd",[Ks(e.body,t)]),wl(),new E.MathNode("mtd",[Ks(e.tag,t)])])])).setAttribute("width","100%"),e}}),kl={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},Tl={"\\textbf":"textbf","\\textmd":"textmd"},El={"\\textit":"textit","\\textup":"textup"},Cl=mt((e,t)=>(e=e.font)?kl[e]?t.withTextFontFamily(kl[e]):Tl[e]?t.withTextFontWeight(Tl[e]):"\\emph"===e?"textit"===t.fontShape?t.withTextFontShape("textup"):t.withTextFontShape("textit"):t.withTextFontShape(El[e]):t,"optionsWithFont"),o({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(e,t){var{parser:e,funcName:r}=e,t=t[0];return{type:"text",mode:e.mode,body:Is(t),font:r}},htmlBuilder(e,t){return t=Cl(e,t),e=Bs(e.body,t,!0),Z.makeSpan(["mord","text"],e,t)},mathmlBuilder(e,t){return t=Cl(e,t),Ks(e.body,t)}}),o({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(e,t){return{type:"underline",mode:(e=e.parser).mode,body:t[0]}},htmlBuilder(e,t){var e=qs(e.body,t),r=Z.makeLineSpan("underline-line",t),n=t.fontMetrics().defaultRuleThickness,r=Z.makeVList({positionType:"top",positionData:e.height,children:[{type:"kern",size:n},{type:"elem",elem:r},{type:"kern",size:3*n},{type:"elem",elem:e}]},t);return Z.makeSpan(["mord","underline"],[r],t)},mathmlBuilder(e,t){var r=new E.MathNode("mo",[new E.TextNode("‾")]);return r.setAttribute("stretchy","true"),(e=new E.MathNode("munder",[Zs(e.body,t),r])).setAttribute("accentunder","true"),e}}),o({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(e,t){return{type:"vcenter",mode:(e=e.parser).mode,body:t[0]}},htmlBuilder(e,t){var e=qs(e.body,t),r=t.fontMetrics().axisHeight,r=.5*(e.height-r-(e.depth+r));return Z.makeVList({positionType:"shift",positionData:r,children:[{type:"elem",elem:e}]},t)},mathmlBuilder(e,t){return new E.MathNode("mpadded",[Zs(e.body,t)],["vcenter"])}}),o({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(e,t,r){throw new X("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(e,t){for(var r=_l(e),n=[],i=t.havingStyle(t.style.text()),a=0;ae.body.replace(/ /g,e.star?"␣":" "),"makeVerb"),Sl=Ss,Al=new RegExp("[̀-ͯ]+$"),Ll=class{static{mt(this,"Lexer")}constructor(e,t){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=e,this.settings=t,this.tokenRegex=new RegExp("([ \r\n\t]+)|\\\\(\n|[ \r\t]+\n?)[ \r\t]*|([!-\\[\\]-‧-豈-][̀-ͯ]*|[\ud800-\udbff][\udc00-\udfff][̀-ͯ]*|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5|(\\\\[a-zA-Z@]+)[ \r\n\t]*|\\\\[^\ud800-\udfff])","g"),this.catcodes={"%":14,"~":13}}setCatcode(e,t){this.catcodes[e]=t}lex(){var e=this.input,t=this.tokenRegex.lastIndex;if(t===e.length)return new zi("EOF",new Fi(this,t,t));if(null===(n=this.tokenRegex.exec(e))||n.index!==t)throw new X("Unexpected character: '"+e[t]+"'",new zi(e[t],new Fi(this,t,t+1)));var r,n=n[6]||n[3]||(n[2]?"\\ ":" ");return 14===this.catcodes[n]?(-1===(r=e.indexOf(`
+`,this.tokenRegex.lastIndex))?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=r+1,this.lex()):new zi(n,new Fi(this,t,this.tokenRegex.lastIndex))}},Nl=class{static{mt(this,"Namespace")}constructor(e,t){void 0===e&&(e={}),void 0===t&&(t={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=t,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(0===this.undefStack.length)throw new X("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e,t=this.undefStack.pop();for(e in t)t.hasOwnProperty(e)&&(null==t[e]?delete this.current[e]:this.current[e]=t[e])}endGroups(){for(;0{var i=e.consumeArg().tokens;if(1!==i.length)throw new X("\\newcommand's first argument must be a macro name");var a=i[0].text,s=e.isDefined(a);if(s&&!t)throw new X("\\newcommand{"+a+"} attempting to redefine "+a+"; use \\renewcommand");if(!s&&!r)throw new X("\\renewcommand{"+a+"} when command "+a+" does not yet exist; use \\newcommand");if(t=0,1===(i=e.consumeArg().tokens).length&&"["===i[0].text){for(var o="",l=e.expandNextToken();"]"!==l.text&&"EOF"!==l.text;)o+=l.text,l=e.expandNextToken();if(!o.match(/^\s*[0-9]+\s*$/))throw new X("Invalid number of arguments: "+o);t=parseInt(o),i=e.consumeArg().tokens}return s&&n||e.macros.set(a,{tokens:i,numArgs:t}),""},"newcommand"),l("\\newcommand",e=>Ml(e,!1,!0,!1)),l("\\renewcommand",e=>Ml(e,!0,!1,!1)),l("\\providecommand",e=>Ml(e,!0,!0,!0)),l("\\message",e=>(e=e.consumeArgs(1)[0],console.log(e.reverse().map(e=>e.text).join("")),"")),l("\\errmessage",e=>(e=e.consumeArgs(1)[0],console.error(e.reverse().map(e=>e.text).join("")),"")),l("\\show",e=>{var t=e.popToken(),r=t.text;return console.log(t,e.macros.get(r),Sl[r],ja.math[r],ja.text[r]),""}),l("\\bgroup","{"),l("\\egroup","}"),l("~","\\nobreakspace"),l("\\lq","`"),l("\\rq","'"),l("\\aa","\\r a"),l("\\AA","\\r A"),l("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`©}"),l("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"),l("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`®}"),l("ℬ","\\mathscr{B}"),l("ℰ","\\mathscr{E}"),l("ℱ","\\mathscr{F}"),l("ℋ","\\mathscr{H}"),l("ℐ","\\mathscr{I}"),l("ℒ","\\mathscr{L}"),l("ℳ","\\mathscr{M}"),l("ℛ","\\mathscr{R}"),l("ℭ","\\mathfrak{C}"),l("ℌ","\\mathfrak{H}"),l("ℨ","\\mathfrak{Z}"),l("\\Bbbk","\\Bbb{k}"),l("·","\\cdotp"),l("\\llap","\\mathllap{\\textrm{#1}}"),l("\\rlap","\\mathrlap{\\textrm{#1}}"),l("\\clap","\\mathclap{\\textrm{#1}}"),l("\\mathstrut","\\vphantom{(}"),l("\\underbar","\\underline{\\text{#1}}"),l("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'),l("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`≠}}"),l("\\ne","\\neq"),l("≠","\\neq"),l("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`∉}}"),l("∉","\\notin"),l("≘","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`≘}}"),l("≙","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`≘}}"),l("≚","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`≚}}"),l("≛","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`≛}}"),l("≝","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`≝}}"),l("≞","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`≞}}"),l("≟","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`≟}}"),l("⟂","\\perp"),l("‼","\\mathclose{!\\mkern-0.8mu!}"),l("∌","\\notni"),l("⌜","\\ulcorner"),l("⌝","\\urcorner"),l("⌞","\\llcorner"),l("⌟","\\lrcorner"),l("©","\\copyright"),l("®","\\textregistered"),l("️","\\textregistered"),l("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}'),l("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}'),l("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}'),l("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}'),l("\\vdots","{\\varvdots\\rule{0pt}{15pt}}"),l("⋮","\\vdots"),l("\\varGamma","\\mathit{\\Gamma}"),l("\\varDelta","\\mathit{\\Delta}"),l("\\varTheta","\\mathit{\\Theta}"),l("\\varLambda","\\mathit{\\Lambda}"),l("\\varXi","\\mathit{\\Xi}"),l("\\varPi","\\mathit{\\Pi}"),l("\\varSigma","\\mathit{\\Sigma}"),l("\\varUpsilon","\\mathit{\\Upsilon}"),l("\\varPhi","\\mathit{\\Phi}"),l("\\varPsi","\\mathit{\\Psi}"),l("\\varOmega","\\mathit{\\Omega}"),l("\\substack","\\begin{subarray}{c}#1\\end{subarray}"),l("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax"),l("\\boxed","\\fbox{$\\displaystyle{#1}$}"),l("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;"),l("\\implies","\\DOTSB\\;\\Longrightarrow\\;"),l("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;"),l("\\dddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ...}}{#1}}"),l("\\ddddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ....}}{#1}}"),Dl={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"},l("\\dots",function(e){var t="\\dotso";return(e=e.expandAfterFuture().text)in Dl?t=Dl[e]:("\\not"===e.slice(0,4)||e in ja.math&&Wi.contains(["bin","rel"],ja.math[e].group))&&(t="\\dotsb"),t}),Ol={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0},l("\\dotso",function(e){return e.future().text in Ol?"\\ldots\\,":"\\ldots"}),l("\\dotsc",function(e){return(e=e.future().text)in Ol&&","!==e?"\\ldots\\,":"\\ldots"}),l("\\cdots",function(e){return e.future().text in Ol?"\\@cdots\\,":"\\@cdots"}),l("\\dotsb","\\cdots"),l("\\dotsm","\\cdots"),l("\\dotsi","\\!\\cdots"),l("\\dotsx","\\ldots\\,"),l("\\DOTSI","\\relax"),l("\\DOTSB","\\relax"),l("\\DOTSX","\\relax"),l("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),l("\\,","\\tmspace+{3mu}{.1667em}"),l("\\thinspace","\\,"),l("\\>","\\mskip{4mu}"),l("\\:","\\tmspace+{4mu}{.2222em}"),l("\\medspace","\\:"),l("\\;","\\tmspace+{5mu}{.2777em}"),l("\\thickspace","\\;"),l("\\!","\\tmspace-{3mu}{.1667em}"),l("\\negthinspace","\\!"),l("\\negmedspace","\\tmspace-{4mu}{.2222em}"),l("\\negthickspace","\\tmspace-{5mu}{.277em}"),l("\\enspace","\\kern.5em "),l("\\enskip","\\hskip.5em\\relax"),l("\\quad","\\hskip1em\\relax"),l("\\qquad","\\hskip2em\\relax"),l("\\tag","\\@ifstar\\tag@literal\\tag@paren"),l("\\tag@paren","\\tag@literal{({#1})}"),l("\\tag@literal",e=>{if(e.macros.get("\\df@tag"))throw new X("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"}),l("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),l("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),l("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),l("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),l("\\newline","\\\\\\relax"),l("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}"),l("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+(Pl=K(ya["Main-Regular"][84][1]-.7*ya["Main-Regular"][65][1]))+"}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}"),l("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+Pl+"}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}"),l("\\hspace","\\@ifstar\\@hspacer\\@hspace"),l("\\@hspace","\\hskip #1\\relax"),l("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),l("\\ordinarycolon",":"),l("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),l("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),l("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),l("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),l("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),l("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),l("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),l("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),l("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),l("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),l("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),l("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),l("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),l("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),l("∷","\\dblcolon"),l("∹","\\eqcolon"),l("≔","\\coloneqq"),l("≕","\\eqqcolon"),l("⩴","\\Coloneqq"),l("\\ratio","\\vcentcolon"),l("\\coloncolon","\\dblcolon"),l("\\colonequals","\\coloneqq"),l("\\coloncolonequals","\\Coloneqq"),l("\\equalscolon","\\eqqcolon"),l("\\equalscoloncolon","\\Eqqcolon"),l("\\colonminus","\\coloneq"),l("\\coloncolonminus","\\Coloneq"),l("\\minuscolon","\\eqcolon"),l("\\minuscoloncolon","\\Eqcolon"),l("\\coloncolonapprox","\\Colonapprox"),l("\\coloncolonsim","\\Colonsim"),l("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),l("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),l("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),l("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),l("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`∌}}"),l("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),l("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),l("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}"),l("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}"),l("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}"),l("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}"),l("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}"),l("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}"),l("\\gvertneqq","\\html@mathml{\\@gvertneqq}{≩}"),l("\\lvertneqq","\\html@mathml{\\@lvertneqq}{≨}"),l("\\ngeqq","\\html@mathml{\\@ngeqq}{≱}"),l("\\ngeqslant","\\html@mathml{\\@ngeqslant}{≱}"),l("\\nleqq","\\html@mathml{\\@nleqq}{≰}"),l("\\nleqslant","\\html@mathml{\\@nleqslant}{≰}"),l("\\nshortmid","\\html@mathml{\\@nshortmid}{∤}"),l("\\nshortparallel","\\html@mathml{\\@nshortparallel}{∦}"),l("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{⊈}"),l("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{⊉}"),l("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{⊊}"),l("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{⫋}"),l("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{⊋}"),l("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{⫌}"),l("\\imath","\\html@mathml{\\@imath}{ı}"),l("\\jmath","\\html@mathml{\\@jmath}{ȷ}"),l("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`⟦}}"),l("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`⟧}}"),l("⟦","\\llbracket"),l("⟧","\\rrbracket"),l("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`⦃}}"),l("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`⦄}}"),l("⦃","\\lBrace"),l("⦄","\\rBrace"),l("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`⦵}}"),l("⦵","\\minuso"),l("\\darr","\\downarrow"),l("\\dArr","\\Downarrow"),l("\\Darr","\\Downarrow"),l("\\lang","\\langle"),l("\\rang","\\rangle"),l("\\uarr","\\uparrow"),l("\\uArr","\\Uparrow"),l("\\Uarr","\\Uparrow"),l("\\N","\\mathbb{N}"),l("\\R","\\mathbb{R}"),l("\\Z","\\mathbb{Z}"),l("\\alef","\\aleph"),l("\\alefsym","\\aleph"),l("\\Alpha","\\mathrm{A}"),l("\\Beta","\\mathrm{B}"),l("\\bull","\\bullet"),l("\\Chi","\\mathrm{X}"),l("\\clubs","\\clubsuit"),l("\\cnums","\\mathbb{C}"),l("\\Complex","\\mathbb{C}"),l("\\Dagger","\\ddagger"),l("\\diamonds","\\diamondsuit"),l("\\empty","\\emptyset"),l("\\Epsilon","\\mathrm{E}"),l("\\Eta","\\mathrm{H}"),l("\\exist","\\exists"),l("\\harr","\\leftrightarrow"),l("\\hArr","\\Leftrightarrow"),l("\\Harr","\\Leftrightarrow"),l("\\hearts","\\heartsuit"),l("\\image","\\Im"),l("\\infin","\\infty"),l("\\Iota","\\mathrm{I}"),l("\\isin","\\in"),l("\\Kappa","\\mathrm{K}"),l("\\larr","\\leftarrow"),l("\\lArr","\\Leftarrow"),l("\\Larr","\\Leftarrow"),l("\\lrarr","\\leftrightarrow"),l("\\lrArr","\\Leftrightarrow"),l("\\Lrarr","\\Leftrightarrow"),l("\\Mu","\\mathrm{M}"),l("\\natnums","\\mathbb{N}"),l("\\Nu","\\mathrm{N}"),l("\\Omicron","\\mathrm{O}"),l("\\plusmn","\\pm"),l("\\rarr","\\rightarrow"),l("\\rArr","\\Rightarrow"),l("\\Rarr","\\Rightarrow"),l("\\real","\\Re"),l("\\reals","\\mathbb{R}"),l("\\Reals","\\mathbb{R}"),l("\\Rho","\\mathrm{P}"),l("\\sdot","\\cdot"),l("\\sect","\\S"),l("\\spades","\\spadesuit"),l("\\sub","\\subset"),l("\\sube","\\subseteq"),l("\\supe","\\supseteq"),l("\\Tau","\\mathrm{T}"),l("\\thetasym","\\vartheta"),l("\\weierp","\\wp"),l("\\Zeta","\\mathrm{Z}"),l("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),l("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),l("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits"),l("\\bra","\\mathinner{\\langle{#1}|}"),l("\\ket","\\mathinner{|{#1}\\rangle}"),l("\\braket","\\mathinner{\\langle{#1}\\rangle}"),l("\\Bra","\\left\\langle#1\\right|"),l("\\Ket","\\left|#1\\right\\rangle"),l("\\bra@ket",(Bl=mt(l=>e=>{var t=e.consumeArg().tokens,n=e.consumeArg().tokens,i=e.consumeArg().tokens,r=e.consumeArg().tokens,a=e.macros.get("|"),s=e.macros.get("\\|"),o=(e.macros.beginGroup(),mt(r=>e=>{l&&(e.macros.set("|",a),i.length)&&e.macros.set("\\|",s);var t=r;return!r&&i.length&&"|"===e.future().text&&(e.popToken(),t=!0),{tokens:t?i:n,numArgs:0}},"midMacro")),o=(e.macros.set("|",o(!1)),i.length&&e.macros.set("\\|",o(!0)),e.consumeArg().tokens),r=e.expandTokens([...r,...o,...t]);return e.macros.endGroup(),{tokens:r.reverse(),numArgs:0}},"braketHelper"))(!1)),l("\\bra@set",Bl(!0)),l("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}"),l("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}"),l("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}"),l("\\angln","{\\angl n}"),l("\\blue","\\textcolor{##6495ed}{#1}"),l("\\orange","\\textcolor{##ffa500}{#1}"),l("\\pink","\\textcolor{##ff00af}{#1}"),l("\\red","\\textcolor{##df0030}{#1}"),l("\\green","\\textcolor{##28ae7b}{#1}"),l("\\gray","\\textcolor{gray}{#1}"),l("\\purple","\\textcolor{##9d38bd}{#1}"),l("\\blueA","\\textcolor{##ccfaff}{#1}"),l("\\blueB","\\textcolor{##80f6ff}{#1}"),l("\\blueC","\\textcolor{##63d9ea}{#1}"),l("\\blueD","\\textcolor{##11accd}{#1}"),l("\\blueE","\\textcolor{##0c7f99}{#1}"),l("\\tealA","\\textcolor{##94fff5}{#1}"),l("\\tealB","\\textcolor{##26edd5}{#1}"),l("\\tealC","\\textcolor{##01d1c1}{#1}"),l("\\tealD","\\textcolor{##01a995}{#1}"),l("\\tealE","\\textcolor{##208170}{#1}"),l("\\greenA","\\textcolor{##b6ffb0}{#1}"),l("\\greenB","\\textcolor{##8af281}{#1}"),l("\\greenC","\\textcolor{##74cf70}{#1}"),l("\\greenD","\\textcolor{##1fab54}{#1}"),l("\\greenE","\\textcolor{##0d923f}{#1}"),l("\\goldA","\\textcolor{##ffd0a9}{#1}"),l("\\goldB","\\textcolor{##ffbb71}{#1}"),l("\\goldC","\\textcolor{##ff9c39}{#1}"),l("\\goldD","\\textcolor{##e07d10}{#1}"),l("\\goldE","\\textcolor{##a75a05}{#1}"),l("\\redA","\\textcolor{##fca9a9}{#1}"),l("\\redB","\\textcolor{##ff8482}{#1}"),l("\\redC","\\textcolor{##f9685d}{#1}"),l("\\redD","\\textcolor{##e84d39}{#1}"),l("\\redE","\\textcolor{##bc2612}{#1}"),l("\\maroonA","\\textcolor{##ffbde0}{#1}"),l("\\maroonB","\\textcolor{##ff92c6}{#1}"),l("\\maroonC","\\textcolor{##ed5fa6}{#1}"),l("\\maroonD","\\textcolor{##ca337c}{#1}"),l("\\maroonE","\\textcolor{##9e034e}{#1}"),l("\\purpleA","\\textcolor{##ddd7ff}{#1}"),l("\\purpleB","\\textcolor{##c6b9fc}{#1}"),l("\\purpleC","\\textcolor{##aa87ff}{#1}"),l("\\purpleD","\\textcolor{##7854ab}{#1}"),l("\\purpleE","\\textcolor{##543b78}{#1}"),l("\\mintA","\\textcolor{##f5f9e8}{#1}"),l("\\mintB","\\textcolor{##edf2df}{#1}"),l("\\mintC","\\textcolor{##e0e5cc}{#1}"),l("\\grayA","\\textcolor{##f6f7f7}{#1}"),l("\\grayB","\\textcolor{##f0f1f2}{#1}"),l("\\grayC","\\textcolor{##e3e5e6}{#1}"),l("\\grayD","\\textcolor{##d6d8da}{#1}"),l("\\grayE","\\textcolor{##babec2}{#1}"),l("\\grayF","\\textcolor{##888d93}{#1}"),l("\\grayG","\\textcolor{##626569}{#1}"),l("\\grayH","\\textcolor{##3b3e40}{#1}"),l("\\grayI","\\textcolor{##21242c}{#1}"),l("\\kaBlue","\\textcolor{##314453}{#1}"),l("\\kaGreen","\\textcolor{##71B307}{#1}"),$l={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},Fl=class{static{mt(this,"MacroExpander")}constructor(e,t,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new Nl(Il,t.macros),this.mode=r,this.stack=[]}feed(e){this.lexer=new Ll(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){var t,r,n;if(e){if(this.consumeSpaces(),"["!==this.future().text)return null;t=this.popToken(),{tokens:n,end:r}=this.consumeArg(["]"])}else({tokens:n,start:t,end:r}=this.consumeArg());return this.pushToken(new zi("EOF",r.loc)),this.pushTokens(n),t.range(r,"")}consumeSpaces(){for(;" "===this.future().text;)this.stack.pop()}consumeArg(e){var t,r=[],n=e&&0this.settings.maxExpand)throw new X("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var t=this.popToken(),r=t.text,n=t.noexpand?null:this._getExpansion(r);if(null==n||e&&n.unexpandable){if(e&&null==n&&"\\"===r[0]&&!this.isDefined(r))throw new X("Undefined control sequence: "+r);return this.pushToken(t),!1}this.countExpansion(1);var i=n.tokens,a=this.consumeArgs(n.numArgs,n.delimiters);if(n.numArgs)for(var s=(i=i.slice()).length-1;0<=s;--s){var o=i[s];if("#"===o.text){if(0===s)throw new X("Incomplete placeholder at end of macro body",o);if("#"===(o=i[--s]).text)i.splice(s+1,1);else{if(!/^[1-9]$/.test(o.text))throw new X("Not a valid argument number",o);i.splice(s,2,...a[+o.text-1])}}}return this.pushTokens(i),i.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;){var e;if(!1===this.expandOnce())return(e=this.stack.pop()).treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new zi(e)]):void 0}expandTokens(e){var t,r=[],n=this.stack.length;for(this.pushTokens(e);this.stack.length>n;)!1===this.expandOnce(!0)&&((t=this.stack.pop()).treatAsRelax&&(t.noexpand=!1,t.treatAsRelax=!1),r.push(t));return this.countExpansion(r.length),r}expandMacroAsText(e){return(e=this.expandMacro(e))&&e.map(e=>e.text).join("")}_getExpansion(e){var t=this.macros.get(e);if(null==t)return t;if(1!==e.length||null==(e=this.lexer.catcodes[e])||13===e){if("string"!=typeof(e="function"==typeof t?t(this):t))return e;var r=0;if(-1!==e.indexOf("#"))for(var n=e.replace(/##/g,"");-1!==n.indexOf("#"+(r+1));)++r;for(var i=new Ll(e,this.settings),a=[],s=i.lex();"EOF"!==s.text;)a.push(s),s=i.lex();return a.reverse(),{tokens:a,numArgs:r}}}isDefined(e){return this.macros.has(e)||Sl.hasOwnProperty(e)||ja.math.hasOwnProperty(e)||ja.text.hasOwnProperty(e)||$l.hasOwnProperty(e)}isExpandable(e){var t=this.macros.get(e);return null!=t?"string"==typeof t||"function"==typeof t||!t.unexpandable:Sl.hasOwnProperty(e)&&!Sl[e].primitive}},zl=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,Gl=Object.freeze({"₊":"+","₋":"-","₌":"=","₍":"(","₎":")","₀":"0","₁":"1","₂":"2","₃":"3","₄":"4","₅":"5","₆":"6","₇":"7","₈":"8","₉":"9","ₐ":"a","ₑ":"e","ₕ":"h","ᵢ":"i","ⱼ":"j","ₖ":"k","ₗ":"l","ₘ":"m","ₙ":"n","ₒ":"o","ₚ":"p","ᵣ":"r","ₛ":"s","ₜ":"t","ᵤ":"u","ᵥ":"v","ₓ":"x","ᵦ":"β","ᵧ":"γ","ᵨ":"ρ","ᵩ":"ϕ","ᵪ":"χ","⁺":"+","⁻":"-","⁼":"=","⁽":"(","⁾":")","⁰":"0","¹":"1","²":"2","³":"3","⁴":"4","⁵":"5","⁶":"6","⁷":"7","⁸":"8","⁹":"9","ᴬ":"A","ᴮ":"B","ᴰ":"D","ᴱ":"E","ᴳ":"G","ᴴ":"H","ᴵ":"I","ᴶ":"J","ᴷ":"K","ᴸ":"L","ᴹ":"M","ᴺ":"N","ᴼ":"O","ᴾ":"P","ᴿ":"R","ᵀ":"T","ᵁ":"U","ⱽ":"V","ᵂ":"W","ᵃ":"a","ᵇ":"b","ᶜ":"c","ᵈ":"d","ᵉ":"e","ᶠ":"f","ᵍ":"g","ʰ":"h","ⁱ":"i","ʲ":"j","ᵏ":"k","ˡ":"l","ᵐ":"m","ⁿ":"n","ᵒ":"o","ᵖ":"p","ʳ":"r","ˢ":"s","ᵗ":"t","ᵘ":"u","ᵛ":"v","ʷ":"w","ˣ":"x","ʸ":"y","ᶻ":"z","ᵝ":"β","ᵞ":"γ","ᵟ":"δ","ᵠ":"ϕ","ᵡ":"χ","ᶿ":"θ"}),Ul={"́":{text:"\\'",math:"\\acute"},"̀":{text:"\\`",math:"\\grave"},"̈":{text:'\\"',math:"\\ddot"},"̃":{text:"\\~",math:"\\tilde"},"̄":{text:"\\=",math:"\\bar"},"̆":{text:"\\u",math:"\\breve"},"̌":{text:"\\v",math:"\\check"},"̂":{text:"\\^",math:"\\hat"},"̇":{text:"\\.",math:"\\dot"},"̊":{text:"\\r",math:"\\mathring"},"̋":{text:"\\H"},"̧":{text:"\\c"}},ql={"á":"á","à":"à","ä":"ä","ǟ":"ǟ","ã":"ã","ā":"ā","ă":"ă","ắ":"ắ","ằ":"ằ","ẵ":"ẵ","ǎ":"ǎ","â":"â","ấ":"ấ","ầ":"ầ","ẫ":"ẫ","ȧ":"ȧ","ǡ":"ǡ","å":"å","ǻ":"ǻ","ḃ":"ḃ","ć":"ć","ḉ":"ḉ","č":"č","ĉ":"ĉ","ċ":"ċ","ç":"ç","ď":"ď","ḋ":"ḋ","ḑ":"ḑ","é":"é","è":"è","ë":"ë","ẽ":"ẽ","ē":"ē","ḗ":"ḗ","ḕ":"ḕ","ĕ":"ĕ","ḝ":"ḝ","ě":"ě","ê":"ê","ế":"ế","ề":"ề","ễ":"ễ","ė":"ė","ȩ":"ȩ","ḟ":"ḟ","ǵ":"ǵ","ḡ":"ḡ","ğ":"ğ","ǧ":"ǧ","ĝ":"ĝ","ġ":"ġ","ģ":"ģ","ḧ":"ḧ","ȟ":"ȟ","ĥ":"ĥ","ḣ":"ḣ","ḩ":"ḩ","í":"í","ì":"ì","ï":"ï","ḯ":"ḯ","ĩ":"ĩ","ī":"ī","ĭ":"ĭ","ǐ":"ǐ","î":"î","ǰ":"ǰ","ĵ":"ĵ","ḱ":"ḱ","ǩ":"ǩ","ķ":"ķ","ĺ":"ĺ","ľ":"ľ","ļ":"ļ","ḿ":"ḿ","ṁ":"ṁ","ń":"ń","ǹ":"ǹ","ñ":"ñ","ň":"ň","ṅ":"ṅ","ņ":"ņ","ó":"ó","ò":"ò","ö":"ö","ȫ":"ȫ","õ":"õ","ṍ":"ṍ","ṏ":"ṏ","ȭ":"ȭ","ō":"ō","ṓ":"ṓ","ṑ":"ṑ","ŏ":"ŏ","ǒ":"ǒ","ô":"ô","ố":"ố","ồ":"ồ","ỗ":"ỗ","ȯ":"ȯ","ȱ":"ȱ","ő":"ő","ṕ":"ṕ","ṗ":"ṗ","ŕ":"ŕ","ř":"ř","ṙ":"ṙ","ŗ":"ŗ","ś":"ś","ṥ":"ṥ","š":"š","ṧ":"ṧ","ŝ":"ŝ","ṡ":"ṡ","ş":"ş","ẗ":"ẗ","ť":"ť","ṫ":"ṫ","ţ":"ţ","ú":"ú","ù":"ù","ü":"ü","ǘ":"ǘ","ǜ":"ǜ","ǖ":"ǖ","ǚ":"ǚ","ũ":"ũ","ṹ":"ṹ","ū":"ū","ṻ":"ṻ","ŭ":"ŭ","ǔ":"ǔ","û":"û","ů":"ů","ű":"ű","ṽ":"ṽ","ẃ":"ẃ","ẁ":"ẁ","ẅ":"ẅ","ŵ":"ŵ","ẇ":"ẇ","ẘ":"ẘ","ẍ":"ẍ","ẋ":"ẋ","ý":"ý","ỳ":"ỳ","ÿ":"ÿ","ỹ":"ỹ","ȳ":"ȳ","ŷ":"ŷ","ẏ":"ẏ","ẙ":"ẙ","ź":"ź","ž":"ž","ẑ":"ẑ","ż":"ż","Á":"Á","À":"À","Ä":"Ä","Ǟ":"Ǟ","Ã":"Ã","Ā":"Ā","Ă":"Ă","Ắ":"Ắ","Ằ":"Ằ","Ẵ":"Ẵ","Ǎ":"Ǎ","Â":"Â","Ấ":"Ấ","Ầ":"Ầ","Ẫ":"Ẫ","Ȧ":"Ȧ","Ǡ":"Ǡ","Å":"Å","Ǻ":"Ǻ","Ḃ":"Ḃ","Ć":"Ć","Ḉ":"Ḉ","Č":"Č","Ĉ":"Ĉ","Ċ":"Ċ","Ç":"Ç","Ď":"Ď","Ḋ":"Ḋ","Ḑ":"Ḑ","É":"É","È":"È","Ë":"Ë","Ẽ":"Ẽ","Ē":"Ē","Ḗ":"Ḗ","Ḕ":"Ḕ","Ĕ":"Ĕ","Ḝ":"Ḝ","Ě":"Ě","Ê":"Ê","Ế":"Ế","Ề":"Ề","Ễ":"Ễ","Ė":"Ė","Ȩ":"Ȩ","Ḟ":"Ḟ","Ǵ":"Ǵ","Ḡ":"Ḡ","Ğ":"Ğ","Ǧ":"Ǧ","Ĝ":"Ĝ","Ġ":"Ġ","Ģ":"Ģ","Ḧ":"Ḧ","Ȟ":"Ȟ","Ĥ":"Ĥ","Ḣ":"Ḣ","Ḩ":"Ḩ","Í":"Í","Ì":"Ì","Ï":"Ï","Ḯ":"Ḯ","Ĩ":"Ĩ","Ī":"Ī","Ĭ":"Ĭ","Ǐ":"Ǐ","Î":"Î","İ":"İ","Ĵ":"Ĵ","Ḱ":"Ḱ","Ǩ":"Ǩ","Ķ":"Ķ","Ĺ":"Ĺ","Ľ":"Ľ","Ļ":"Ļ","Ḿ":"Ḿ","Ṁ":"Ṁ","Ń":"Ń","Ǹ":"Ǹ","Ñ":"Ñ","Ň":"Ň","Ṅ":"Ṅ","Ņ":"Ņ","Ó":"Ó","Ò":"Ò","Ö":"Ö","Ȫ":"Ȫ","Õ":"Õ","Ṍ":"Ṍ","Ṏ":"Ṏ","Ȭ":"Ȭ","Ō":"Ō","Ṓ":"Ṓ","Ṑ":"Ṑ","Ŏ":"Ŏ","Ǒ":"Ǒ","Ô":"Ô","Ố":"Ố","Ồ":"Ồ","Ỗ":"Ỗ","Ȯ":"Ȯ","Ȱ":"Ȱ","Ő":"Ő","Ṕ":"Ṕ","Ṗ":"Ṗ","Ŕ":"Ŕ","Ř":"Ř","Ṙ":"Ṙ","Ŗ":"Ŗ","Ś":"Ś","Ṥ":"Ṥ","Š":"Š","Ṧ":"Ṧ","Ŝ":"Ŝ","Ṡ":"Ṡ","Ş":"Ş","Ť":"Ť","Ṫ":"Ṫ","Ţ":"Ţ","Ú":"Ú","Ù":"Ù","Ü":"Ü","Ǘ":"Ǘ","Ǜ":"Ǜ","Ǖ":"Ǖ","Ǚ":"Ǚ","Ũ":"Ũ","Ṹ":"Ṹ","Ū":"Ū","Ṻ":"Ṻ","Ŭ":"Ŭ","Ǔ":"Ǔ","Û":"Û","Ů":"Ů","Ű":"Ű","Ṽ":"Ṽ","Ẃ":"Ẃ","Ẁ":"Ẁ","Ẅ":"Ẅ","Ŵ":"Ŵ","Ẇ":"Ẇ","Ẍ":"Ẍ","Ẋ":"Ẋ","Ý":"Ý","Ỳ":"Ỳ","Ÿ":"Ÿ","Ỹ":"Ỹ","Ȳ":"Ȳ","Ŷ":"Ŷ","Ẏ":"Ẏ","Ź":"Ź","Ž":"Ž","Ẑ":"Ẑ","Ż":"Ż","ά":"ά","ὰ":"ὰ","ᾱ":"ᾱ","ᾰ":"ᾰ","έ":"έ","ὲ":"ὲ","ή":"ή","ὴ":"ὴ","ί":"ί","ὶ":"ὶ","ϊ":"ϊ","ΐ":"ΐ","ῒ":"ῒ","ῑ":"ῑ","ῐ":"ῐ","ό":"ό","ὸ":"ὸ","ύ":"ύ","ὺ":"ὺ","ϋ":"ϋ","ΰ":"ΰ","ῢ":"ῢ","ῡ":"ῡ","ῠ":"ῠ","ώ":"ώ","ὼ":"ὼ","Ύ":"Ύ","Ὺ":"Ὺ","Ϋ":"Ϋ","Ῡ":"Ῡ","Ῠ":"Ῠ","Ώ":"Ώ","Ὼ":"Ὼ"},(jl=class a{static{mt(this,"Parser")}constructor(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new Fl(e,t,this.mode),this.settings=t,this.leftrightDepth=0}expect(e,t){if(void 0===t&&(t=!0),this.fetch().text!==e)throw new X("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()}consume(){this.nextToken=null}fetch(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var t=this.nextToken,e=(this.consume(),this.gullet.pushToken(new zi("}")),this.gullet.pushTokens(e),this.parseExpression(!1));return this.expect("}"),this.nextToken=t,e}parseExpression(e,t){for(var r=[];;){"math"===this.mode&&this.consumeSpaces();var n=this.fetch();if(-1!==a.endOfExpression.indexOf(n.text)||t&&n.text===t||e&&Sl[n.text]&&Sl[n.text].infix)break;if(!(n=this.parseAtom(t)))break;"internal"!==n.type&&r.push(n)}return"text"===this.mode&&this.formLigatures(r),this.handleInfixNodes(r)}handleInfixNodes(e){for(var t,r,n,i=-1,a=0;a{"A"===e.tagName&&e.hasAttribute("target")&&e.setAttribute(t,e.getAttribute("target")??"")}),si.addHook("afterSanitizeAttributes",e=>{"A"===e.tagName&&e.hasAttribute(t)&&(e.setAttribute("target",e.getAttribute(t)??""),e.removeAttribute(t),"_blank"===e.getAttribute("target"))&&e.setAttribute("rel","noopener")})}var nc,ic,ac,sc,oc,lc,cc,hc,uc,dc,pc,gc,fc,mc,yc,vc,xc,bc,wc,kc,Tc,Ec,Cc,_c,Sc,L,Ac,Lc,Nc,Ic,Rc,Mc,Dc,Oc=b(()=>{oi(),nc=/ /gi,ic=mt(e=>e?pc(e).replace(/\\n/g,"#br#").split("#br#"):[""],"getRows"),ac=(()=>{let e=!1;return()=>{e||(rc(),e=!0)}})(),mt(rc,"setupDompurifyHooks"),sc=mt(e=>(ac(),si.sanitize(e)),"removeScript"),oc=mt((e,t)=>(!1!==t.flowchart?.htmlLabels&&("antiscript"===(t=t.securityLevel)||"strict"===t?e=sc(e):"loose"!==t&&(e=(e=(e=pc(e)).replace(//g,">")).replace(/=/g,"="),e=dc(e))),e),"sanitizeMore"),lc=mt((e,t)=>e&&(t.dompurifyConfig?si.sanitize(oc(e,t),t.dompurifyConfig):si.sanitize(oc(e,t),{FORBID_TAGS:["style"]})).toString(),"sanitizeText"),cc=mt((e,t)=>"string"==typeof e?lc(e,t):e.flat().map(e=>lc(e,t)),"sanitizeTextOrArray"),hc=mt(e=>nc.test(e),"hasBreaks"),uc=mt(e=>e.split(nc),"splitBreaks"),dc=mt(e=>e.replace(/#br#/g," "),"placeholderToBreak"),pc=mt(e=>e.replace(nc,"#br#"),"breakToPlaceholder"),gc=mt(e=>{let t="";return e&&(t=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,t=CSS.escape(t)),t},"getUrl"),fc=mt(e=>!(!1===e||["false","null","0"].includes(String(e).trim().toLowerCase())),"evaluate"),mc=mt(function(...e){return e=e.filter(e=>!isNaN(e)),Math.max(...e)},"getMax"),yc=mt(function(...e){return e=e.filter(e=>!isNaN(e)),Math.min(...e)},"getMin"),vc=mt(function(e){var r,n,i=e.split(/(,)/),a=[];for(let t=0;tMath.max(0,e.split(t).length-1),"countOccurrence"),bc=mt((e,t)=>(e=xc(e,"~"),t=xc(t,"~"),1===e&&1===t),"shouldCombineSets"),wc=mt(e=>{let t=xc(e,"~"),r=!1;if(t<=1)return e;t%2!=0&&e.startsWith("~")&&(e=e.substring(1),r=!0);let n=[...e],i=n.indexOf("~"),a=n.lastIndexOf("~");for(;-1!==i&&-1!==a&&i!==a;)n[i]="<",n[a]=">",i=n.indexOf("~"),a=n.lastIndexOf("~");return r&&n.unshift("~"),n.join("")},"processSet"),kc=mt(()=>void 0!==window.MathMLElement,"isMathMLSupported"),Tc=/\$\$(.*)\$\$/g,Ec=mt(e=>0<(e.match(Tc)?.length??0),"hasKatex"),Cc=mt(async(e,t)=>{var r=document.createElement("div"),e=(r.innerHTML=await Sc(e,t),r.id="katex-temp",r.style.visibility="hidden",r.style.position="absolute",r.style.top="0",document.querySelector("body")?.insertAdjacentElement("beforeend",r),{width:r.clientWidth,height:r.clientHeight});return r.remove(),e},"calculateMathMLDimensions"),_c=mt(async(e,t)=>{if(!Ec(e))return e;if(!(kc()||t.legacyMathML||t.forceLegacyMathML))return e.replace(Tc,"MathML is unsupported in this environment.");{let r=(await Promise.resolve().then(()=>(tc(),li))).default,n=t.forceLegacyMathML||!kc()&&t.legacyMathML?"htmlAndMathml":"mathml";return e.split(nc).map(e=>Ec(e)?`${e}
`:`${e}
`).join("").replace(Tc,(e,t)=>r.renderToString(t,{throwOnError:!0,displayMode:!0,output:n}).replace(/\n/g," ").replace(//g,""))}},"renderKatexUnsanitized"),Sc=mt(async(e,t)=>lc(await _c(e,t),t),"renderKatexSanitized"),L={getRows:ic,sanitizeText:lc,sanitizeTextOrArray:cc,hasBreaks:hc,splitBreaks:uc,lineBreakRegex:nc,removeScript:sc,getUrl:gc,evaluate:fc,getMax:mc,getMin:yc}}),Pc=b(()=>{fr(),rn(),Oc(),e(),Ac={body:'? ',height:80,width:80},Lc=new Map,Nc=new Map,Ic=mt(e=>{for(var t of e){if(!t.name)throw new Error('Invalid icon loader. Must have a "name" property with non-empty string value.');if(D.debug("Registering icon pack:",t.name),"loader"in t)Nc.set(t.name,t.loader);else{if(!("icons"in t))throw D.error("Invalid icon loader:",t),new Error('Invalid icon loader. Must have either "icons" or "loader" property.');Lc.set(t.name,t.icons)}}},"registerIconPacks"),Rc=mt(async(e,t)=>{var r=A(e,!0,void 0!==t);if(!r)throw new Error("Invalid icon name: "+e);if(!(t=r.prefix||t))throw new Error("Icon name must contain a prefix: "+e);let n=Lc.get(t);if(!n){var i=Nc.get(t);if(!i)throw new Error("Icon set not found: "+r.prefix);try{n={...await i(),prefix:t},Lc.set(t,n)}catch(e){throw D.error(e),new Error("Failed to load icon set: "+r.prefix)}}if(i=oe(n,r.name))return i;throw new Error("Icon not found: "+e)},"getRegisteredIconData"),Mc=mt(async e=>{try{return await Rc(e),!0}catch{return!1}},"isIconAvailable"),Dc=mt(async(e,t,r)=>{let n;try{n=await Rc(e,t?.fallbackPrefix)}catch(e){D.error(e),n=Ac}return t=_e(we((e=ve(n,t)).body),{...e.attributes,...r}),lc(t,ar())},"getIconSVG")});function Bc(e){for(var t=[],r=1;r{mt(Bc,"dedent")}),ih=b(()=>{$c=/^-{3}\s*[\n\r](.*?)[\n\r]-{3}\s*[\n\r]+/s,Fc=/%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,zc=/\s*%%.*\n/gm}),ah=b(()=>{Gc=class extends Error{static{mt(this,"UnknownDiagramError")}constructor(e){super(e),this.name="UnknownDiagramError"}}}),sh=b(()=>{e(),ih(),ah(),Uc={},qc=mt(function(e,t){e=e.replace($c,"").replace(Fc,"").replace(zc,`
+`);for(var[r,{detector:n}]of Object.entries(Uc))if(n(e,t))return r;throw new Gc("No diagram type detected matching given configuration for text: "+e)},"detectType"),jc=mt((...e)=>{for(var{id:t,detector:r,loader:n}of e)Yc(t,r,n)},"registerLazyLoadedDiagrams"),Yc=mt((e,t,r)=>{Uc[e]&&D.warn(`Detector with key ${e} already exists. Overwriting.`),Uc[e]={detector:t,loader:r},D.debug(`Detector with key ${e} added`+(r?" with loader":""))},"addDetector"),Wc=mt(e=>Uc[e].loader,"getDiagramLoader")}),oh=b(()=>{function B(){this.yy={}}var e=mt(function(e,t,r,n){for(r=r||{},n=e.length;n--;r[e[n]]=t);return r},"o"),t=[1,24],r=[1,25],$=[1,26],F=[1,27],z=[1,28],n=[1,63],i=[1,64],a=[1,65],s=[1,66],o=[1,67],l=[1,68],h=[1,69],u=[1,29],d=[1,30],p=[1,31],g=[1,32],f=[1,33],m=[1,34],y=[1,35],v=[1,36],x=[1,37],b=[1,38],w=[1,39],k=[1,40],T=[1,41],E=[1,42],C=[1,43],_=[1,44],S=[1,45],A=[1,46],L=[1,47],N=[1,48],I=[1,50],G=[1,51],U=[1,52],q=[1,53],j=[1,54],Y=[1,55],W=[1,56],H=[1,57],V=[1,58],X=[1,59],K=[1,60],Z=[14,42],Q=[14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],J=[12,14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],R=[1,82],M=[1,83],D=[1,84],O=[1,85],P=[12,14,42],ee=[12,14,33,42],te=[12,14,33,42,76,77,79,80],re=[12,33],ne=[34,36,37,38,39,40,41,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],t={trace:mt(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,direction:5,direction_tb:6,direction_bt:7,direction_rl:8,direction_lr:9,graphConfig:10,C4_CONTEXT:11,NEWLINE:12,statements:13,EOF:14,C4_CONTAINER:15,C4_COMPONENT:16,C4_DYNAMIC:17,C4_DEPLOYMENT:18,otherStatements:19,diagramStatements:20,otherStatement:21,title:22,accDescription:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,boundaryStatement:29,boundaryStartStatement:30,boundaryStopStatement:31,boundaryStart:32,LBRACE:33,ENTERPRISE_BOUNDARY:34,attributes:35,SYSTEM_BOUNDARY:36,BOUNDARY:37,CONTAINER_BOUNDARY:38,NODE:39,NODE_L:40,NODE_R:41,RBRACE:42,diagramStatement:43,PERSON:44,PERSON_EXT:45,SYSTEM:46,SYSTEM_DB:47,SYSTEM_QUEUE:48,SYSTEM_EXT:49,SYSTEM_EXT_DB:50,SYSTEM_EXT_QUEUE:51,CONTAINER:52,CONTAINER_DB:53,CONTAINER_QUEUE:54,CONTAINER_EXT:55,CONTAINER_EXT_DB:56,CONTAINER_EXT_QUEUE:57,COMPONENT:58,COMPONENT_DB:59,COMPONENT_QUEUE:60,COMPONENT_EXT:61,COMPONENT_EXT_DB:62,COMPONENT_EXT_QUEUE:63,REL:64,BIREL:65,REL_U:66,REL_D:67,REL_L:68,REL_R:69,REL_B:70,REL_INDEX:71,UPDATE_EL_STYLE:72,UPDATE_REL_STYLE:73,UPDATE_LAYOUT_CONFIG:74,attribute:75,STR:76,STR_KEY:77,STR_VALUE:78,ATTRIBUTE:79,ATTRIBUTE_EMPTY:80,$accept:0,$end:1},terminals_:{2:"error",6:"direction_tb",7:"direction_bt",8:"direction_rl",9:"direction_lr",11:"C4_CONTEXT",12:"NEWLINE",14:"EOF",15:"C4_CONTAINER",16:"C4_COMPONENT",17:"C4_DYNAMIC",18:"C4_DEPLOYMENT",22:"title",23:"accDescription",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"LBRACE",34:"ENTERPRISE_BOUNDARY",36:"SYSTEM_BOUNDARY",37:"BOUNDARY",38:"CONTAINER_BOUNDARY",39:"NODE",40:"NODE_L",41:"NODE_R",42:"RBRACE",44:"PERSON",45:"PERSON_EXT",46:"SYSTEM",47:"SYSTEM_DB",48:"SYSTEM_QUEUE",49:"SYSTEM_EXT",50:"SYSTEM_EXT_DB",51:"SYSTEM_EXT_QUEUE",52:"CONTAINER",53:"CONTAINER_DB",54:"CONTAINER_QUEUE",55:"CONTAINER_EXT",56:"CONTAINER_EXT_DB",57:"CONTAINER_EXT_QUEUE",58:"COMPONENT",59:"COMPONENT_DB",60:"COMPONENT_QUEUE",61:"COMPONENT_EXT",62:"COMPONENT_EXT_DB",63:"COMPONENT_EXT_QUEUE",64:"REL",65:"BIREL",66:"REL_U",67:"REL_D",68:"REL_L",69:"REL_R",70:"REL_B",71:"REL_INDEX",72:"UPDATE_EL_STYLE",73:"UPDATE_REL_STYLE",74:"UPDATE_LAYOUT_CONFIG",76:"STR",77:"STR_KEY",78:"STR_VALUE",79:"ATTRIBUTE",80:"ATTRIBUTE_EMPTY"},productions_:[0,[3,1],[3,1],[5,1],[5,1],[5,1],[5,1],[4,1],[10,4],[10,4],[10,4],[10,4],[10,4],[13,1],[13,1],[13,2],[19,1],[19,2],[19,3],[21,1],[21,1],[21,2],[21,2],[21,1],[29,3],[30,3],[30,3],[30,4],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[31,1],[20,1],[20,2],[20,3],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,1],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[35,1],[35,2],[75,1],[75,2],[75,1],[75,1]],performAction:mt(function(e,t,r,n,i,a,s){var o=a.length-1;switch(i){case 3:n.setDirection("TB");break;case 4:n.setDirection("BT");break;case 5:n.setDirection("RL");break;case 6:n.setDirection("LR");break;case 8:case 9:case 10:case 11:case 12:n.setC4Type(a[o-3]);break;case 19:n.setTitle(a[o].substring(6)),this.$=a[o].substring(6);break;case 20:n.setAccDescription(a[o].substring(15)),this.$=a[o].substring(15);break;case 21:this.$=a[o].trim(),n.setTitle(this.$);break;case 22:case 23:this.$=a[o].trim(),n.setAccDescription(this.$);break;case 28:a[o].splice(2,0,"ENTERPRISE"),n.addPersonOrSystemBoundary(...a[o]),this.$=a[o];break;case 29:a[o].splice(2,0,"SYSTEM"),n.addPersonOrSystemBoundary(...a[o]),this.$=a[o];break;case 30:n.addPersonOrSystemBoundary(...a[o]),this.$=a[o];break;case 31:a[o].splice(2,0,"CONTAINER"),n.addContainerBoundary(...a[o]),this.$=a[o];break;case 32:n.addDeploymentNode("node",...a[o]),this.$=a[o];break;case 33:n.addDeploymentNode("nodeL",...a[o]),this.$=a[o];break;case 34:n.addDeploymentNode("nodeR",...a[o]),this.$=a[o];break;case 35:n.popBoundaryParseStack();break;case 39:n.addPersonOrSystem("person",...a[o]),this.$=a[o];break;case 40:n.addPersonOrSystem("external_person",...a[o]),this.$=a[o];break;case 41:n.addPersonOrSystem("system",...a[o]),this.$=a[o];break;case 42:n.addPersonOrSystem("system_db",...a[o]),this.$=a[o];break;case 43:n.addPersonOrSystem("system_queue",...a[o]),this.$=a[o];break;case 44:n.addPersonOrSystem("external_system",...a[o]),this.$=a[o];break;case 45:n.addPersonOrSystem("external_system_db",...a[o]),this.$=a[o];break;case 46:n.addPersonOrSystem("external_system_queue",...a[o]),this.$=a[o];break;case 47:n.addContainer("container",...a[o]),this.$=a[o];break;case 48:n.addContainer("container_db",...a[o]),this.$=a[o];break;case 49:n.addContainer("container_queue",...a[o]),this.$=a[o];break;case 50:n.addContainer("external_container",...a[o]),this.$=a[o];break;case 51:n.addContainer("external_container_db",...a[o]),this.$=a[o];break;case 52:n.addContainer("external_container_queue",...a[o]),this.$=a[o];break;case 53:n.addComponent("component",...a[o]),this.$=a[o];break;case 54:n.addComponent("component_db",...a[o]),this.$=a[o];break;case 55:n.addComponent("component_queue",...a[o]),this.$=a[o];break;case 56:n.addComponent("external_component",...a[o]),this.$=a[o];break;case 57:n.addComponent("external_component_db",...a[o]),this.$=a[o];break;case 58:n.addComponent("external_component_queue",...a[o]),this.$=a[o];break;case 60:n.addRel("rel",...a[o]),this.$=a[o];break;case 61:n.addRel("birel",...a[o]),this.$=a[o];break;case 62:n.addRel("rel_u",...a[o]),this.$=a[o];break;case 63:n.addRel("rel_d",...a[o]),this.$=a[o];break;case 64:n.addRel("rel_l",...a[o]),this.$=a[o];break;case 65:n.addRel("rel_r",...a[o]),this.$=a[o];break;case 66:n.addRel("rel_b",...a[o]),this.$=a[o];break;case 67:a[o].splice(0,1),n.addRel("rel",...a[o]),this.$=a[o];break;case 68:n.updateElStyle("update_el_style",...a[o]),this.$=a[o];break;case 69:n.updateRelStyle("update_rel_style",...a[o]),this.$=a[o];break;case 70:n.updateLayoutConfig("update_layout_config",...a[o]),this.$=a[o];break;case 71:this.$=[a[o]];break;case 72:a[o].unshift(a[o-1]),this.$=a[o];break;case 73:case 75:this.$=a[o].trim();break;case 74:var l={};l[a[o-1].trim()]=a[o].trim(),this.$=l;break;case 76:this.$=""}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],7:[1,6],8:[1,7],9:[1,8],10:4,11:[1,9],15:[1,10],16:[1,11],17:[1,12],18:[1,13]},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,7]},{1:[2,3]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{12:[1,14]},{12:[1,15]},{12:[1,16]},{12:[1,17]},{12:[1,18]},{13:19,19:20,20:21,21:22,22:t,23:r,24:$,26:F,28:z,29:49,30:61,32:62,34:n,36:i,37:a,38:s,39:o,40:l,41:h,43:23,44:u,45:d,46:p,47:g,48:f,49:m,50:y,51:v,52:x,53:b,54:w,55:k,56:T,57:E,58:C,59:_,60:S,61:A,62:L,63:N,64:I,65:G,66:U,67:q,68:j,69:Y,70:W,71:H,72:V,73:X,74:K},{13:70,19:20,20:21,21:22,22:t,23:r,24:$,26:F,28:z,29:49,30:61,32:62,34:n,36:i,37:a,38:s,39:o,40:l,41:h,43:23,44:u,45:d,46:p,47:g,48:f,49:m,50:y,51:v,52:x,53:b,54:w,55:k,56:T,57:E,58:C,59:_,60:S,61:A,62:L,63:N,64:I,65:G,66:U,67:q,68:j,69:Y,70:W,71:H,72:V,73:X,74:K},{13:71,19:20,20:21,21:22,22:t,23:r,24:$,26:F,28:z,29:49,30:61,32:62,34:n,36:i,37:a,38:s,39:o,40:l,41:h,43:23,44:u,45:d,46:p,47:g,48:f,49:m,50:y,51:v,52:x,53:b,54:w,55:k,56:T,57:E,58:C,59:_,60:S,61:A,62:L,63:N,64:I,65:G,66:U,67:q,68:j,69:Y,70:W,71:H,72:V,73:X,74:K},{13:72,19:20,20:21,21:22,22:t,23:r,24:$,26:F,28:z,29:49,30:61,32:62,34:n,36:i,37:a,38:s,39:o,40:l,41:h,43:23,44:u,45:d,46:p,47:g,48:f,49:m,50:y,51:v,52:x,53:b,54:w,55:k,56:T,57:E,58:C,59:_,60:S,61:A,62:L,63:N,64:I,65:G,66:U,67:q,68:j,69:Y,70:W,71:H,72:V,73:X,74:K},{13:73,19:20,20:21,21:22,22:t,23:r,24:$,26:F,28:z,29:49,30:61,32:62,34:n,36:i,37:a,38:s,39:o,40:l,41:h,43:23,44:u,45:d,46:p,47:g,48:f,49:m,50:y,51:v,52:x,53:b,54:w,55:k,56:T,57:E,58:C,59:_,60:S,61:A,62:L,63:N,64:I,65:G,66:U,67:q,68:j,69:Y,70:W,71:H,72:V,73:X,74:K},{14:[1,74]},e(Z,[2,13],{43:23,29:49,30:61,32:62,20:75,34:n,36:i,37:a,38:s,39:o,40:l,41:h,44:u,45:d,46:p,47:g,48:f,49:m,50:y,51:v,52:x,53:b,54:w,55:k,56:T,57:E,58:C,59:_,60:S,61:A,62:L,63:N,64:I,65:G,66:U,67:q,68:j,69:Y,70:W,71:H,72:V,73:X,74:K}),e(Z,[2,14]),e(Q,[2,16],{12:[1,76]}),e(Z,[2,36],{12:[1,77]}),e(J,[2,19]),e(J,[2,20]),{25:[1,78]},{27:[1,79]},e(J,[2,23]),{35:80,75:81,76:R,77:M,79:D,80:O},{35:86,75:81,76:R,77:M,79:D,80:O},{35:87,75:81,76:R,77:M,79:D,80:O},{35:88,75:81,76:R,77:M,79:D,80:O},{35:89,75:81,76:R,77:M,79:D,80:O},{35:90,75:81,76:R,77:M,79:D,80:O},{35:91,75:81,76:R,77:M,79:D,80:O},{35:92,75:81,76:R,77:M,79:D,80:O},{35:93,75:81,76:R,77:M,79:D,80:O},{35:94,75:81,76:R,77:M,79:D,80:O},{35:95,75:81,76:R,77:M,79:D,80:O},{35:96,75:81,76:R,77:M,79:D,80:O},{35:97,75:81,76:R,77:M,79:D,80:O},{35:98,75:81,76:R,77:M,79:D,80:O},{35:99,75:81,76:R,77:M,79:D,80:O},{35:100,75:81,76:R,77:M,79:D,80:O},{35:101,75:81,76:R,77:M,79:D,80:O},{35:102,75:81,76:R,77:M,79:D,80:O},{35:103,75:81,76:R,77:M,79:D,80:O},{35:104,75:81,76:R,77:M,79:D,80:O},e(P,[2,59]),{35:105,75:81,76:R,77:M,79:D,80:O},{35:106,75:81,76:R,77:M,79:D,80:O},{35:107,75:81,76:R,77:M,79:D,80:O},{35:108,75:81,76:R,77:M,79:D,80:O},{35:109,75:81,76:R,77:M,79:D,80:O},{35:110,75:81,76:R,77:M,79:D,80:O},{35:111,75:81,76:R,77:M,79:D,80:O},{35:112,75:81,76:R,77:M,79:D,80:O},{35:113,75:81,76:R,77:M,79:D,80:O},{35:114,75:81,76:R,77:M,79:D,80:O},{35:115,75:81,76:R,77:M,79:D,80:O},{20:116,29:49,30:61,32:62,34:n,36:i,37:a,38:s,39:o,40:l,41:h,43:23,44:u,45:d,46:p,47:g,48:f,49:m,50:y,51:v,52:x,53:b,54:w,55:k,56:T,57:E,58:C,59:_,60:S,61:A,62:L,63:N,64:I,65:G,66:U,67:q,68:j,69:Y,70:W,71:H,72:V,73:X,74:K},{12:[1,118],33:[1,117]},{35:119,75:81,76:R,77:M,79:D,80:O},{35:120,75:81,76:R,77:M,79:D,80:O},{35:121,75:81,76:R,77:M,79:D,80:O},{35:122,75:81,76:R,77:M,79:D,80:O},{35:123,75:81,76:R,77:M,79:D,80:O},{35:124,75:81,76:R,77:M,79:D,80:O},{35:125,75:81,76:R,77:M,79:D,80:O},{14:[1,126]},{14:[1,127]},{14:[1,128]},{14:[1,129]},{1:[2,8]},e(Z,[2,15]),e(Q,[2,17],{21:22,19:130,22:t,23:r,24:$,26:F,28:z}),e(Z,[2,37],{19:20,20:21,21:22,43:23,29:49,30:61,32:62,13:131,22:t,23:r,24:$,26:F,28:z,34:n,36:i,37:a,38:s,39:o,40:l,41:h,44:u,45:d,46:p,47:g,48:f,49:m,50:y,51:v,52:x,53:b,54:w,55:k,56:T,57:E,58:C,59:_,60:S,61:A,62:L,63:N,64:I,65:G,66:U,67:q,68:j,69:Y,70:W,71:H,72:V,73:X,74:K}),e(J,[2,21]),e(J,[2,22]),e(P,[2,39]),e(ee,[2,71],{75:81,35:132,76:R,77:M,79:D,80:O}),e(te,[2,73]),{78:[1,133]},e(te,[2,75]),e(te,[2,76]),e(P,[2,40]),e(P,[2,41]),e(P,[2,42]),e(P,[2,43]),e(P,[2,44]),e(P,[2,45]),e(P,[2,46]),e(P,[2,47]),e(P,[2,48]),e(P,[2,49]),e(P,[2,50]),e(P,[2,51]),e(P,[2,52]),e(P,[2,53]),e(P,[2,54]),e(P,[2,55]),e(P,[2,56]),e(P,[2,57]),e(P,[2,58]),e(P,[2,60]),e(P,[2,61]),e(P,[2,62]),e(P,[2,63]),e(P,[2,64]),e(P,[2,65]),e(P,[2,66]),e(P,[2,67]),e(P,[2,68]),e(P,[2,69]),e(P,[2,70]),{31:134,42:[1,135]},{12:[1,136]},{33:[1,137]},e(re,[2,28]),e(re,[2,29]),e(re,[2,30]),e(re,[2,31]),e(re,[2,32]),e(re,[2,33]),e(re,[2,34]),{1:[2,9]},{1:[2,10]},{1:[2,11]},{1:[2,12]},e(Q,[2,18]),e(Z,[2,38]),e(ee,[2,72]),e(te,[2,74]),e(P,[2,24]),e(P,[2,35]),e(ne,[2,25]),e(ne,[2,26],{12:[1,138]}),e(ne,[2,27])],defaultActions:{2:[2,1],3:[2,2],4:[2,7],5:[2,3],6:[2,4],7:[2,5],8:[2,6],74:[2,8],126:[2,9],127:[2,10],128:[2,11],129:[2,12]},parseError:mt(function(e,t){var r;if(!t.recoverable)throw(r=new Error(e)).hash=t,r;this.trace(e)},"parseError"),parse:mt(function(e){var t,r=this,n=[0],i=[],a=[null],s=[],o=this.table,l="",c=0,h=0,u=0,d=1,p=s.slice.call(arguments,1),g=Object.create(this.lexer),f={yy:{}};for(t in this.yy)Object.prototype.hasOwnProperty.call(this.yy,t)&&(f.yy[t]=this.yy[t]);g.setInput(e,f.yy),f.yy.lexer=g,f.yy.parser=this,"u"t[0].length)){if(t=r,n=a,this.options.backtrack_lexer){if(!1!==(e=this.test_match(r,i[a])))return e;if(this._backtrack){t=!1;continue}return!1}if(!this.options.flex)break}return t?!1!==(e=this.test_match(t,i[n]))&&e:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text.
+`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:mt(function(){return this.next()||this.lex()},"lex"),begin:mt(function(e){this.conditionStack.push(e)},"begin"),popState:mt(function(){return 0{e(),Xc=mt(function(e,t){for(var r of t)e.attr(r[0],r[1])},"d3Attrs"),Kc=mt(function(e,t,r){var n=new Map;return r?(n.set("width","100%"),n.set("style",`max-width: ${t}px;`)):(n.set("height",e),n.set("width",t)),n},"calculateSvgSizeAttrs"),Zc=mt(function(e,t,r,n){t=Kc(t,r,n),Xc(e,t)},"configureSvgSize"),Qc=mt(function(e,t,r,n){var i=t.node().getBBox(),a=i.width,s=(D.info(`SVG bounds: ${a}x`+(s=i.height),i),D.info("Graph bounds: 0x0",e),D.info(`Calculated bounds: ${e=a+2*r}x`+(a=s+2*r)),Zc(t,a,e,n),`${i.x-r} ${i.y-r} ${i.width+2*r} `+(i.height+2*r));t.attr("viewBox",s)},"setupGraphViewbox")}),ch=b(()=>{e(),Jc={},eh=mt((e,t,r)=>{let n="";return e in Jc&&Jc[e]?n=Jc[e](r):D.warn("No theme found for "+e),` & {
+ font-family: ${r.fontFamily};
+ font-size: ${r.fontSize};
+ fill: ${r.textColor}
+ }
+ @keyframes edge-animation-frame {
+ from {
+ stroke-dashoffset: 0;
+ }
+ }
+ @keyframes dash {
+ to {
+ stroke-dashoffset: 0;
+ }
+ }
+ & .edge-animation-slow {
+ stroke-dasharray: 9,5 !important;
+ stroke-dashoffset: 900;
+ animation: dash 50s linear infinite;
+ stroke-linecap: round;
+ }
+ & .edge-animation-fast {
+ stroke-dasharray: 9,5 !important;
+ stroke-dashoffset: 900;
+ animation: dash 20s linear infinite;
+ stroke-linecap: round;
+ }
+ /* Classes common for multiple diagrams */
+
+ & .error-icon {
+ fill: ${r.errorBkgColor};
+ }
+ & .error-text {
+ fill: ${r.errorTextColor};
+ stroke: ${r.errorTextColor};
+ }
+
+ & .edge-thickness-normal {
+ stroke-width: 1px;
+ }
+ & .edge-thickness-thick {
+ stroke-width: 3.5px
+ }
+ & .edge-pattern-solid {
+ stroke-dasharray: 0;
+ }
+ & .edge-thickness-invisible {
+ stroke-width: 0;
+ fill: none;
+ }
+ & .edge-pattern-dashed{
+ stroke-dasharray: 3;
+ }
+ .edge-pattern-dotted {
+ stroke-dasharray: 2;
+ }
+
+ & .marker {
+ fill: ${r.lineColor};
+ stroke: ${r.lineColor};
+ }
+ & .marker.cross {
+ stroke: ${r.lineColor};
+ }
+
+ & svg {
+ font-family: ${r.fontFamily};
+ font-size: ${r.fontSize};
+ }
+ & p {
+ margin: 0
+ }
+
+ ${n}
+
+ ${t}
+`},"getStyles"),th=mt((e,t)=>{void 0!==t&&(Jc[e]=t)},"addStylesForDiagram"),rh=eh}),hh={};OFe(hh,{clear:()=>fh,getAccDescription:()=>xh,getAccTitle:()=>yh,getDiagramTitle:()=>wh,setAccDescription:()=>vh,setAccTitle:()=>mh,setDiagramTitle:()=>bh});var uh,dh,ph,gh,fh,mh,yh,vh,xh,bh,wh,kh,Th,O,Eh,Ch,_h,Sh,Ah,Lh,Nh,Ih,Rh,Mh,Dh,Oh,Ph,Bh,$h,Fh,zh,Gh,Uh,qh,jh,Yh,Wh,Hh,Vh,Xh,Kh,Zh,Qh,Jh,eu,tu,ru,nu,iu,au,su,ou,lu,cu,hu,uu,du,pu,gu,fu,mu,yu,vu,xu,bu,wu,ku=b(()=>{Oc(),rn(),ph=dh=uh="",gh=mt(e=>lc(e,ar()),"sanitizeText"),fh=mt(()=>{dh=ph=uh=""},"clear"),mh=mt(e=>{uh=gh(e).replace(/^\s+/g,"")},"setAccTitle"),yh=mt(()=>uh,"getAccTitle"),vh=mt(e=>{ph=gh(e).replace(/\n\s+/g,`
+`)},"setAccDescription"),xh=mt(()=>ph,"getAccDescription"),bh=mt(e=>{dh=gh(e)},"setDiagramTitle"),wh=mt(()=>dh,"getDiagramTitle")}),Tu=b(()=>{sh(),e(),rn(),Oc(),lh(),ch(),ku(),kh=D,Th=Ie,O=ar,Eh=ir,Ch=Vt,_h=mt(e=>lc(e,O()),"sanitizeText"),Sh=Qc,Ah=mt(()=>hh,"getCommonDb"),Lh={},Nh=mt((e,t,r)=>{Lh[e]&&kh.warn(`Diagram with id ${e} already registered. Overwriting.`),Lh[e]=t,r&&Yc(e,r),th(e,t.styles),t.injectUtils?.(kh,Th,O,_h,Sh,Ah(),()=>{})},"registerDiagram"),Ih=mt(e=>{if(e in Lh)return Lh[e];throw new Rh(e)},"getDiagram"),Rh=class extends Error{static{mt(this,"DiagramNotFoundError")}constructor(e){super(`Diagram ${e} not found.`)}}}),Eu=b(()=>{Tu(),Oc(),ku(),Mh=[],Dh=[""],Bh=[{alias:Oh="global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:Ph=""}],Fh="",zh=!($h=[]),Gh=4,Uh=2,jh=mt(function(){return qh},"getC4Type"),Yh=mt(function(e){qh=lc(e,O())},"setC4Type"),Wh=mt(function(r,n,i,a,s,o,l,c,h){if(null!=r&&null!=n&&null!=i&&null!=a){let e={},t=$h.find(e=>e.from===n&&e.to===i);t?e=t:$h.push(e),e.type=r,e.from=n,e.to=i,e.label={text:a},null==s?e.techn={text:""}:"object"==typeof s?([r,a]=Object.entries(s)[0],e[r]={text:a}):e.techn={text:s},null==o?e.descr={text:""}:"object"==typeof o?([r,a]=Object.entries(o)[0],e[r]={text:a}):e.descr={text:o},"object"==typeof l?([s,r]=Object.entries(l)[0],e[s]=r):e.sprite=l,"object"==typeof c?([a,o]=Object.entries(c)[0],e[a]=o):e.tags=c,"object"==typeof h?([s,r]=Object.entries(h)[0],e[s]=r):e.link=h,e.wrap=fu()}},"addRel"),Hh=mt(function(r,n,i,a,s,o,l){if(null!==n&&null!==i){let e={},t=Mh.find(e=>e.alias===n);var c;t&&n===t.alias?e=t:(e.alias=n,Mh.push(e)),e.label=null==i?{text:""}:{text:i},null==a?e.descr={text:""}:"object"==typeof a?([i,c]=Object.entries(a)[0],e[i]={text:c}):e.descr={text:a},"object"==typeof s?([i,c]=Object.entries(s)[0],e[i]=c):e.sprite=s,"object"==typeof o?([a,i]=Object.entries(o)[0],e[a]=i):e.tags=o,"object"==typeof l?([c,s]=Object.entries(l)[0],e[c]=s):e.link=l,e.typeC4Shape={text:r},e.parentBoundary=Oh,e.wrap=fu()}},"addPersonOrSystem"),Vh=mt(function(r,n,i,a,s,o,l,c){if(null!==n&&null!==i){let e={},t=Mh.find(e=>e.alias===n);var h;t&&n===t.alias?e=t:(e.alias=n,Mh.push(e)),e.label=null==i?{text:""}:{text:i},null==a?e.techn={text:""}:"object"==typeof a?([i,h]=Object.entries(a)[0],e[i]={text:h}):e.techn={text:a},null==s?e.descr={text:""}:"object"==typeof s?([i,h]=Object.entries(s)[0],e[i]={text:h}):e.descr={text:s},"object"==typeof o?([a,i]=Object.entries(o)[0],e[a]=i):e.sprite=o,"object"==typeof l?([h,s]=Object.entries(l)[0],e[h]=s):e.tags=l,"object"==typeof c?([a,i]=Object.entries(c)[0],e[a]=i):e.link=c,e.wrap=fu(),e.typeC4Shape={text:r},e.parentBoundary=Oh}},"addContainer"),Xh=mt(function(r,n,i,a,s,o,l,c){if(null!==n&&null!==i){let e={},t=Mh.find(e=>e.alias===n);var h;t&&n===t.alias?e=t:(e.alias=n,Mh.push(e)),e.label=null==i?{text:""}:{text:i},null==a?e.techn={text:""}:"object"==typeof a?([i,h]=Object.entries(a)[0],e[i]={text:h}):e.techn={text:a},null==s?e.descr={text:""}:"object"==typeof s?([i,h]=Object.entries(s)[0],e[i]={text:h}):e.descr={text:s},"object"==typeof o?([a,i]=Object.entries(o)[0],e[a]=i):e.sprite=o,"object"==typeof l?([h,s]=Object.entries(l)[0],e[h]=s):e.tags=l,"object"==typeof c?([a,i]=Object.entries(c)[0],e[a]=i):e.link=c,e.wrap=fu(),e.typeC4Shape={text:r},e.parentBoundary=Oh}},"addComponent"),Kh=mt(function(r,n,i,a,s){if(null!==r&&null!==n){let e={},t=Bh.find(e=>e.alias===r);var o;t&&r===t.alias?e=t:(e.alias=r,Bh.push(e)),e.label=null==n?{text:""}:{text:n},null==i?e.type={text:"system"}:"object"==typeof i?([n,o]=Object.entries(i)[0],e[n]={text:o}):e.type={text:i},"object"==typeof a?([n,o]=Object.entries(a)[0],e[n]=o):e.tags=a,"object"==typeof s?([i,n]=Object.entries(s)[0],e[i]=n):e.link=s,e.parentBoundary=Oh,e.wrap=fu(),Ph=Oh,Oh=r,Dh.push(Ph)}},"addPersonOrSystemBoundary"),Zh=mt(function(r,n,i,a,s){if(null!==r&&null!==n){let e={},t=Bh.find(e=>e.alias===r);var o;t&&r===t.alias?e=t:(e.alias=r,Bh.push(e)),e.label=null==n?{text:""}:{text:n},null==i?e.type={text:"container"}:"object"==typeof i?([n,o]=Object.entries(i)[0],e[n]={text:o}):e.type={text:i},"object"==typeof a?([n,o]=Object.entries(a)[0],e[n]=o):e.tags=a,"object"==typeof s?([i,n]=Object.entries(s)[0],e[i]=n):e.link=s,e.parentBoundary=Oh,e.wrap=fu(),Ph=Oh,Oh=r,Dh.push(Ph)}},"addContainerBoundary"),Qh=mt(function(r,n,i,a,s,e,o,l){if(null!==n&&null!==i){let e={},t=Bh.find(e=>e.alias===n);var c;t&&n===t.alias?e=t:(e.alias=n,Bh.push(e)),e.label=null==i?{text:""}:{text:i},null==a?e.type={text:"node"}:"object"==typeof a?([i,c]=Object.entries(a)[0],e[i]={text:c}):e.type={text:a},null==s?e.descr={text:""}:"object"==typeof s?([i,c]=Object.entries(s)[0],e[i]={text:c}):e.descr={text:s},"object"==typeof o?([a,i]=Object.entries(o)[0],e[a]=i):e.tags=o,"object"==typeof l?([c,s]=Object.entries(l)[0],e[c]=s):e.link=l,e.nodeType=r,e.parentBoundary=Oh,e.wrap=fu(),Ph=Oh,Oh=n,Dh.push(Ph)}},"addDeploymentNode"),Jh=mt(function(){Oh=Ph,Dh.pop(),Ph=Dh.pop(),Dh.push(Ph)},"popBoundaryParseStack"),eu=mt(function(e,t,r,n,i,a,s,o,l,c,h){let u=Mh.find(e=>e.alias===t);var d,p;void 0===u&&void 0===(u=Bh.find(e=>e.alias===t))||(null!=r&&("object"==typeof r?([p,d]=Object.entries(r)[0],u[p]=d):u.bgColor=r),null!=n&&("object"==typeof n?([p,d]=Object.entries(n)[0],u[p]=d):u.fontColor=n),null!=i&&("object"==typeof i?([r,p]=Object.entries(i)[0],u[r]=p):u.borderColor=i),null!=a&&("object"==typeof a?([d,n]=Object.entries(a)[0],u[d]=n):u.shadowing=a),null!=s&&("object"==typeof s?([r,p]=Object.entries(s)[0],u[r]=p):u.shape=s),null!=o&&("object"==typeof o?([i,d]=Object.entries(o)[0],u[i]=d):u.sprite=o),null!=l&&("object"==typeof l?([n,a]=Object.entries(l)[0],u[n]=a):u.techn=l),null!=c&&("object"==typeof c?([r,p]=Object.entries(c)[0],u[r]=p):u.legendText=c),null!=h&&("object"==typeof h?([s,i]=Object.entries(h)[0],u[s]=i):u.legendSprite=h))},"updateElStyle"),tu=mt(function(e,t,r,n,i,a,s){var o,l,c=$h.find(e=>e.from===t&&e.to===r);void 0!==c&&(null!=n&&("object"==typeof n?([o,l]=Object.entries(n)[0],c[o]=l):c.textColor=n),null!=i&&("object"==typeof i?([o,l]=Object.entries(i)[0],c[o]=l):c.lineColor=i),null!=a&&("object"==typeof a?([n,o]=Object.entries(a)[0],c[n]=parseInt(o)):c.offsetX=parseInt(a)),null!=s)&&("object"==typeof s?([l,i]=Object.entries(s)[0],c[l]=parseInt(i)):c.offsetY=parseInt(s))},"updateRelStyle"),ru=mt(function(e,t,r){var t="object"==typeof t?(n=Object.values(t)[0],parseInt(n)):parseInt(t),n="object"==typeof r?(n=Object.values(r)[0],parseInt(n)):parseInt(r);1<=t&&(Gh=t),1<=n&&(Uh=n)},"updateLayoutConfig"),nu=mt(function(){return Gh},"getC4ShapeInRow"),iu=mt(function(){return Uh},"getC4BoundaryInRow"),au=mt(function(){return Oh},"getCurrentBoundaryParse"),su=mt(function(){return Ph},"getParentBoundaryParse"),ou=mt(function(t){return null==t?Mh:Mh.filter(e=>e.parentBoundary===t)},"getC4ShapeArray"),lu=mt(function(t){return Mh.find(e=>e.alias===t)},"getC4Shape"),cu=mt(function(e){return Object.keys(ou(e))},"getC4ShapeKeys"),hu=mt(function(t){return null==t?Bh:Bh.filter(e=>e.parentBoundary===t)},"getBoundaries"),uu=hu,du=mt(function(){return $h},"getRels"),pu=mt(function(){return Fh},"getTitle"),gu=mt(function(e){zh=e},"setWrap"),fu=mt(function(){return zh},"autoWrap"),mu=mt(function(){Mh=[],Bh=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],Oh="global",Dh=[Ph=""],Dh=[Fh=""],zh=!($h=[]),Gh=4,Uh=2},"clear"),yu={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25},vu={FILLED:0,OPEN:1},xu={LEFTOF:0,RIGHTOF:1,OVER:2},bu=mt(function(e){Fh=lc(e,O())},"setTitle"),wu={addPersonOrSystem:Hh,addPersonOrSystemBoundary:Kh,addContainer:Vh,addContainerBoundary:Zh,addComponent:Xh,addDeploymentNode:Qh,popBoundaryParseStack:Jh,addRel:Wh,updateElStyle:eu,updateRelStyle:tu,updateLayoutConfig:ru,autoWrap:fu,setWrap:gu,getC4ShapeArray:ou,getC4Shape:lu,getC4ShapeKeys:cu,getBoundaries:hu,getBoundarys:uu,getCurrentBoundaryParse:au,getParentBoundaryParse:su,getRels:du,getTitle:pu,getC4Type:jh,getC4ShapeInRow:nu,getC4BoundaryInRow:iu,setAccTitle:mh,getAccTitle:yh,getAccDescription:xh,setAccDescription:vh,getConfig:mt(()=>O().c4,"getConfig"),clear:mu,LINETYPE:yu,ARROWTYPE:vu,PLACEMENT:xu,setTitle:bu,setC4Type:Yh}});function Cu(e,t){return null==e||null==t?NaN:e{mt(Cu,"ascending")});function Su(e,t){return null==e||null==t?NaN:t{mt(Su,"descending")});function Lu(r){let a,s,i;function o(e,t,r=0,n=e.length){if(r>>1}while(s(e[i],t)<0?r=1+i:n=i,r>>1}while(s(e[i],t)<=0?r=1+i:n=i,r-i(e[n],t)?n-1:n}return i=2!==r.length?(a=Cu,s=mt((e,t)=>Cu(r(e),t),"compare2"),mt((e,t)=>r(e)-t,"delta")):(a=r===Cu||r===Su?r:Nu,s=r),mt(o,"left"),mt(e,"right"),mt(t,"center"),{left:o,center:t,right:e}}function Nu(){return 0}var Iu=b(()=>{_u(),Au(),mt(Lu,"bisector"),mt(Nu,"zero")});function Ru(e){return null===e?NaN:+e}var Mu,Du,Ou=b(()=>{mt(Ru,"number")}),Pu=b(()=>{_u(),Iu(),Ou(),Mu=Lu(Cu).right,Lu(Ru).center,Du=Mu});function Bu({_intern:e,_key:t},r){return t=t(r),e.has(t)?e.get(t):r}function $u({_intern:e,_key:t},r){return t=t(r),e.has(t)?e.get(t):(e.set(t,r),r)}function Fu({_intern:e,_key:t},r){return t=t(r),e.has(t)&&(r=e.get(t),e.delete(t)),r}function zu(e){return null!==e&&"object"==typeof e?e.valueOf():e}var Gu,Uu=b(()=>{Gu=class extends Map{static{mt(this,"InternMap")}constructor(e,t=zu){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:t}}),null!=e)for(var[r,n]of e)this.set(r,n)}get(e){return super.get(Bu(this,e))}has(e){return super.has(Bu(this,e))}set(e,t){return super.set($u(this,e),t)}delete(e){return super.delete(Fu(this,e))}},mt(Bu,"intern_get"),mt($u,"intern_set"),mt(Fu,"intern_delete"),mt(zu,"keyof")});function qu(e,t,r){let n=(t-e)/Math.max(0,r),i=Math.floor(Math.log10(n)),a=n/Math.pow(10,i),s=Hu<=a?10:Vu<=a?5:Xu<=a?2:1,o,l,c;return i<0?(c=Math.pow(10,-i)/s,o=Math.round(e*c),l=Math.round(t*c),o/ct&&--l,c=-c):(c=Math.pow(10,i)*s,o=Math.round(e/c),l=Math.round(t/c),o*ct&&--l),l{Hu=Math.sqrt(50),Vu=Math.sqrt(10),Xu=Math.sqrt(2),mt(qu,"tickSpec"),mt(ju,"ticks"),mt(Yu,"tickIncrement"),mt(Wu,"tickStep")});function Zu(t,r){let n;if(void 0===r)for(var e of t)null!=e&&(n{mt(Zu,"max")});function Ju(t,r){let n;if(void 0===r)for(var e of t)null!=e&&(n>e||void 0===n&&e<=e)&&(n=e);else{let e=-1;for(var i of t)null!=(i=r(i,++e,t))&&(n>i||void 0===n&&i<=i)&&(n=i)}return n}var ed=b(()=>{mt(Ju,"min")});function td(e,t,r){e=+e,t=+t,r=(i=arguments.length)<2?(t=e,e=0,1):i<3?1:+r;for(var n=-1,i=0|Math.max(0,Math.ceil((t-e)/r)),a=new Array(i);++n{mt(td,"range")}),nd=b(()=>{Pu(),Iu(),Qu(),ed(),rd(),Ku(),Uu()});function id(e){return e}var ad=b(()=>{mt(id,"default")});function sd(e){return"translate("+e+",0)"}function od(e){return"translate(0,"+e+")"}function ld(t){return e=>+t(e)}function cd(t,r){return r=Math.max(0,t.bandwidth()-2*r)/2,t.round()&&(r=Math.round(r)),e=>+t(e)+r}function hd(){return!this.__axis}function ud(p,g){var f=[],m=null,y=null,v=6,x=6,b=3,w=typeof window<"u"&&1{ad(),gd=1,fd=3,mt(sd,"translateX"),mt(od,"translateY"),mt(ld,"number"),mt(cd,"center"),mt(hd,"entering"),mt(ud,"axis"),mt(dd,"axisTop"),mt(pd,"axisBottom")}),yd=b(()=>{md()});function vd(){for(var e,t=0,r=arguments.length,n={};t{Td={value:mt(()=>{},"value")},mt(vd,"dispatch"),mt(xd,"Dispatch"),mt(bd,"parseTypenames"),xd.prototype=vd.prototype={constructor:xd,on:mt(function(e,t){var r,n=this._,i=bd(e+"",n),a=-1,s=i.length;if(!(arguments.length<2)){if(null!=t&&"function"!=typeof t)throw new Error("invalid callback: "+t);for(;++a{Sd()}),Ld=b(()=>{_d={svg:"http://www.w3.org/2000/svg",xhtml:Cd="http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"}});function Nd(e){var t=e+="",r=t.indexOf(":");return 0<=r&&"xmlns"!==(t=e.slice(0,r))&&(e=e.slice(r+1)),_d.hasOwnProperty(t)?{space:_d[t],local:e}:e}var Id=b(()=>{Ld(),mt(Nd,"default")});function Rd(r){return function(){var e=this.ownerDocument,t=this.namespaceURI;return t===Cd&&e.documentElement.namespaceURI===Cd?e.createElement(r):e.createElementNS(t,r)}}function Md(e){return function(){return this.ownerDocument.createElementNS(e.space,e.local)}}function Dd(e){return((e=Nd(e)).local?Md:Rd)(e)}var Od=b(()=>{Id(),Ld(),mt(Rd,"creatorInherit"),mt(Md,"creatorFixed"),mt(Dd,"default")});function Pd(){}function Bd(e){return null==e?Pd:function(){return this.querySelector(e)}}var $d=b(()=>{mt(Pd,"none"),mt(Bd,"default")});function Fd(e){"function"!=typeof e&&(e=Bd(e));for(var t=this._groups,r=t.length,n=new Array(r),i=0;i{yg(),$d(),mt(Fd,"default")});function Gd(e){return null==e?[]:Array.isArray(e)?e:Array.from(e)}var Ud=b(()=>{mt(Gd,"array")});function qd(){return[]}function jd(e){return null==e?qd:function(){return this.querySelectorAll(e)}}var Yd=b(()=>{mt(qd,"empty"),mt(jd,"default")});function Wd(e){return function(){return Gd(e.apply(this,arguments))}}function Hd(e){e=("function"==typeof e?Wd:jd)(e);for(var t=this._groups,r=t.length,n=[],i=[],a=0;a{yg(),Ud(),Yd(),mt(Wd,"arrayAll"),mt(Hd,"default")});function Xd(e){return function(){return this.matches(e)}}function Kd(t){return function(e){return e.matches(t)}}var Zd=b(()=>{mt(Xd,"default"),mt(Kd,"childMatcher")});function Qd(e){return function(){return tp.call(this.children,e)}}function Jd(){return this.firstElementChild}function ep(e){return this.select(null==e?Jd:Qd("function"==typeof e?e:Kd(e)))}var tp,rp=b(()=>{Zd(),tp=Array.prototype.find,mt(Qd,"childFind"),mt(Jd,"childFirst"),mt(ep,"default")});function np(){return Array.from(this.children)}function ip(e){return function(){return sp.call(this.children,e)}}function ap(e){return this.selectAll(null==e?np:ip("function"==typeof e?e:Kd(e)))}var sp,op=b(()=>{Zd(),sp=Array.prototype.filter,mt(np,"children"),mt(ip,"childrenFilter"),mt(ap,"default")});function lp(e){"function"!=typeof e&&(e=Xd(e));for(var t=this._groups,r=t.length,n=new Array(r),i=0;i{yg(),Zd(),mt(lp,"default")});function hp(e){return new Array(e.length)}var up=b(()=>{mt(hp,"default")});function dp(){return new dg(this._enter||this._groups.map(hp),this._parents)}function pp(e,t){this.ownerDocument=e.ownerDocument,this.namespaceURI=e.namespaceURI,this._next=null,this._parent=e,this.__data__=t}var gp=b(()=>{up(),yg(),mt(dp,"default"),mt(pp,"EnterNode"),pp.prototype={constructor:pp,appendChild:mt(function(e){return this._parent.insertBefore(e,this._next)},"appendChild"),insertBefore:mt(function(e,t){return this._parent.insertBefore(e,t)},"insertBefore"),querySelector:mt(function(e){return this._parent.querySelector(e)},"querySelector"),querySelectorAll:mt(function(e){return this._parent.querySelectorAll(e)},"querySelectorAll")}});function fp(e){return function(){return e}}var mp=b(()=>{mt(fp,"default")});function yp(e,t,r,n,i,a){for(var s,o=0,l=t.length,c=a.length;o{yg(),gp(),mp(),mt(yp,"bindIndex"),mt(vp,"bindKey"),mt(xp,"datum"),mt(bp,"default"),mt(wp,"arraylike")});function Tp(){return new dg(this._exit||this._groups.map(hp),this._parents)}var Ep=b(()=>{up(),yg(),mt(Tp,"default")});function Cp(e,t,r){var n=this.enter(),i=this,a=this.exit(),n="function"==typeof e?(n=e(n))&&n.selection():n.append(e+"");return null!=t&&(i=(i=t(i))&&i.selection()),null==r?a.remove():r(a),n&&i?n.merge(i).order():i}var _p=b(()=>{mt(Cp,"default")});function Sp(e){for(var e=e.selection?e.selection():e,t=this._groups,r=e._groups,n=t.length,e=r.length,i=Math.min(n,e),a=new Array(n),s=0;s{yg(),mt(Sp,"default")});function Lp(){for(var e=this._groups,t=-1,r=e.length;++t{mt(Lp,"default")});function Ip(r){function e(e,t){return e&&t?r(e.__data__,t.__data__):!e-!t}r=r||Rp,mt(e,"compareNode");for(var t=this._groups,n=t.length,i=new Array(n),a=0;a{yg(),mt(Ip,"default"),mt(Rp,"ascending")});function Dp(){var e=arguments[0];return arguments[0]=this,e.apply(null,arguments),this}var Op=b(()=>{mt(Dp,"default")});function Pp(){return Array.from(this)}var Bp=b(()=>{mt(Pp,"default")});function $p(){for(var e=this._groups,t=0,r=e.length;t{mt($p,"default")});function zp(){let e=0;for(var t of this)++e;return e}var Gp=b(()=>{mt(zp,"default")});function Up(){return!this.node()}var qp=b(()=>{mt(Up,"default")});function jp(e){for(var t=this._groups,r=0,n=t.length;r{mt(jp,"default")});function Wp(e){return function(){this.removeAttribute(e)}}function Hp(e){return function(){this.removeAttributeNS(e.space,e.local)}}function Vp(e,t){return function(){this.setAttribute(e,t)}}function Xp(e,t){return function(){this.setAttributeNS(e.space,e.local,t)}}function Kp(t,r){return function(){var e=r.apply(this,arguments);null==e?this.removeAttribute(t):this.setAttribute(t,e)}}function Zp(t,r){return function(){var e=r.apply(this,arguments);null==e?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,e)}}function Qp(e,t){var r,e=Nd(e);return arguments.length<2?(r=this.node(),e.local?r.getAttributeNS(e.space,e.local):r.getAttribute(e)):this.each((null==t?e.local?Hp:Wp:"function"==typeof t?e.local?Zp:Kp:e.local?Xp:Vp)(e,t))}var Jp=b(()=>{Id(),mt(Wp,"attrRemove"),mt(Hp,"attrRemoveNS"),mt(Vp,"attrConstant"),mt(Xp,"attrConstantNS"),mt(Kp,"attrFunction"),mt(Zp,"attrFunctionNS"),mt(Qp,"default")});function e0(e){return e.ownerDocument&&e.ownerDocument.defaultView||e.document&&e||e.defaultView}var t0=b(()=>{mt(e0,"default")});function r0(e){return function(){this.style.removeProperty(e)}}function n0(e,t,r){return function(){this.style.setProperty(e,t,r)}}function i0(t,r,n){return function(){var e=r.apply(this,arguments);null==e?this.style.removeProperty(t):this.style.setProperty(t,e,n)}}function a0(e,t,r){return 1{t0(),mt(r0,"styleRemove"),mt(n0,"styleConstant"),mt(i0,"styleFunction"),mt(a0,"default"),mt(s0,"styleValue")});function l0(e){return function(){delete this[e]}}function c0(e,t){return function(){this[e]=t}}function h0(t,r){return function(){var e=r.apply(this,arguments);null==e?delete this[t]:this[t]=e}}function u0(e,t){return 1{mt(l0,"propertyRemove"),mt(c0,"propertyConstant"),mt(h0,"propertyFunction"),mt(u0,"default")});function p0(e){return e.trim().split(/^|\s+/)}function g0(e){return e.classList||new f0(e)}function f0(e){this._node=e,this._names=p0(e.getAttribute("class")||"")}function m0(e,t){for(var r=g0(e),n=-1,i=t.length;++n{mt(p0,"classArray"),mt(g0,"classList"),mt(f0,"ClassList"),f0.prototype={add:mt(function(e){this._names.indexOf(e)<0&&(this._names.push(e),this._node.setAttribute("class",this._names.join(" ")))},"add"),remove:mt(function(e){0<=(e=this._names.indexOf(e))&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},"remove"),contains:mt(function(e){return 0<=this._names.indexOf(e)},"contains")},mt(m0,"classedAdd"),mt(y0,"classedRemove"),mt(v0,"classedTrue"),mt(x0,"classedFalse"),mt(b0,"classedFunction"),mt(w0,"default")});function T0(){this.textContent=""}function E0(e){return function(){this.textContent=e}}function C0(t){return function(){var e=t.apply(this,arguments);this.textContent=e??""}}function _0(e){return arguments.length?this.each(null==e?T0:("function"==typeof e?C0:E0)(e)):this.node().textContent}var S0=b(()=>{mt(T0,"textRemove"),mt(E0,"textConstant"),mt(C0,"textFunction"),mt(_0,"default")});function A0(){this.innerHTML=""}function L0(e){return function(){this.innerHTML=e}}function N0(t){return function(){var e=t.apply(this,arguments);this.innerHTML=e??""}}function I0(e){return arguments.length?this.each(null==e?A0:("function"==typeof e?N0:L0)(e)):this.node().innerHTML}var R0=b(()=>{mt(A0,"htmlRemove"),mt(L0,"htmlConstant"),mt(N0,"htmlFunction"),mt(I0,"default")});function M0(){this.nextSibling&&this.parentNode.appendChild(this)}function D0(){return this.each(M0)}var O0=b(()=>{mt(M0,"raise"),mt(D0,"default")});function P0(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function B0(){return this.each(P0)}var $0=b(()=>{mt(P0,"lower"),mt(B0,"default")});function F0(e){var t="function"==typeof e?e:Dd(e);return this.select(function(){return this.appendChild(t.apply(this,arguments))})}var z0=b(()=>{Od(),mt(F0,"default")});function G0(){return null}function U0(e,t){var r="function"==typeof e?e:Dd(e),n=null==t?G0:"function"==typeof t?t:Bd(t);return this.select(function(){return this.insertBefore(r.apply(this,arguments),n.apply(this,arguments)||null)})}var q0=b(()=>{Od(),$d(),mt(G0,"constantNull"),mt(U0,"default")});function j0(){var e=this.parentNode;e&&e.removeChild(this)}function Y0(){return this.each(j0)}var W0=b(()=>{mt(j0,"remove"),mt(Y0,"default")});function H0(){var e=this.cloneNode(!1),t=this.parentNode;return t?t.insertBefore(e,this.nextSibling):e}function V0(){var e=this.cloneNode(!0),t=this.parentNode;return t?t.insertBefore(e,this.nextSibling):e}function X0(e){return this.select(e?V0:H0)}var K0=b(()=>{mt(H0,"selection_cloneShallow"),mt(V0,"selection_cloneDeep"),mt(X0,"default")});function Z0(e){return arguments.length?this.property("__data__",e):this.node().__data__}var Q0=b(()=>{mt(Z0,"default")});function J0(t){return function(e){t.call(this,e,this.__data__)}}function eg(e){return e.trim().split(/^|\s+/).map(function(e){var t="",r=e.indexOf(".");return 0<=r&&(t=e.slice(r+1),e=e.slice(0,r)),{type:e,name:t}})}function tg(a){return function(){var e=this.__on;if(e){for(var t,r=0,n=-1,i=e.length;r{mt(J0,"contextListener"),mt(eg,"parseTypenames"),mt(tg,"onRemove"),mt(rg,"onAdd"),mt(ng,"default")});function ag(e,t,r){var n=e0(e),i=n.CustomEvent;"function"==typeof i?i=new i(t,r):(i=n.document.createEvent("Event"),r?(i.initEvent(t,r.bubbles,r.cancelable),i.detail=r.detail):i.initEvent(t,!1,!1)),e.dispatchEvent(i)}function sg(e,t){return function(){return ag(this,e,t)}}function og(e,t){return function(){return ag(this,e,t.apply(this,arguments))}}function lg(e,t){return this.each(("function"==typeof t?og:sg)(e,t))}var cg=b(()=>{t0(),mt(ag,"dispatchEvent"),mt(sg,"dispatchConstant"),mt(og,"dispatchFunction"),mt(lg,"default")});function*hg(){for(var e=this._groups,t=0,r=e.length;t