From a8682c33f293d22e3fa4f717649eb6bc0b13bd17 Mon Sep 17 00:00:00 2001 From: sudacode Date: Sun, 15 Feb 2026 02:29:41 -0800 Subject: [PATCH] update docs --- docs/.vitepress/config.ts | 6 ++ docs/anki-integration.md | 2 +- docs/architecture.md | 127 +++++++++-------------- docs/configuration.md | 41 ++++++-- docs/index.md | 52 +++++++--- docs/mining-workflow.md | 41 +++++++- docs/public/apple-touch-icon.png | Bin 0 -> 20117 bytes docs/public/assets/anki-card.svg | 15 +++ docs/public/assets/dual-layer.svg | 15 +++ docs/public/assets/highlight.svg | 13 +++ docs/public/assets/keyboard.svg | 21 ++++ docs/public/assets/mpv.svg | 86 +++++++++++++++ docs/public/assets/subtitle-download.svg | 16 +++ docs/public/assets/texthooker.svg | 19 ++++ docs/public/assets/tokenization.svg | 16 +++ docs/public/assets/video.svg | 12 +++ docs/public/assets/yomitan-icon.svg | 1 + docs/public/favicon-16x16.png | Bin 0 -> 1150 bytes docs/public/favicon-32x32.png | Bin 0 -> 2143 bytes docs/public/favicon.ico | Bin 0 -> 15086 bytes 20 files changed, 380 insertions(+), 103 deletions(-) create mode 100644 docs/public/apple-touch-icon.png create mode 100644 docs/public/assets/anki-card.svg create mode 100644 docs/public/assets/dual-layer.svg create mode 100644 docs/public/assets/highlight.svg create mode 100644 docs/public/assets/keyboard.svg create mode 100644 docs/public/assets/mpv.svg create mode 100644 docs/public/assets/subtitle-download.svg create mode 100644 docs/public/assets/texthooker.svg create mode 100644 docs/public/assets/tokenization.svg create mode 100644 docs/public/assets/video.svg create mode 100644 docs/public/assets/yomitan-icon.svg create mode 100644 docs/public/favicon-16x16.png create mode 100644 docs/public/favicon-32x32.png create mode 100644 docs/public/favicon.ico diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index b913428..6b2109c 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -5,6 +5,12 @@ export default { title: 'SubMiner Docs', description: 'All-in-one sentence mining overlay for MPV with AnkiConnect and dictionary integration', base, + head: [ + ['link', { rel: 'icon', href: '/favicon.ico', sizes: 'any' }], + ['link', { rel: 'icon', type: 'image/png', href: '/favicon-32x32.png', sizes: '32x32' }], + ['link', { rel: 'icon', type: 'image/png', href: '/favicon-16x16.png', sizes: '16x16' }], + ['link', { rel: 'apple-touch-icon', href: '/apple-touch-icon.png', sizes: '180x180' }], + ], appearance: 'dark', cleanUrls: true, lastUpdated: true, diff --git a/docs/anki-integration.md b/docs/anki-integration.md index 850a5f1..797054c 100644 --- a/docs/anki-integration.md +++ b/docs/anki-integration.md @@ -172,7 +172,7 @@ To mine multiple subtitle lines as one sentence card, use `Ctrl/Cmd+Shift+S` fol ## Field Grouping (Kiku) -When you mine the same word multiple times, SubMiner can merge the cards instead of creating duplicates. This is designed for note types like [Kiku](https://github.com/donkuri/Kiku) that support grouped sentence/audio/image fields. +When you mine the same word multiple times, SubMiner can merge the cards instead of creating duplicates. This is designed for note types like [Kiku](https://github.com/youyoumu/kiku) that support grouped sentence/audio/image fields. ```jsonc "ankiConnect": { diff --git a/docs/architecture.md b/docs/architecture.md index fa3244f..cdb4b39 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -86,71 +86,51 @@ src/renderer/ ```mermaid flowchart TD - classDef root fill:#c6a0f6,stroke:#181926,color:#181926,stroke-width:2px; - classDef orchestration fill:#494d64,stroke:#b7bdf8,color:#cad3f5,stroke-width:2px; - classDef domain fill:#494d64,stroke:#8aadf4,color:#cad3f5,stroke-width:2px; - classDef boundary fill:#494d64,stroke:#a6da95,color:#cad3f5,stroke-width:2px; + classDef root fill:#c6a0f6,stroke:#24273a,color:#24273a,stroke-width:2px + classDef comp fill:#b7bdf8,stroke:#24273a,color:#24273a,stroke-width:1.5px + classDef svc fill:#8aadf4,stroke:#24273a,color:#24273a,stroke-width:1.5px + classDef ext fill:#a6da95,stroke:#24273a,color:#24273a,stroke-width:1.5px - subgraph Entry["Entrypoint"] - Main["src/main.ts\nentry point"] + Main["src/main.ts"]:::root + + subgraph Composition["Composition Modules"] + Startup["Startup & Lifecycle"]:::comp + IpcCli["IPC & CLI Wiring"]:::comp + Overlay["Overlay & Shortcuts"]:::comp + Subsync["Subsync"]:::comp end - class Main root; - subgraph MainModules["src/main/ Composition Modules"] - Startup["startup.ts\nbootstrap flow"] - AppLifecycle["app-lifecycle.ts\nlifecycle events"] - StartupLifecycle["startup-lifecycle.ts\napp-ready sequence"] - State["state.ts\nruntime state container"] - IpcRuntime["ipc-runtime.ts\nIPC handlers"] - CliRuntime["cli-runtime.ts\nCLI dispatch"] - OverlayRuntime["overlay-runtime.ts\nwindow/modal"] - SubsyncRuntime["subsync-runtime.ts\nsubsync orchestration"] + subgraph Services["Domain Services"] + OverlaySvc["Overlay Services"]:::svc + MpvSvc["MPV Stack"]:::svc + MiningSvc["Mining & Subtitles"]:::svc + ShortcutIpc["Shortcuts & IPC"]:::svc end - class Startup,AppLifecycle,StartupLifecycle,State,IpcRuntime,CliRuntime,OverlayRuntime,SubsyncRuntime orchestration; - subgraph RuntimeServices["Runtime Domain Services"] - OverlayMgr["overlay-manager-service"] - OverlayWindow["overlay-window-service"] - OverlayVisibility["overlay-visibility-service"] - Ipc["ipc-service\nipc-command-service"] - RuntimeOpts["runtime-options-ipc-service"] - Mpv["mpv-service\nmpv-control-service"] - MpvTransport["mpv-transport\nmpv-protocol"] - Subtitle["subtitle-ws-service\nsecondary-subtitle-service"] - Shortcuts["shortcut-service\noverlay-shortcut-service"] + subgraph External["External Boundaries"] + Config["Config & CLI"]:::ext + Trackers["Window Trackers"]:::ext + Integrations["Jimaku & Subsync"]:::ext end - class OverlayMgr,OverlayWindow,OverlayVisibility,Ipc,RuntimeOpts,Mpv,MpvTransport,Subtitle,Shortcuts domain; - subgraph Adapters["External Boundaries"] - Config["src/config/*"] - Cli["src/cli/*"] - Trackers["src/window-trackers/*"] - Integrations["src/jimaku/*\nsrc/subsync/*"] - end - class Config,Cli,Trackers,Integrations boundary; + Main --> Startup + Main --> IpcCli + Main --> Overlay + Main --> Subsync - Main -->|delegates to| Startup - Main -->|registers| AppLifecycle - AppLifecycle -->|triggers| StartupLifecycle - StartupLifecycle -->|initializes| State + Startup --> OverlaySvc + IpcCli --> ShortcutIpc + Overlay --> OverlaySvc + Overlay --> MpvSvc + Subsync --> Integrations - Main -->|builds deps| IpcRuntime - Main -->|builds deps| CliRuntime - Main -->|builds deps| OverlayRuntime - Main -->|builds deps| SubsyncRuntime + OverlaySvc --> Trackers + MpvSvc --> MiningSvc + ShortcutIpc --> Config - IpcRuntime -->|registers| Ipc - IpcRuntime -->|registers| RuntimeOpts - CliRuntime -->|registers| Cli - OverlayRuntime -->|manages| OverlayMgr - OverlayRuntime -->|manages| OverlayWindow - OverlayRuntime -->|manages| OverlayVisibility - - Main -->|loads| Config - - Ipc -->|updates| RuntimeOpts - Mpv -->|feeds| Subtitle - Shortcuts -->|drives| OverlayMgr + style Composition fill:#363a4f,stroke:#494d64,color:#cad3f5 + style Services fill:#363a4f,stroke:#494d64,color:#cad3f5 + style External fill:#363a4f,stroke:#494d64,color:#cad3f5 ``` ## Composition Pattern @@ -189,35 +169,28 @@ This keeps side effects explicit and makes behavior easy to unit-test with fakes ```mermaid flowchart TD - classDef phase fill:#494d64,stroke:#b7bdf8,color:#cad3f5,stroke-width:2px; - classDef decision fill:#494d64,stroke:#f5a97f,color:#cad3f5,stroke-width:2px; - classDef runtime fill:#494d64,stroke:#8aadf4,color:#cad3f5,stroke-width:2px; - classDef shutdown fill:#494d64,stroke:#a6da95,color:#cad3f5,stroke-width:2px; + classDef phase fill:#b7bdf8,stroke:#24273a,color:#24273a,stroke-width:1.5px + classDef decision fill:#f5a97f,stroke:#24273a,color:#24273a,stroke-width:1.5px + classDef runtime fill:#8aadf4,stroke:#24273a,color:#24273a,stroke-width:1.5px + classDef shutdown fill:#a6da95,stroke:#24273a,color:#24273a,stroke-width:1.5px - Args["CLI args / env"] --> Startup["src/main/startup.ts\nstartup-service"] - class Args,Startup phase; + Args["CLI args / env"]:::phase --> Startup["src/main/startup.ts"]:::phase - Startup --> Decision{"generate-config?"} - class Decision decision; + Startup --> Decision{"generate-config?"}:::decision - Decision -->|yes| WriteConfig["write config + exit"] - Decision -->|no| AppLifecycle["src/main/app-lifecycle.ts\napp-lifecycle-service"] - class WriteConfig,AppLifecycle phase; + Decision -->|yes| WriteConfig["Write config + exit"]:::phase + Decision -->|no| AppLifecycle["src/main/app-lifecycle.ts"]:::phase - AppLifecycle --> Ready["src/main/startup-lifecycle.ts\napp-ready flow\n(config + websocket policy + tracker/tokenizer init + state init)"] - class Ready phase; + AppLifecycle --> Ready["src/main/startup-lifecycle.ts\nConfig · WebSocket · Tracker · Tokenizer · State"]:::phase - Ready --> Runtime["src/main/* runtime modules:\nipc-runtime, cli-runtime, overlay-runtime, subsync-runtime"] - class Runtime runtime; + Ready --> Runtime["Runtime Modules\nipc · cli · overlay · subsync"]:::runtime - Runtime --> Overlay["overlay visibility + mining actions"] - Runtime --> Subtitle["subtitle + secondary-subtitle processing"] - Runtime --> Subsync["subsync / jimaku integration actions"] - class Overlay,Subtitle,Subsync runtime; + Runtime --> Overlay["Overlay & Mining"]:::runtime + Runtime --> Subtitle["Subtitle Processing"]:::runtime + Runtime --> SubsyncInt["Subsync & Jimaku"]:::runtime - Runtime --> WillQuit["Electron will-quit"] - WillQuit --> Cleanup["service-level teardown\n(unregister hooks, close resources)"] - class WillQuit,Cleanup shutdown; + Runtime --> WillQuit["Electron will-quit"]:::shutdown + WillQuit --> Cleanup["Service Teardown"]:::shutdown ``` ## Why This Design diff --git a/docs/configuration.md b/docs/configuration.md index 8aadecb..49bdfd6 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -2,6 +2,26 @@ Settings are stored in `$XDG_CONFIG_HOME/SubMiner/config.jsonc` (or `~/.config/SubMiner/config.jsonc` when `XDG_CONFIG_HOME` is unset). For backward compatibility, SubMiner also reads existing configs from lowercase `subminer` directories. +## Quick Start + +For most users, start with this minimal configuration: + +```json +{ + "ankiConnect": { + "enabled": true, + "deck": "YourDeckName", + "fields": { + "sentence": "Sentence", + "audio": "Audio", + "image": "Image" + } + } +} +``` + +Then customize as needed using the sections below. + ## Configuration File See [config.example.jsonc](/config.example.jsonc) for a comprehensive example configuration file with all available options, default values, and detailed comments. Only include the options you want to customize in your config file. @@ -196,12 +216,8 @@ To refresh roughly once per day, set: } ``` - +### Field Grouping Modes -Open demo in a new tab | Mode | Behavior | | ---------- | -------------------------------------------------------------------------------------------------------------------------- | | `auto` | Automatically merges the new card's content into the original; duplicate deletion is controlled by `deleteDuplicateInAuto` | @@ -210,15 +226,22 @@ To refresh roughly once per day, set: `deleteDuplicateInAuto` controls whether `auto` mode deletes the duplicate after merge (default: `true`). In `manual` mode, the popup asks each time whether to delete the duplicate. + + +Open demo in a new tab + **Image Quality Notes:** - `imageQuality` affects JPG and WebP only; PNG is lossless and ignores this setting - JPG quality is mapped to FFmpeg's scale (2-31, lower = better) - WebP quality uses FFmpeg's native 0-100 scale -**Manual Card Update:** +### Manual Card Update Shortcuts -When `behavior.autoUpdateNewCards` is set to `false`, new cards are detected but not automatically updated. Instead, you can manually update cards using keyboard shortcuts: +When `behavior.autoUpdateNewCards` is set to `false`, new cards are detected but not automatically updated. Use these keyboard shortcuts for manual control: | Shortcut | Action | | -------------- | ------------------------------------------------------------------------------------------------------------ | @@ -232,14 +255,14 @@ When `behavior.autoUpdateNewCards` is set to `false`, new cards are detected but | `Ctrl+Shift+A` | Mark the last added Anki card as an audio card (sets IsAudioCard, SentenceAudio, Sentence, Picture) | | `Ctrl+Shift+O` | Open runtime options palette (session-only live toggles) | -To copy multiple lines (current + previous): +**Multi-line copy workflow:** 1. Press `Ctrl+Shift+C` 2. Press a number key (`1-9`) within 3 seconds 3. The specified number of most recent subtitle lines are copied 4. Press `Ctrl+V` to update the last added card with the copied lines -These shortcuts are only active when the overlay window is visible. They are automatically disabled when the overlay is hidden to avoid interfering with normal system clipboard operations. +These shortcuts are only active when the overlay window is visible and automatically disabled when hidden. ### Auto-Start Overlay diff --git a/docs/index.md b/docs/index.md index c42279b..fdd47e0 100644 --- a/docs/index.md +++ b/docs/index.md @@ -23,22 +23,44 @@ hero: link: /configuration features: - - icon: "🎯" - title: Click-to-Lookup Overlay - details: Subtitles are tokenized into clickable words. Click any word to open a Yomitan dictionary popup — right on top of the video. - - icon: "📇" - title: Automatic Anki Cards - details: Add a word from Yomitan and SubMiner fills in the sentence, audio clip, screenshot, and translation automatically. - - icon: "🪟" + - icon: + src: /assets/mpv.svg + alt: mpv icon + title: Built for mpv + details: Connects directly to mpv over IPC — tracks subtitles in real time, observes playback properties, and renders a self-contained overlay with everything bundled in a single application. + - icon: + src: /assets/yomitan-icon.svg + alt: Yomitan logo + title: Yomitan Integration + details: Hover over any word in the subtitles to trigger Yomitan dictionary lookups — get instant definitions without leaving the video player. + - icon: + src: /assets/anki-card.svg + alt: Anki card icon + title: Anki Card Enrichment + details: Add a word from Yomitan and SubMiner automatically updates the card with the sentence, audio clip, screenshot, and translation — no extra steps needed. + - icon: + src: /assets/dual-layer.svg + alt: Dual layer icon title: Dual-Layer Subtitle System details: Visible overlay with styled, interactive subtitles — plus an invisible layer that aligns with mpv's own subtitle rendering for seamless click-through lookup. - - icon: "🎬" - title: YouTube & Subtitle Sync - details: Play YouTube videos with auto-generated subtitles. Sync external subtitle files with alass or ffsubsync. Search and download anime subtitles from Jimaku. - - icon: "🔠" - title: Smart Tokenization - details: Japanese text is segmented using Yomitan's internal parser with MeCab fallback, enabling accurate word boundary detection for dictionary lookups. - - icon: "⌨️" + - icon: + src: /assets/highlight.svg + alt: Highlight icon + title: N+1 Word Highlighting + details: Highlights words you already know from your Anki deck, making it easy to spot new vocabulary and identify true N+1 sentences during immersion. + - icon: + src: /assets/texthooker.svg + alt: Texthooker icon + title: Texthooker & WebSocket + details: Built-in texthooker page that receives subtitles over WebSocket — use it as a clipboard inserter for Yomitan or connect external tools for real-time subtitle streaming. + - icon: + src: /assets/subtitle-download.svg + alt: Subtitle download icon + title: Subtitle Download & Sync + details: Search and download Japanese subtitles from Jimaku, then sync them to the audio with alass or ffsubsync — all from within the player. + - icon: + src: /assets/keyboard.svg + alt: Keyboard icon title: Keyboard-Driven Workflow details: Mine sentences, copy subtitles, cycle display modes, and trigger field grouping — all from configurable keyboard shortcuts without touching the mouse. --- @@ -136,7 +158,7 @@ SubMiner sits as a transparent overlay on top of mpv. Subtitles appear as intera
02
Look Up
-
Click any word in the subtitle overlay. Yomitan opens its dictionary popup instantly.
+
Hover over a word in the subtitle overlay and hold Shift to trigger a Yomitan dictionary lookup.
03
diff --git a/docs/mining-workflow.md b/docs/mining-workflow.md index 0082e74..8ed8927 100644 --- a/docs/mining-workflow.md +++ b/docs/mining-workflow.md @@ -25,6 +25,7 @@ The visible overlay renders subtitles as tokenized, clickable word spans. Each w - Right-click to pause/resume - Right-click + drag to reposition subtitles - Modal dialogs for Jimaku search, field grouping, subsync, and runtime options +- **N+1 highlighting** — known words from your Anki deck are visually highlighted Toggle with `Alt+Shift+O` (global) or `y-t` (mpv plugin). @@ -106,7 +107,7 @@ When a card is created, SubMiner uses the secondary subtitle text as the transla ## Field Grouping (Kiku) -If you mine the same word from different sentences, SubMiner can merge the cards instead of creating duplicates. This feature is designed for use with [Kiku](https://github.com/donkuri/Kiku) and similar note types that support grouped fields. +If you mine the same word from different sentences, SubMiner can merge the cards instead of creating duplicates. This feature is designed for use with [Kiku](https://github.com/youyoumu/kiku) and similar note types that support grouped fields. ### How It Works @@ -151,3 +152,41 @@ If your subtitle file is out of sync with the audio, SubMiner can resynchronize 4. SubMiner runs the sync and reloads the corrected subtitle. Install the sync tools separately — see [Troubleshooting](/troubleshooting#subtitle-sync-subsync) if the tools are not found. + +## N+1 Word Highlighting + +When enabled, SubMiner highlights words you already know in your Anki deck, making it easier to spot new (N+1) vocabulary during immersion. + +### How It Works + +1. SubMiner periodically syncs with Anki to build a local cache of known words (expressions/headwords from your configured decks) +2. As subtitles appear, known words are visually highlighted in the visible overlay +3. Unknown words remain unhighlighted — these are your potential mining targets + +### Enabling N+1 Mode + +```json +{ + "ankiConnect": { + "nPlusOne": { + "highlightEnabled": true, + "refreshMinutes": 1440, + "matchMode": "headword", + "decks": ["Learning::Japanese"] + } + } +} +``` + +| Option | Description | +|--------|-------------| +| `highlightEnabled` | Turn on/off the highlighting feature | +| `refreshMinutes` | How often to refresh the known-word cache (default: 1440 = daily) | +| `matchMode` | `"headword"` (dictionary form) or `"surface"` (exact text match) | +| `decks` | Which Anki decks to consider "known" (empty = uses `ankiConnect.deck`) | + +### Use Cases + +- **Immersion tracking**: Quickly identify which sentences contain only known words vs. those with new vocabulary +- **Mining focus**: Target sentences with exactly one unknown word (true N+1) +- **Progress visualization**: See your growing vocabulary visually represented in real content diff --git a/docs/public/apple-touch-icon.png b/docs/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7d70768658691992221e4d2c6908eb35d7ffc53e GIT binary patch literal 20117 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 + + + + + + + + + + + + + + diff --git a/docs/public/assets/dual-layer.svg b/docs/public/assets/dual-layer.svg new file mode 100644 index 0000000..c1ba38c --- /dev/null +++ b/docs/public/assets/dual-layer.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/public/assets/highlight.svg b/docs/public/assets/highlight.svg new file mode 100644 index 0000000..98edbaa --- /dev/null +++ b/docs/public/assets/highlight.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/docs/public/assets/keyboard.svg b/docs/public/assets/keyboard.svg new file mode 100644 index 0000000..8148d13 --- /dev/null +++ b/docs/public/assets/keyboard.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/public/assets/mpv.svg b/docs/public/assets/mpv.svg new file mode 100644 index 0000000..5e7355e --- /dev/null +++ b/docs/public/assets/mpv.svg @@ -0,0 +1,86 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/docs/public/assets/subtitle-download.svg b/docs/public/assets/subtitle-download.svg new file mode 100644 index 0000000..76f7dc9 --- /dev/null +++ b/docs/public/assets/subtitle-download.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/public/assets/texthooker.svg b/docs/public/assets/texthooker.svg new file mode 100644 index 0000000..4da1998 --- /dev/null +++ b/docs/public/assets/texthooker.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/docs/public/assets/tokenization.svg b/docs/public/assets/tokenization.svg new file mode 100644 index 0000000..b74b8db --- /dev/null +++ b/docs/public/assets/tokenization.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/public/assets/video.svg b/docs/public/assets/video.svg new file mode 100644 index 0000000..8436c6e --- /dev/null +++ b/docs/public/assets/video.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/public/assets/yomitan-icon.svg b/docs/public/assets/yomitan-icon.svg new file mode 100644 index 0000000..3756901 --- /dev/null +++ b/docs/public/assets/yomitan-icon.svg @@ -0,0 +1 @@ + diff --git a/docs/public/favicon-16x16.png b/docs/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..213e5f2dd68326bcec77bca060570735aeac4af8 GIT binary patch literal 1150 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~o!3-oFZT@ltDTQQ@AYTTCDm4a%h86~fUqGRT z7Yq!g1`G_Z5*Qe)W-u^_7tGleXv4t3_$I(7#C7)U+0&*^@95}oakj|I&Ct|Q($rNB zi?Ev1D_>Tun3t1SRG3v&RbE+HzF^V9c?;(E_xE>ob(ItsUVi^SJ~~KEQ@*ZVFd@b_ zF+MCkJ-M``WZTXi?d|Q&%}rUEsS*CB{+^Z^x-!%2gp4fgeS*Vl+xx^NBohDt*s4UO3W^q?#D7I#3uxBW;V$hM}GSOgj z(_*kt;ppz2P+n0!Y4YT}-0ZZJn9TIVl!VauXrJWxpyZ_JjP#_ElENCGH!91tbd^KG zEY_@)P|{S$j#lk0l}Ynsoztc~yTv^u$@yx0JNi=}jo+P6?Dz(6TVeu4_&g(b87)(_)<)#I&b?;Y1VT;ReQ88EjLs zIZ`bd)TJ1#B^h!J7;4NI3Jn?5g}F@iI4*A%STNb7xY(n*+%da0c0!44Or$|nm{Dr9 z&Xx}D|Ns9BMn&!i`g~?dkY6y6rXLV7X4cxSZ+T-jw}B*Q#F=jeh07%ifBt;7O}qQ1 zit@VW@1EW};=sbCZlEeFWHRkiKhR~2N#5=*i;v%WF9qbVmw5WRvcF>D=MWP=@nOR) zppa^bYeY#(Vo9o1a#1RfVlXl=GSf9M(ls;)F)+3=Ftsu;*ETS)GB6Of&NzaiAvZrI zGp!Q0hNQF$6+jIda2rZ8b5n~;5_1a>dQ3wMEUb)-fCypV(P|q<>7sn8e>x{b@ zT>b<7z{JeL%Er#Y$;HjX%g4_kASfg(BAT0*F9ys5QquekGO}{=3W^1VMM}yls%q-| z3>unR+B&+$C8cHM6?*yxh73l=CZ?5D)iY~q>*^cK%ncbVj4iDin`X_P)7;Y9W^H53 zU}t0R&^~wG`~?dab#yv9IWxGpy193C_w@GlPnbB#!_$Vr%f;Krck+~})27ex^A89N zVh9ci4GIg7h>VJkiH(a-2x3SSNJ>sgNlielF{r G5}E+ZxlG^y literal 0 HcmV?d00001 diff --git a/docs/public/favicon-32x32.png b/docs/public/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..b576da52f5cf6c750d85e370a80950d73219c0f3 GIT binary patch literal 2143 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 N74G5hzpBRb{~urJNcR8$ literal 0 HcmV?d00001