From 660e65d99661446099387d7996913fdff9440e3a Mon Sep 17 00:00:00 2001 From: "James P. Verde" Date: Thu, 1 Oct 2026 13:16:15 -0400 Subject: [PATCH 1/3] feat: Add Windows context menu, JustPaste, video resolutions, and managed downloads - Add a File Explorer context menu for Windows (`just context install`): a single-level JustTools flyout with per-file-type entries, served by the new justtools_shell.dll extension and registered per user as a Windows 11 package or as classic verbs. Console windows close by themselves. - Add justpaste, which saves whatever a link points at: files as-is, pages through yt-dlp, then the media a page declares. Never overwrites. - Add justvideo --resolution (480p, 720p, 1080p, 1440p, 4k, source) and the matching launcher row; URL downloads raise their height cap to match. - Download a missing yt-dlp or FFmpeg automatically on every platform into a per-user folder, verified against the vendor's SHA-256, and run yt-dlp --update whenever twelve hours have passed. - Add justip and URL inputs for justvideo, justaudio, justmp3, and justwav. - Ship the extension in the Windows archives, with optional package signing. - Bump to 2.6.0. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/native.yml | 43 ++ AGENTS.md | 19 +- Cargo.lock | 79 ++- Cargo.toml | 7 +- README.md | 43 +- docs/console-ui.md | 4 +- docs/context-menu.md | 113 +++ docs/downloads.md | 103 +++ docs/images/context-menu-icons.png | Bin 0 -> 92146 bytes docs/ip.md | 84 +++ docs/paste.md | 74 ++ explorer/icons/audio.ico | Bin 0 -> 24287 bytes explorer/icons/brand.ico | Bin 0 -> 23654 bytes explorer/icons/build.py | 244 +++++++ explorer/icons/console.ico | Bin 0 -> 24140 bytes explorer/icons/convert.ico | Bin 0 -> 26131 bytes explorer/icons/crop.ico | Bin 0 -> 22422 bytes explorer/icons/cutout.ico | Bin 0 -> 23571 bytes explorer/icons/json.ico | Bin 0 -> 26347 bytes explorer/icons/links.ico | Bin 0 -> 31545 bytes explorer/icons/logo-150.png | Bin 0 -> 6849 bytes explorer/icons/logo-44.png | Bin 0 -> 2089 bytes explorer/icons/logo-store.png | Bin 0 -> 2445 bytes explorer/icons/optimize.ico | Bin 0 -> 23912 bytes explorer/icons/options.ico | Bin 0 -> 27405 bytes explorer/icons/paste.ico | Bin 0 -> 23383 bytes explorer/icons/pdf.ico | Bin 0 -> 20021 bytes explorer/icons/resize.ico | Bin 0 -> 22913 bytes explorer/icons/svg.ico | Bin 0 -> 22352 bytes explorer/icons/video.ico | Bin 0 -> 21646 bytes explorer/icons/zip.ico | Bin 0 -> 21937 bytes explorer/menu/Cargo.toml | 9 + explorer/menu/src/lib.rs | 870 ++++++++++++++++++++++++ explorer/shell/Cargo.toml | 41 ++ explorer/shell/build.rs | 75 ++ explorer/shell/src/lib.rs | 549 +++++++++++++++ skills/justtools/SKILL.md | 45 +- skills/justtools/references/commands.md | 103 ++- src/commands/download.rs | 352 ++++++++++ src/commands/ip.rs | 457 +++++++++++++ src/commands/media.rs | 489 +++++++++++-- src/commands/mod.rs | 17 +- src/commands/paste.rs | 845 +++++++++++++++++++++++ src/context.rs | 829 ++++++++++++++++++++++ src/context/package.rs | 177 +++++ src/context/register.rs | 382 +++++++++++ src/deps.rs | 102 ++- src/install.rs | 130 +++- src/launcher.rs | 237 ++++++- src/main.rs | 2 + src/managed.rs | 362 ++++++++++ src/selector.rs | 40 ++ tests/native_cli.rs | 469 +++++++++++++ 53 files changed, 7286 insertions(+), 109 deletions(-) create mode 100644 docs/context-menu.md create mode 100644 docs/downloads.md create mode 100644 docs/images/context-menu-icons.png create mode 100644 docs/ip.md create mode 100644 docs/paste.md create mode 100644 explorer/icons/audio.ico create mode 100644 explorer/icons/brand.ico create mode 100644 explorer/icons/build.py create mode 100644 explorer/icons/console.ico create mode 100644 explorer/icons/convert.ico create mode 100644 explorer/icons/crop.ico create mode 100644 explorer/icons/cutout.ico create mode 100644 explorer/icons/json.ico create mode 100644 explorer/icons/links.ico create mode 100644 explorer/icons/logo-150.png create mode 100644 explorer/icons/logo-44.png create mode 100644 explorer/icons/logo-store.png create mode 100644 explorer/icons/optimize.ico create mode 100644 explorer/icons/options.ico create mode 100644 explorer/icons/paste.ico create mode 100644 explorer/icons/pdf.ico create mode 100644 explorer/icons/resize.ico create mode 100644 explorer/icons/svg.ico create mode 100644 explorer/icons/video.ico create mode 100644 explorer/icons/zip.ico create mode 100644 explorer/menu/Cargo.toml create mode 100644 explorer/menu/src/lib.rs create mode 100644 explorer/shell/Cargo.toml create mode 100644 explorer/shell/build.rs create mode 100644 explorer/shell/src/lib.rs create mode 100644 src/commands/download.rs create mode 100644 src/commands/ip.rs create mode 100644 src/commands/paste.rs create mode 100644 src/context.rs create mode 100644 src/context/package.rs create mode 100644 src/context/register.rs create mode 100644 src/managed.rs diff --git a/.github/workflows/native.yml b/.github/workflows/native.yml index 4b3237e..e62a3fc 100644 --- a/.github/workflows/native.yml +++ b/.github/workflows/native.yml @@ -145,9 +145,19 @@ jobs: - name: Test every target with real CPU inference run: cargo test --locked --workspace --all-targets + # The vendors' hosts are outside this project's control, so an outage + # there is reported here without blocking a build. + - name: Download and run the managed yt-dlp and FFmpeg + continue-on-error: true + run: cargo test --locked --test native_cli managed_downloads -- --ignored + - name: Build release executable run: cargo build --locked --release -p justtools + - name: Build File Explorer extension + if: runner.os == 'Windows' + run: cargo build --locked --release -p justtools-shell + - name: Check release RMBG CPU inference shell: pwsh run: | @@ -167,12 +177,40 @@ jobs: - name: Package Windows artifact if: matrix.archive == 'zip' shell: pwsh + env: + JUSTTOOLS_SIGNING_PFX: ${{ secrets.JUSTTOOLS_SIGNING_PFX }} + JUSTTOOLS_SIGNING_PASSWORD: ${{ secrets.JUSTTOOLS_SIGNING_PASSWORD }} run: | $stage = "dist/${{ matrix.artifact }}" $archive = "dist/${{ matrix.artifact }}.zip" New-Item -ItemType Directory -Force -Path $stage | Out-Null Copy-Item "target/release/${{ matrix.executable }}", README.md, AGENTS.md, LICENSE, THIRD_PARTY_LICENSES.md -Destination $stage + Copy-Item "target/release/justtools_shell.dll" -Destination $stage Copy-Item docs, skills -Destination $stage -Recurse + if ($env:JUSTTOOLS_SIGNING_PFX) { + # A signed package identity is what admits the menu to the + # top-level Windows 11 context menu without Developer Mode. + $kit = Get-ChildItem "${env:ProgramFiles(x86)}/Windows Kits/10/bin/10.*/x64" -Directory | + Where-Object { Test-Path (Join-Path $_.FullName "makeappx.exe") } | + Sort-Object Name -Descending | Select-Object -First 1 + if ($null -eq $kit) { throw "The Windows SDK packaging tools were not found." } + $certificate = Join-Path $env:RUNNER_TEMP "justtools-signing.pfx" + [IO.File]::WriteAllBytes($certificate, [Convert]::FromBase64String($env:JUSTTOOLS_SIGNING_PFX)) + try { + $subject = (New-Object Security.Cryptography.X509Certificates.X509Certificate2( + $certificate, $env:JUSTTOOLS_SIGNING_PASSWORD)).Subject + $layout = Join-Path $env:RUNNER_TEMP "justtools-package" + & "target/release/${{ matrix.executable }}" context package --output $layout --publisher $subject + if ($LASTEXITCODE -ne 0) { throw "The package layout could not be written." } + $package = Join-Path $stage "justtools-shell.msix" + & (Join-Path $kit.FullName "makeappx.exe") pack /o /nv /d $layout /p $package + if ($LASTEXITCODE -ne 0) { throw "makeappx failed with exit code $LASTEXITCODE" } + & (Join-Path $kit.FullName "signtool.exe") sign /fd SHA256 /f $certificate /p $env:JUSTTOOLS_SIGNING_PASSWORD $package + if ($LASTEXITCODE -ne 0) { throw "signtool failed with exit code $LASTEXITCODE" } + } finally { + Remove-Item -LiteralPath $certificate -Force + } + } Compress-Archive -Path "$stage/*" -DestinationPath $archive $hash = (Get-FileHash -LiteralPath $archive -Algorithm SHA256).Hash.ToLowerInvariant() $checksum = "$hash $([IO.Path]::GetFileName($archive))`n" @@ -207,6 +245,11 @@ jobs: & ./ready.ps1 & "$env:JUSTTOOLS_BIN/justready.exe" --help & "$env:JUSTTOOLS_BIN/justcommit.exe" --help + if (-not (Test-Path -LiteralPath "$env:JUSTTOOLS_BIN/justtools_shell.dll" -PathType Leaf)) { + throw "The bootstrap did not install the File Explorer extension." + } + & "$env:JUSTTOOLS_BIN/just.exe" context status + if ($LASTEXITCODE -ne 0) { throw "just context status failed." } - name: Exercise Unix bootstrap against packaged release if: matrix.archive == 'tar.gz' diff --git a/AGENTS.md b/AGENTS.md index 661079e..0ce3f6b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -3,7 +3,8 @@ ## Product contract - Preserve one portable Rust binary with native `just*` aliases and short - dispatch through `just `. + dispatch through `just `. The only companion is the Windows File + Explorer extension, `justtools_shell.dll`, which holds no tool logic. - A supported command with no arguments opens its console UI. Any explicit argument or redirected input keeps deterministic headless behavior. - Keep launchers visually consistent: saved settings are labeled, destination @@ -12,8 +13,16 @@ - Persist changed defaults atomically. Never save inputs, payloads, credentials, confirmation bypasses, or one-run actions such as kill, push, repair, check, download, or dry run. +- Download only yt-dlp and FFmpeg without asking, only into the per-user + JustTools folder, and only after verifying the vendor's published SHA-256. + Every other dependency keeps its interactive confirmation. - Preserve source files unless replacement is explicit. Reject ambiguous output collisions before processing and install outputs atomically. +- Describe the File Explorer menu only in `explorer/menu`. A menu entry must be + an ordinary headless command or a launcher, must keep its source unless its + label says "in place", and must never pass `--yes`. Keep the menu one level + deep: Windows 11 leaves a nested flyout empty. The extension runs inside + Explorer and must not be able to panic. ## Changes @@ -38,9 +47,13 @@ cargo +1.90.0 check --locked --workspace --all-targets cargo build --locked --release -p justtools ``` +On Windows, also build `-p justtools-shell`. + Exercise changed commands through both their bare launcher and explicit -headless form. For image operations, verify paths, formats, dimensions, alpha, +headless form. After changing the context menu, run `just context install` and +right-click a matching file in both the Windows 11 menu and "Show more options". For image operations, verify paths, formats, dimensions, alpha, source retention, and overwrite behavior. Before pushing a version tag, require a green six-platform branch matrix. Then verify the tagged run publishes all six archives and their checksum sidecars, with `docs/`, `AGENTS.md`, and -`skills/justtools/` present in every archive. +`skills/justtools/` present in every archive and `justtools_shell.dll` in both +Windows archives. diff --git a/Cargo.lock b/Cargo.lock index 7f54612..852ad30 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -995,6 +995,20 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" +[[package]] +name = "embed-resource" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbfdaacccebec3b28e4866b8973543c7647797db5ada1bdab552e48fe665fbbd" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 1.1.6+spec-1.1.0", + "vswhom", + "winreg", +] + [[package]] name = "encode_unicode" version = "1.0.0" @@ -1644,7 +1658,7 @@ dependencies = [ [[package]] name = "justtools" -version = "2.5.0" +version = "2.6.0" dependencies = [ "anyhow", "assert_cmd", @@ -1658,6 +1672,7 @@ dependencies = [ "image", "jpeg-encoder", "justtools-core", + "justtools-menu", "netstat2", "ort", "predicates", @@ -1670,7 +1685,7 @@ dependencies = [ "tar", "tempfile", "thiserror 2.0.19", - "toml", + "toml 0.9.12+spec-1.1.0", "ureq", "walkdir", "webp", @@ -1705,6 +1720,20 @@ dependencies = [ "zip", ] +[[package]] +name = "justtools-menu" +version = "2.6.0" + +[[package]] +name = "justtools-shell" +version = "2.6.0" +dependencies = [ + "embed-resource", + "justtools-menu", + "windows", + "windows-core 0.61.2", +] + [[package]] name = "kasuari" version = "0.4.12" @@ -3782,12 +3811,27 @@ dependencies = [ "indexmap 2.14.0", "serde_core", "serde_spanned", - "toml_datetime", + "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "toml_writer", "winnow 0.7.15", ] +[[package]] +name = "toml" +version = "1.1.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "920602543f0911ab71da12c50d59701da54c196d1a2bf5cb4b75667f137a406a" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.4", +] + [[package]] name = "toml_datetime" version = "0.7.5+spec-1.1.0" @@ -3797,6 +3841,15 @@ dependencies = [ "serde_core", ] +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + [[package]] name = "toml_parser" version = "1.1.3+spec-1.1.0" @@ -3976,6 +4029,26 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "vtparse" version = "0.6.2" diff --git a/Cargo.toml b/Cargo.toml index d7cb863..85cf6e0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "justtools" -version = "2.5.0" +version = "2.6.0" edition = "2024" rust-version = "1.90" description = "Fast, opinionated, cross-platform just* command-line tools" license = "MIT" [workspace] -members = ["ports/core-tools"] +members = ["explorer/menu", "explorer/shell", "ports/core-tools"] default-members = ["."] resolver = "3" @@ -27,6 +27,7 @@ flate2 = "1.1" image = { version = "0.25.10", default-features = false, features = ["bmp", "gif", "ico", "jpeg", "png", "pnm", "qoi", "tiff", "webp"] } jpeg-encoder = "0.7.1" justtools-core = { path = "ports/core-tools" } +justtools-menu = { path = "explorer/menu" } netstat2 = "0.11.2" ort = { version = "=2.0.0-rc.13", default-features = false, features = ["api-22", "coreml", "cuda", "directml", "load-dynamic", "std"] } rayon = "1.10" @@ -45,7 +46,7 @@ webp = { version = "0.3.1", default-features = false } zip = { version = "4.3", default-features = false, features = ["deflate"] } [target.'cfg(windows)'.dependencies] -windows-sys = { version = "0.61", features = ["Win32_Foundation", "Win32_UI_WindowsAndMessaging"] } +windows-sys = { version = "0.61", features = ["Win32_Foundation", "Win32_System_DataExchange", "Win32_System_Memory", "Win32_UI_Shell", "Win32_UI_WindowsAndMessaging"] } winreg = "0.55" [dev-dependencies] diff --git a/README.md b/README.md index edcfc4b..fd0316a 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,9 @@ Windows, macOS, and Linux on x64 and ARM64. just # browse every tool justvideo # interactive console justvideo clip.mov # direct/headless execution +justvideo clip.mov --resolution 1080p # 480p, 720p, 1080p, 1440p, 4k, source +justaudio https://example.com/watch?v=ID # yt-dlp download, then convert +justpaste --clipboard # download whatever the copied link is justoptimize hero.png --dry-run justrmbg portrait.jpg ``` @@ -46,11 +49,13 @@ and one-run actions never persist. The bottom line always shows the exact | Need | Commands | | --- | --- | | Images | `justoptimize`, `justcrop`, `justjpg`, `justpng`, `justwebp`, `justavif`, `justresize`, `justrmbg` | -| Audio and video | `justaudio`, `justmp3`, `justwav`, `justvideo` | +| Audio and video | `justaudio`, `justmp3`, `justwav`, `justvideo` (also accept `http(s)` URLs) | +| Downloads | `justpaste` saves any link: a file as-is, a page through yt-dlp | | Documents and data | `justjson`, `justpdf`, `justlinks`, `justsvg`, `justqr` | -| Development | `justports`, `justport`, `bunt`, `justcommit`, `justzip` | +| Development | `justports`, `justport`, `justip`, `bunt`, `justcommit`, `justzip` | | Setup | `justready` | | Shell helpers | `mkcd`, `claude_`, `codex_` (automatic in Windows PowerShell) | +| File Explorer | `just context install` adds a right-click menu on Windows | Use ` --help` for every option. Direct aliases also work as short dispatch, such as `just optimize`, `just ports`, and `just rmbg`. @@ -65,6 +70,29 @@ also creates missing parents. `claude_` runs `claude --dangerously-skip-permissi and `codex_` runs `codex --yolo`, forwarding additional arguments. See the [shell helpers guide](docs/mkcd.md). +## Windows right-click menu + +`just context install` adds **JustTools** to the File Explorer context menu for +the current user. Right-click a video for JustVideo at 480p, 720p, 1080p, +1440p, or 4K and JustMP3/JustAudio/JustWAV; an image for JustOptimize, +JustResize sizes, WebP/AVIF/JPEG conversion, JustCrop, and JustRMBG; a PDF, +SVG, JSON file, or document for the tools that read it; and a folder or its +background for **JustPaste**, which downloads the copied link into it. Each entry +opens a console showing its **Headless:** command, and sources are kept unless +an entry says "in place". On Windows 11 the top-level menu needs a signed +release package or Developer Mode; otherwise the menu sits under "Show more +options". See the [context menu guide](docs/context-menu.md). + +## Media downloads + +`justvideo`, `justaudio`, `justmp3`, and `justwav` accept an `http(s)` URL +wherever they accept a file. yt-dlp downloads it to a temporary folder and the +tool converts it with its usual settings into the current folder, or `--output`. +The download is never kept and `--playlist` opts into multi-entry links. +A missing yt-dlp or FFmpeg is downloaded automatically and verified, and +yt-dlp is updated whenever twelve hours have passed. See the +[downloads guide](docs/downloads.md). + ## Safe image output The console shows both the resolved output location and overwrite policy before @@ -95,8 +123,9 @@ short, Shorts, live, and embed URLs merge into one clean video link without timestamps, tracking, or playlist parameters. For complete behavior, see the [console UI](docs/console-ui.md), -[JustPDF](docs/pdf.md), [JustLinks](docs/links.md), [JustPorts](docs/ports.md), [bunt](docs/bunt.md), -[JustCommit](docs/commit.md), and [JustReady](docs/ready.md) guides. +[context menu](docs/context-menu.md), [JustPaste](docs/paste.md), [JustPDF](docs/pdf.md), [JustLinks](docs/links.md), [JustPorts](docs/ports.md), [JustIP](docs/ip.md), +[bunt](docs/bunt.md), [JustCommit](docs/commit.md), [media downloads](docs/downloads.md), and +[JustReady](docs/ready.md) guides. ## Agent skill @@ -120,10 +149,14 @@ cargo build --locked --release -p justtools ./target/release/just install ``` +On Windows, add `-p justtools-shell` to build the File Explorer extension that +`just install` copies beside the executable. + Rust 1.90 is the minimum supported toolchain. Version tags build and publish checksummed archives for all six supported OS/architecture targets through [`native.yml`](.github/workflows/native.yml). Each archive includes the brief -README, complete guides, screenshots, agent instructions, and installable skill. +README, complete guides, screenshots, agent instructions, and installable skill; +Windows archives also carry the File Explorer extension. MIT licensed. Third-party notices ship in [`THIRD_PARTY_LICENSES.md`](THIRD_PARTY_LICENSES.md). diff --git a/docs/console-ui.md b/docs/console-ui.md index 7201262..df9a237 100644 --- a/docs/console-ui.md +++ b/docs/console-ui.md @@ -93,13 +93,15 @@ The following settings are remembered when changed: | Tool group | Saved settings | | --- | --- | -| Image/media tools | Quality, speed/method, sample rate, bitrate, output, parallel jobs, recursion, target re-encoding, source handling | +| Image/media tools | Quality, speed/method, video resolution, sample rate, bitrate, output, parallel jobs, recursion, target re-encoding, source handling | | `justoptimize` | Web quality, output, replacement, parallel jobs, recursion | | `justresize` | Maximum/width/height, crop, upscale, JPEG quality, output, replacement, jobs, recursion | | `justcrop` | Bounds mode, alpha threshold, padding, output, replacement, jobs, recursion | | `justjson` / `justsvg` | Formatting/optimization choices, output, recursion | | `justpdf` | Operation, output, page range, rotation, recursion | | `justlinks` | Text or CSV format, output, recursion, parallel jobs | +| `justip` | Address family, output format, and lookup timeout | +| `justpaste` | Output folder and playlist downloads; links are never saved | | `justport` | Whether UDP endpoints are included | | `justqr` | Output, format, size, correction level, margin, colors | | `justrmbg` | Provider, output, and optional model path; pinned-dependency download permission is visible but one-run | diff --git a/docs/context-menu.md b/docs/context-menu.md new file mode 100644 index 0000000..628180b --- /dev/null +++ b/docs/context-menu.md @@ -0,0 +1,113 @@ +# File Explorer context menu (Windows) + +JustTools can add itself to the right-click menu in File Explorer. The menu +only appears on things a tool can read, and only lists the tools that apply to +the selection. + +```powershell +just context install # add the menu for the current user +just context status # which registration is active +just context uninstall # remove everything install added +``` + +No elevation is needed and nothing outside the current user is changed. + +![JustTools context-menu icons on dark and light menus](images/context-menu-icons.png) + +## What the menu shows + +| Right-click | Entries | +| --- | --- | +| Video (`.mp4 .mov .mkv .avi .webm` …) | **JustVideo** at 480p, 720p, 1080p, 1440p, 4K, or source resolution, plus more options…; **JustMP3**, **JustAudio**, **JustWAV** to extract the soundtrack | +| Audio (`.mp3 .wav .flac .m4a .ogg` …) | **JustMP3**, **JustAudio**, **JustWAV**, minus the format the file already has | +| Image (`.jpg .png .webp .bmp .tif .qoi`) | **JustOptimize**; **JustResize** to fit 1024, 1920, 2560, or 3840 px, plus more options…; **JustWebP**, **JustAVIF**, **JustJPG**, **JustPNG**; **JustCrop**, **JustRMBG** | +| PDF | **JustPDF** merge (two or more), split into pages, save embedded images, save links, show details, more options…; **JustLinks** | +| SVG / JSON | **JustSVG**; **JustJSON** format, minify, validate | +| Office, Markdown, HTML, text, CSV | **JustLinks** to `links.txt` or `links.csv` | +| Folder, or a folder's empty background | **JustPaste** downloads the copied link into that folder; JustOptimize, JustResize, JustWebP, JustVideo, JustMP3, and JustLinks launchers opened in that folder; **JustZip** when the folder is a Git working tree | + +Every choice is its own row in the JustTools flyout, such as +**JustVideo · 1080p**. The Windows 11 menu does not draw a flyout nested inside +another, so the menu is one level deep by design. + +Every menu ends with **Open JustTools here**, which opens the `just` tool +browser in that folder. `.ts` and `.mts` are left alone because they are far +more often TypeScript than video. + +A mixed selection shows every tool that can read at least one selected file, +and each tool is given only the files it reads. + +## What a click does + +A console window opens, prints the exact **Headless:** command and the folder +it runs in, and runs it. That command is what a terminal user would type, so +the menu never does anything the command line cannot. + +- Every window closes by itself: after about three seconds when the run + succeeded, and after thirty when it failed or the result is something to read + (PDF details, JSON validation). +- Enter closes it at once; any other key stops the countdown and keeps the + window open until Enter. +- Entries ending in **…** open the tool's [console launcher](console-ui.md) + with the selection filled in, so saved defaults and every option apply. + +## Defaults + +Menu entries use each tool's built-in defaults plus the one setting the entry +names; saved launcher defaults apply only to the **…** entries. + +| Entry | Command | Result | +| --- | --- | --- | +| JustVideo · 1080p | `justvideo --resolution 1080p` | `-web.mp4`, never upscaled, source kept | +| JustMP3 / JustAudio / JustWAV | `justmp3`, `justaudio`, `justwav` | `.mp3` / `.m4a` / `.wav`, source kept | +| JustOptimize | `justoptimize` | `-optimized.`, source kept | +| JustResize · fit 2560 px | `justresize --max 2560` | `-resized.`, source kept | +| JustWebP / JustAVIF | `justwebp --output .`, `justavif --output .` | `.webp` / `.avif` beside the source, **source kept** | +| JustJPG | `justjpg` | `-optimized.jpg`, source kept | +| JustPNG · compress in place | `justpng` | Replaces the PNG only when the result is smaller | +| JustCrop / JustRMBG | `justcrop`, `justrmbg` | `-cropped.` / `-nobg.png`, source kept | +| JustPaste | `justpaste --clipboard` | The copied link's file in that folder; a taken name is numbered, never overwritten | +| JustSVG, JustJSON Format/Minify | `justsvg`, `justjson`, `justjson --minify` | Rewrites the file in place | + +Entries that change a file in place say so. JustWebP and JustAVIF normally +remove a source once a smaller result exists; the menu passes `--output .` so +a right-click never deletes anything. The menu never passes `--yes`, so a tool +that would overwrite an existing result still asks in the console window. + +## Windows 11 top-level menu + +Windows 11 only lets an app with a package identity into its top-level menu. +`just context install` uses the best registration available: + +| Registration | Appears | Needs | +| --- | --- | --- | +| Package | Top-level Windows 11 menu | A signed `justtools-shell.msix` beside `just.exe`, **or** Developer Mode (Settings > System > For developers) | +| Classic | "Show more options" on Windows 11 (also Shift+right-click); the normal menu on Windows 10 | Nothing | + +`just context install --classic` forces the classic registration. Only one +registration is active at a time. `just install` refreshes a menu that the +installed copy registered, and leaves a menu registered by another copy alone. + +The menu is served by `justtools_shell.dll`, which ships in the Windows release +archives and is copied beside `just.exe` by `just install`. When building from +source, build it too: + +```sh +cargo build --locked --release -p justtools -p justtools-shell +./target/release/just install +just context install +``` + +Release signing is optional. When the release workflow is given the +`JUSTTOOLS_SIGNING_PFX` (base64 PFX) and `JUSTTOOLS_SIGNING_PASSWORD` secrets, +it packs and signs `justtools-shell.msix` into the Windows archives; the +certificate must chain to a root the user's machine trusts. + +## How it is built + +- `explorer/menu` is the menu itself: which tools read which extensions, the + entries for a selection, and the command behind each entry. It is plain Rust, + tested on every platform, and shared by the extension and the CLI. +- `explorer/shell` is the Explorer extension (`IExplorerCommand`). It asks the + model what to show and starts `just.exe context run `. +- `explorer/icons/build.py` draws the icons; the generated files are committed. diff --git a/docs/downloads.md b/docs/downloads.md new file mode 100644 index 0000000..7ae2bc8 --- /dev/null +++ b/docs/downloads.md @@ -0,0 +1,103 @@ +# Media downloads + +`justvideo`, `justaudio`, `justmp3`, and `justwav` accept an `http(s)` URL +anywhere they accept a file. yt-dlp downloads it into a temporary folder, the +tool converts it with its own settings, and only the converted result is kept. +A URL therefore produces exactly what the same tool produces from a local file. + +```sh +justvideo https://example.com/watch?v=ID # ./ [<id>].mp4, 720p CRF 28 +justvideo --resolution 4k https://example.com/watch?v=ID # up to 2160p +justaudio https://example.com/watch?v=ID # ./<title> [<id>].m4a, AAC-LC 160k +justmp3 https://example.com/watch?v=ID -o mixes # mixes/<title> [<id>].mp3 +justvideo --playlist https://example.com/list=ID # every entry of a playlist +justaudio --dry-run https://example.com/watch # plan only; nothing downloads +justvideo clips https://example.com/watch?v=ID # local folder and URL in one run +``` + +## What is downloaded + +| Tool | Selected source | +| --- | --- | +| `justvideo` | Best video plus audio at 1080p or lower (or at a larger `--resolution`), merged to a temporary MKV | +| `justaudio`, `justmp3`, `justwav` | Best audio-only stream | + +The cap exists because the result is re-encoded to `--resolution` (720p by +default), so a taller source would only cost bandwidth. `--resolution 1440p` and +`4k` raise the cap to match, and `--resolution source` removes it. Playlists are skipped unless `--playlist` is passed: +a `watch?v=...&list=...` link downloads the one video. yt-dlp runs with +`--ignore-config`, so a personal yt-dlp configuration cannot redirect the +output or re-encode behind the tool's back. + +## Output + +Downloads have no source folder to sit beside, so they are written to the +current folder, or to `--output`, as `<title> [<id>].<target-extension>`. +`justvideo` uses that plain name rather than the `-web` suffix reserved for +optimizing a local file. An existing destination is replaced atomically, +exactly as it is for a local conversion. + +The downloaded file itself is temporary and is removed with the run, so +`--replace` has nothing to remove for a URL. Local files and URLs can be mixed +in one command; two inputs that would write the same output are rejected before +anything is encoded. Each line of the summary names the URL it came from: + +``` +justaudio: downloading https://example.com/watch?v=ID +justaudio: 1 file(s), 2 job(s) + done https://example.com/watch?v=ID -> Title [ID].m4a 12.4 MiB -> 3.1 MiB +``` + +## Keeping yt-dlp current + +Every run of `justvideo`, `justaudio`, `justmp3`, `justwav`, or `justpaste` +checks when yt-dlp was last updated and runs `yt-dlp --update` if twelve hours +have passed, whether or not that run downloads anything. Sites change faster +than releases reach package managers, so this keeps downloads working. A dry +run and a machine without yt-dlp are left alone. The timestamp of the last +attempt is stored next to the defaults file, which `just --defaults-path` +prints, as `yt-dlp-update`. + +The update is best-effort. A package-managed yt-dlp refuses to replace itself +and an offline machine cannot reach the release feed; either way the message is +a warning and the run proceeds with the installed version. The next attempt +still waits twelve hours, so a broken feed cannot slow every run. + +## Requirements + +yt-dlp and FFmpeg are used from `PATH` when they are there. When one is +missing, JustTools downloads it automatically, on every platform, the first +time a tool needs it: + +| Program | Source | Verified against | +| --- | --- | --- | +| yt-dlp | The official `yt-dlp/yt-dlp` GitHub release for this OS and CPU | The release's `SHA2-256SUMS` | +| FFmpeg and ffprobe, Windows | Gyan Doshi's release essentials build (the build WinGet's `Gyan.FFmpeg` installs) | The `.sha256` published beside it | +| FFmpeg and ffprobe, macOS and Linux | Martin Riedl's static release builds for x64 and ARM64 | The `.sha256` published beside each | + +The programs go into a per-user folder (`%LOCALAPPDATA%\JustTools\deps\bin` +on Windows, the matching data folder elsewhere). Nothing is installed +system-wide, `PATH` is not changed, no elevation is requested, and a download +that fails verification is discarded. A copy on `PATH` always wins. A managed +yt-dlp updates itself in place through the twelve-hour check; a managed FFmpeg +is refreshed with `just deps fetch ffmpeg`. + +```sh +just deps fetch yt-dlp ffmpeg # download or refresh the managed copies now +``` + +Set `JUSTTOOLS_NO_DOWNLOAD=1` to turn automatic downloads off, and +`JUSTTOOLS_DEPS_DIR` to choose the folder. If a download is off or fails, the +previous flow applies: JustTools shows the exact install command for WinGet, +Homebrew, APT, DNF, or pacman and runs it only after interactive confirmation. + +Set `YTDLP_BIN` to pin a specific executable, the same way `FFMPEG_BIN` pins +FFmpeg. An explicit path is resolved as-is and never triggers a download or an +installation. + +## Console + +Run `justvideo` or `justaudio` with no arguments and type or paste the URL into +**Input files / folders / URLs**; separate several with semicolons. The footer +shows where the download will land and the exact `Headless:` command. **Download +playlists** is a saved setting; the URL itself is never saved. diff --git a/docs/images/context-menu-icons.png b/docs/images/context-menu-icons.png new file mode 100644 index 0000000000000000000000000000000000000000..1edfd4cf4f87f77c17619c4dfca0859570fbba85 GIT binary patch literal 92146 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≫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 literal 0 HcmV?d00001 diff --git a/docs/ip.md b/docs/ip.md new file mode 100644 index 0000000..98c1982 --- /dev/null +++ b/docs/ip.md @@ -0,0 +1,84 @@ +# JustIP + +`justip` (or `just ip`) reports the public IP address this machine presents to +the internet. Both IPv4 and IPv6 are reported together, so the common question +needs no switch. Run it bare for the console UI; the footer shows the exact +headless command. + +```sh +justip # both families, labeled +justip -4 # IPv4 only +justip -6 # IPv6 only +justip --plain # bare addresses, one per line +justip --json # {"ipv4":"…","ipv6":"…"} +justip --timeout 15 # wait longer on a slow link +``` + +## What the address is + +The address comes from a public echo service, which reports the address it saw +the request arrive from. That is the address the internet sees, which behind +NAT, a VPN, or a mobile carrier is not any address configured on a local +interface. Nothing is sent but the request itself; the reply is a single line. + +Each family is pinned by hostname rather than by a socket option. The IPv4 +services publish only A records and the IPv6 services only AAAA records, so a +request can reach them over one family only. An answer that arrives in the +wrong family is discarded rather than reported under the wrong label. + +| Family | Services, in the order they are tried | +| --- | --- | +| IPv4 | `api.ipify.org`, `ipv4.icanhazip.com`, `v4.ident.me` | +| IPv6 | `api6.ipify.org`, `ipv6.icanhazip.com`, `v6.ident.me` | + +The next service is tried whenever one fails, times out, or answers with +something that is not an address for the family being asked about, so a single +operator's outage does not take the command down with it. + +## Output + +The default labeled form is one line per requested family: + +```text +IPv4: 203.0.113.7 +IPv6: 2001:db8::7 +``` + +`--plain` prints only the addresses, one per line, for piping into another +command. `--json` prints one object whose `ipv4` and `ipv6` keys hold the +address or `null`. Both keep stdout free of anything but the answer and send +every explanation to stderr. + +## Families that cannot be reached + +Most networks still have no public IPv6 route. Rather than wait out a +connection that cannot complete, `justip` reads the source address the routing +table would choose and skips the lookup when there is no globally routable one. +No packet is sent for this check. A machine holding only link-local or +unique-local IPv6 addresses is reported immediately: + +```text +IPv4: 203.0.113.7 +IPv6: unavailable (this machine has no public IPv6 route) +``` + +One family answering is still an answer, so that run succeeds. The command +fails, with exit status 1 and nothing on stdout, only when no requested family +answers at all — including `justip -6` on a machine with no IPv6. + +`--timeout` bounds each family's lookup separately, from 1 to 60 seconds, and +defaults to 5. Both families are looked up at once, so reporting both costs one +timeout rather than two. + +## Saved defaults + +The launcher remembers the address family, the output format, and the timeout. +Nothing else is stored, and no address is ever written to disk. + +## Testing without the network + +`JUSTIP_IPV4_URL` and `JUSTIP_IPV6_URL` replace the service list for that +family with their own semicolon-separated URLs. An overridden family skips the +public-route check, since the override is not expected to be on the public +internet. This exists for the test suite and for pointing the command at a +private echo service. diff --git a/docs/paste.md b/docs/paste.md new file mode 100644 index 0000000..b25ef70 --- /dev/null +++ b/docs/paste.md @@ -0,0 +1,74 @@ +# JustPaste + +`justpaste` turns a link into a file in the current folder. It works out what +the link is and takes the shortest route to the real file. + +```sh +justpaste https://example.com/photo.jpg # saves photo.jpg +justpaste https://www.youtube.com/watch?v=ID # saves "<title> [<id>].mp4" +justpaste https://www.tiktok.com/@user/video/ID # same, through yt-dlp +justpaste --clipboard # every link in the copied text +justpaste -o downloads https://a.test/x.pdf https://b.test/clip +justpaste --dry-run --clipboard # list the links; no network +``` + +On Windows, right-click a folder or its empty background and choose +**JustTools ▸ JustPaste · download the copied link here**; see the +[context menu guide](context-menu.md). + +## How a link is handled + +1. **The link is requested.** If the answer is a file of any kind (image, + video, audio, PDF, archive, anything that is not a web page), it is saved + as-is. Nothing is converted. +2. **A web page goes to yt-dlp**, which supports YouTube, TikTok, Instagram, + X, Reddit, Vimeo, and most other video and social sites, plus a generic + extractor for pages that simply embed a video. A link the plain request + could not fetch is tried through yt-dlp as well. +3. **If yt-dlp finds nothing**, the video or image the page declares for link + previews (`og:video`, `og:image`, and the Twitter equivalents) is saved. +4. Otherwise the link is reported as failed and the run exits with status 1. + Other links in the same run are still processed. + +yt-dlp downloads the highest resolution available, prefers H.264 and MP4 at +that resolution so the result plays everywhere, and merges into an `.mp4`. A +playlist link downloads one entry unless `--playlist` is passed. To shrink or +convert the result, run `justvideo`, `justmp3`, or another tool on it, or give +those tools the link directly. + +## Names and safety + +| Source | Saved name | +| --- | --- | +| Direct file | The server's `Content-Disposition` name, else the last part of the address; an extension is added from the content type when the name has none | +| yt-dlp | `<title> [<id>].<ext>` | + +- Nothing is overwritten. A taken name is saved as `name (2).ext`, `name (3).ext`. +- A download is written under a hidden `.justpaste-*` name inside the + destination and renamed only when complete, so an interrupted run leaves + nothing behind under a real name. +- Names are stripped of characters and reserved words that a file system + refuses. +- `--dry-run` only lists the links and the destination; it makes no request. + +## Inputs + +Links can be given as arguments, piped on standard input, or read from the +clipboard with `--clipboard`. Text around a link is ignored, so a copied +sentence or a list works; a bare `www.` address is treated as HTTPS. Anything +that is not an `http(s)` link is a usage error. + +Clipboard access is built in on Windows, uses `pbpaste` on macOS, and uses +`wl-paste`, `xclip`, or `xsel` on Linux. + +## Dependencies and privacy + +Direct file links need nothing. Page links need yt-dlp and FFmpeg, which are +downloaded automatically when they are not on `PATH`, and yt-dlp is updated +whenever twelve hours have passed; both are described in the +[downloads guide](downloads.md). A link is fetched from the address you give +it, so the site sees the request. Only download what you have the right to. + +Bare `justpaste` opens the launcher. A blank **Links** row pastes the +clipboard; **Output folder** and **Download playlists** are saved, and the +links themselves never are. diff --git a/explorer/icons/audio.ico b/explorer/icons/audio.ico new file mode 100644 index 0000000000000000000000000000000000000000..18df1ecb80f64e1df69dd0127b00eb69d8a0e573 GIT binary patch literal 24287 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 JPDHLkV1h@qS)%{| literal 0 HcmV?d00001 diff --git a/explorer/icons/brand.ico b/explorer/icons/brand.ico new file mode 100644 index 0000000000000000000000000000000000000000..9712df18a5b3e1698564fc20e8926278cea6eb2d GIT binary patch literal 23654 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 literal 0 HcmV?d00001 diff --git a/explorer/icons/build.py b/explorer/icons/build.py new file mode 100644 index 0000000..ac2c9c6 --- /dev/null +++ b/explorer/icons/build.py @@ -0,0 +1,244 @@ +"""Draw the JustTools context-menu icons. + + python explorer/icons/build.py + +Each icon is a rounded colour tile with a white glyph, drawn on a 32-unit grid +and rendered separately at every size so the 16 px menu version stays crisp. +The tile carries its own contrast, so one set serves light and dark menus. +Requires Pillow. The generated .ico and .png files are committed. +""" + +from pathlib import Path + +from PIL import Image, ImageDraw, ImageFont + +HERE = Path(__file__).parent +SIZES = [16, 20, 24, 32, 40, 48, 64, 256] +SUPERSAMPLE = 8 +WHITE = (255, 255, 255, 255) + + +class Canvas: + """A drawing surface addressed in 32-unit grid coordinates.""" + + def __init__(self, size): + self.pixels = size * SUPERSAMPLE + self.scale = self.pixels / 32 + self.image = Image.new("RGBA", (self.pixels, self.pixels), (0, 0, 0, 0)) + self.draw = ImageDraw.Draw(self.image) + + def p(self, value): + return value * self.scale + + def box(self, x0, y0, x1, y1): + return [self.p(x0), self.p(y0), self.p(x1), self.p(y1)] + + def rect(self, x0, y0, x1, y1, radius=0, fill=WHITE): + self.draw.rounded_rectangle(self.box(x0, y0, x1, y1), self.p(radius), fill=fill) + + def ellipse(self, x0, y0, x1, y1, fill=WHITE): + self.draw.ellipse(self.box(x0, y0, x1, y1), fill=fill) + + def polygon(self, points, fill=WHITE): + self.draw.polygon([(self.p(x), self.p(y)) for x, y in points], fill=fill) + + def line(self, points, width, fill=WHITE): + scaled = [(self.p(x), self.p(y)) for x, y in points] + self.draw.line(scaled, fill=fill, width=round(self.p(width)), joint="curve") + radius = self.p(width) / 2 + for x, y in (scaled[0], scaled[-1]): + self.draw.ellipse([x - radius, y - radius, x + radius, y + radius], fill=fill) + + def arc(self, x0, y0, x1, y1, start, end, width, fill=WHITE): + self.draw.arc(self.box(x0, y0, x1, y1), start, end, fill=fill, width=round(self.p(width))) + + def text(self, value, size, x, y): + font = ImageFont.truetype("consolab.ttf", round(self.p(size))) + self.draw.text((self.p(x), self.p(y)), value, font=font, fill=WHITE, anchor="mm") + + def tile(self, top, bottom): + gradient = Image.new("RGBA", (1, self.pixels)) + for y in range(self.pixels): + mix = y / (self.pixels - 1) + gradient.putpixel( + (0, y), + tuple(round(a + (b - a) * mix) for a, b in zip(top, bottom)) + (255,), + ) + gradient = gradient.resize((self.pixels, self.pixels)) + mask = Image.new("L", (self.pixels, self.pixels), 0) + ImageDraw.Draw(mask).rounded_rectangle(self.box(1, 1, 31, 31), self.p(7.5), fill=255) + self.image.paste(gradient, (0, 0), mask) + + def finish(self, size): + return self.image.resize((size, size), Image.LANCZOS) + + +def rgb(value): + return tuple(int(value[index : index + 2], 16) for index in (1, 3, 5)) + + +def brand(c): + c.rect(12, 8, 22.5, 11.6, 1.8) + c.rect(18.4, 8, 22.5, 19, 1.8) + c.arc(10.2, 11.6, 22.5, 24.4, 0, 180, 4.1) + c.ellipse(10.2, 16.6, 14.3, 20.7) + + +def video(c): + c.polygon([(12.2, 8.6), (24.2, 16), (12.2, 23.4)]) + c.line([(12.2, 8.6), (24.2, 16), (12.2, 23.4), (12.2, 8.6)], 1.6) + + +def audio(c): + for x, top in ((8.4, 13), (13.2, 8.5), (18, 11), (22.8, 14)): + c.rect(x - 1.5, top, x + 1.5, 32 - top, 1.5) + + +def optimize(c): + c.ellipse(19.2, 8.6, 23.6, 13) + c.polygon([(7, 24), (13.4, 13.2), (19.8, 24)]) + c.polygon([(15.4, 24), (20.4, 16.8), (25.4, 24)]) + c.rect(7, 22.6, 25.4, 24.4, 0.9) + + +def resize(c): + c.line([(10, 22), (22, 10)], 2.4) + c.line([(15.6, 9.6), (22.4, 9.6), (22.4, 16.4)], 2.4) + c.line([(9.6, 15.6), (9.6, 22.4), (16.4, 22.4)], 2.4) + + +def convert(c): + c.line([(8.5, 12), (23, 12)], 2.4) + c.line([(19, 8), (23.4, 12), (19, 16)], 2.4) + c.line([(23.5, 20), (9, 20)], 2.4) + c.line([(13, 16), (8.6, 20), (13, 24)], 2.4) + + +def crop(c): + c.line([(11.5, 7.5), (11.5, 20.5), (24.5, 20.5)], 2.4) + c.line([(7.5, 11.5), (20.5, 11.5), (20.5, 24.5)], 2.4) + + +def cutout(c): + c.ellipse(12.4, 7.6, 19.6, 14.8) + c.draw.pieslice(c.box(8, 16.6, 24, 32.6), 180, 360, fill=WHITE) + + +def pdf(c): + c.polygon([(9.5, 7), (18.6, 7), (22.5, 10.9), (22.5, 25), (9.5, 25)]) + c.polygon([(18.6, 7), (22.5, 10.9), (18.6, 10.9)], fill=(255, 255, 255, 120)) + for y in (14.4, 17.6, 20.8): + c.rect(12, y - 0.8, 20, y + 0.8, 0.8, fill=TILES["pdf"][1] + (255,)) + + +def svg(c): + c.arc(4, 9.5, 23, 28.5, 270, 360, 2.2) + c.rect(10.7, 6.8, 16.3, 12.4, 1) + c.rect(19.6, 15.7, 25.2, 21.3, 1) + c.line([(8, 23.5), (13.4, 23.5)], 2.2) + + +def json(c): + c.text("{}", 17.5, 16, 15.2) + + +def links(c): + c.line([(13.4, 18.6), (18.6, 13.4)], 2.4) + c.arc(7, 13.2, 18.8, 25, 60, 300, 2.4) + c.arc(13.2, 7, 25, 18.8, 240, 480, 2.4) + + +def zip_(c): + c.rect(8, 9, 24, 14, 1.4) + c.rect(9.4, 15.2, 22.6, 24.5, 1.4) + c.rect(13.6, 17.6, 18.4, 19.8, 1.1, fill=TILES["zip"][1] + (255,)) + + +def console(c): + c.line([(9.5, 11), (15, 16), (9.5, 21)], 2.4) + c.line([(17.2, 21.4), (23, 21.4)], 2.4) + + +def options(c): + for y, knob in ((10.5, 19.5), (16, 12), (21.5, 17)): + c.line([(8.5, y), (23.5, y)], 1.8) + c.ellipse(knob - 2.7, y - 2.7, knob + 2.7, y + 2.7) + + +def paste(c): + c.line([(16, 8), (16, 18.5)], 2.4) + c.line([(11.4, 14.4), (16, 19), (20.6, 14.4)], 2.4) + c.line([(8.5, 19.5), (8.5, 23.5), (23.5, 23.5), (23.5, 19.5)], 2.4) + + +TILES = { + "brand": (rgb("#9d6bff"), rgb("#6d28d9")), + "video": (rgb("#fb7185"), rgb("#e11d48")), + "audio": (rgb("#34d399"), rgb("#059669")), + "optimize": (rgb("#60a5fa"), rgb("#2563eb")), + "resize": (rgb("#22d3ee"), rgb("#0891b2")), + "convert": (rgb("#818cf8"), rgb("#4f46e5")), + "crop": (rgb("#2dd4bf"), rgb("#0d9488")), + "cutout": (rgb("#f472b6"), rgb("#db2777")), + "pdf": (rgb("#f87171"), rgb("#dc2626")), + "svg": (rgb("#fb923c"), rgb("#ea580c")), + "json": (rgb("#fbbf24"), rgb("#d97706")), + "links": (rgb("#38bdf8"), rgb("#0284c7")), + "zip": (rgb("#94a3b8"), rgb("#475569")), + "console": (rgb("#64748b"), rgb("#1e293b")), + "options": (rgb("#9ca3af"), rgb("#4b5563")), + "paste": (rgb("#e879f9"), rgb("#c026d3")), +} + +GLYPHS = { + "brand": brand, + "video": video, + "audio": audio, + "optimize": optimize, + "resize": resize, + "convert": convert, + "crop": crop, + "cutout": cutout, + "pdf": pdf, + "svg": svg, + "json": json, + "links": links, + "zip": zip_, + "console": console, + "options": options, + "paste": paste, +} + + +def render(name, size): + canvas = Canvas(size) + canvas.tile(*TILES[name]) + GLYPHS[name](canvas) + return canvas.finish(size) + + +def main(): + for name in GLYPHS: + frames = [render(name, size) for size in SIZES] + frames[-1].save( + HERE / f"{name}.ico", + sizes=[(size, size) for size in SIZES], + append_images=frames[:-1], + ) + # The package identity needs loose logos beside its manifest. + for stem, size in (("logo-44", 44), ("logo-150", 150), ("logo-store", 50)): + render("brand", size).save(HERE / f"{stem}.png") + sheet = Image.new("RGBA", (len(GLYPHS) * 72 + 8, 2 * 72 + 44), (32, 32, 32, 255)) + sheet.paste((243, 243, 243, 255), (0, 72 + 22, sheet.width, sheet.height)) + for row in range(2): + for index, name in enumerate(GLYPHS): + top = row * (72 + 22) + large = render(name, 48) + small = render(name, 16) + sheet.alpha_composite(large, (index * 72 + 8, top + 8)) + sheet.alpha_composite(small, (index * 72 + 8, top + 64)) + sheet.save(HERE.parent.parent / "docs" / "images" / "context-menu-icons.png") + + +if __name__ == "__main__": + main() diff --git a/explorer/icons/console.ico b/explorer/icons/console.ico new file mode 100644 index 0000000000000000000000000000000000000000..2edf624d874b9cae853e1e7de5a5bf85893096ff GIT binary patch literal 24140 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 TGxH0w00000NkvXXu0mjfc$Y#^ literal 0 HcmV?d00001 diff --git a/explorer/icons/convert.ico b/explorer/icons/convert.ico new file mode 100644 index 0000000000000000000000000000000000000000..827ca152b7719374427004ade01a21900c62aca2 GIT binary patch literal 26131 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 literal 0 HcmV?d00001 diff --git a/explorer/icons/crop.ico b/explorer/icons/crop.ico new file mode 100644 index 0000000000000000000000000000000000000000..6bda06dbccd3d31aff38de08b1ee33bcc12bf625 GIT binary patch literal 22422 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 literal 0 HcmV?d00001 diff --git a/explorer/icons/cutout.ico b/explorer/icons/cutout.ico new file mode 100644 index 0000000000000000000000000000000000000000..812b1496d506908ac2711ccce89e78e32802ebf5 GIT binary patch literal 23571 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 P00000NkvXXu0mjfVMLu4 literal 0 HcmV?d00001 diff --git a/explorer/icons/json.ico b/explorer/icons/json.ico new file mode 100644 index 0000000000000000000000000000000000000000..698fd195b178d9ac812054030d78d0b1bc4556e4 GIT binary patch literal 26347 zcmagFW00n?@(22kZSD9S+qUi5v2E_yHg;ymJGO1xwr$(Gd(QcCKis<i)RRiOI+aR2 z=}!N;(*XcL0MGzrWWc`y1nhzW0HObS=;;5W_rU-F^MCcnkN?pi5CDKQ)W4Cy|IrnY z0DufU06<CkKUy6c0C+|P02mqnM-#vT0P?s1fS}<2=uQLxz=rHU{r?moppOLrp!!!M z6y+rlU~&G91|UdDiYotW|Fa@w=zsGA2=BiQ0RYevDN!L6_YB>H_9!wj^dZ0EHv4Cv zmh*|o9ehPb#eCD5G!+pN5d`)%IaW-a715h`8}dL4TJk*H3LH*@BSK(cIS{sdHV@wE z7}1GvQ}>u?Gbm8oVF%r%tGdgnj6cFn@{YjwV==+2o#)Y-i0L`j7v@_(UOG+~bM0mG zcKq4zHxNNAJ-=ALV(3mxsfY_)5)?I9SFjL(*B4faYkoPVpWSsgjIW8$$HpM*OQ0~9 z^th(_M^Xc<O}K1RNYWXO(p-`$AiShpr7SGMA<hPOc?d&&YFfon+P*nNHk+obycurJ z4n;PUS9gt}V-wvlF}=}BS9I3)A_o1)%bCECC>i7V&)bc0hjr~Gs{PW6nUv293{lDr z{rs}0wc**lD0}0Dk?xMI%mBKwnA5dL1=O*u(=}LMOx(Ce`=HYUQB{=`i%($rE_p#_ zxu_nJbf{u)KKUBU+!VhZL{<y|+A5jH6WmZ0*<8M?o;#NAM`YG_j5Us=t&cSSSN!M~ zT}gJ&8su`%uei{4FL8$1`)&;a-F)v4z!_hMb!Zk9p)spp#G%{rXw<u?iu-ao<Cu^T zl{=(kZ#$w+?IS9!2&}Mr|Gt-i2?i<rdAF47pY-7n*x^pW>EAGJW>EIK(P5ZoVH~*? zvxh;sM@D9`nxb_VA!fh35PsGa?H;6`i$;gDl9c3b>>ixso}4Atur}DN)=ovu@d!K; zN0dsSQj}N_d<;BI6H4w=g*)6`%9*GT=Tn*Bd!vX&jx@=x6*8#P*wW-J;GJpGmBhT& zwMIPdpWMeqJep^T%u==w4XE(rPdu!zC#aiaWMf1`JnMOmgnqBqx`p~fb&YnsPQ0)G zKG5g+{$>5}L6Yy>Z;<7MHYCC;9F1Cl9wk42JiTStbzS=nFqPg#Il3en{U^ErDKUA` zDq(}b{|^EGkBXuHSHNQ;@c-!rSlRysJVs^QI#U(-dy?ze_c>nTo^g&+t`S|VHqRNQ zp6Wz=Kv?&r2(GtVa6k@A3D?^nqZV1T4tXJ|1w~YelJX>v7}`pkt|WjsguGEI-Ccj1 zi-p9g%j<fG7O%_c+GFBlYQp{q9>l*3RDve%QUOU`ZZgEUVugVZP!QZHDy7>`-moci z+kPuit@9HCWi_G?MW{_5-?K_>IFf=J(9JRBC%Vuzxw71h`@1@ORHJG8b+5`ief~?t z4sJ{t0vrMw$Z->1?spf|xboWv9kg|=LBfrNzByLkBlBS+*XPpit+S+ceXK+{cuX2X zYYQ}7a8RYu)VjSo6`ayUQC0Fr5e4JUGkblLim;q#;<2s5;PwwXDw@hUWo$?2+w3z? z3doe_{z4lGwH<5(k1CT&uc4y}`<Jb(kU*Z(Fb%1!tilR*O#FlnT|%A&k2j*lkzc~* z-EyDzBa=dr*BNqdz0x^Bn5BlgegmcFZ)(Vef3%Ve25if!*n^+8*!8h$iw_)t*Ar_Q zuq^x;fR$?@oZv`<*#wec2q7=suf2fWh;(X$&76ocGgBhW(&bHajqUd_y`3|}x^t#T z!VH2MLVGX~U+1U}+NjxpxefYCKGxk8U<D#a<z;+-ch-D_s3l__@WxB}R9}fRP3sWu z|3gDwd?Gjab2taJw_TlRue@Ld8OlySY>541gTz03gngCW7!VsWsT%I#4|;mUZRgzq z-GUR@o(<_{Cmak6<YmB&4Z^8kc{72zeIuicMkUb28Q_IqL@*Om0W1VRHC49cT$Hiw zD?*RKUtSAZ!ZUJL3>d7klY{pPvMMEcj>Du4lL@jZ+M-&fpul=zCmutit$I<(DB5al z3=yf~{raQhM?$b#S7@RC0@#<x9-jDleJq^fi^ZbQ6%|ov+Q8roPXCU9VQG+Jje<j3 zngY}cfhhL|MjIc$yD8e~1ZMNban%`}>%T)}J|>)ez8+E%k*kGGfSWxE5!+K7htHQ_ zs0c%>r3lowg;>iT#JTxuj5oBr6?8_&m*ISd;+xVqL{#(i@$}BSn}naL`vdw+vdoa= zB76T%?t}cuS*l;d_Xp2z@29zxle;^U#Ye1&O{iN5AJZwaBCQ;9z^BO!ptrN{EgmU{ zV`yfWsnPzvRW@#Q;Kbk^x=a5eG|D9x!p621(7WoqnfNTx`l#{w_AF~DM!5l}noLne z+Qj{v6H@P6&haKSz4<QwVd?(B5R{nR`*)YS^8Zlr|5(i*|5foFH@+7D0DR<sDxRb^ z{Tp2s`RnZQJZ%*_)Kn7_1_U)Zr(K4W+}(hIR0l}VVKI{$=b$9ZN=j~(2n>Wmoh_G; zgNFJB6%%2V1{XnAQsm10;Y&+7GIb?8EvwM2ZhGc2U4x4j$WZ!lUPbtMR$g6}u1Jf5 zj3PQ^A2Dlb136nF19BX4<8MlWng~LZD$)K1ciE8`><&Ny7U1H6&U)=^sqZsLV7_Mz zi&EuDRuWjD#BrfSI;duN<4x;*_V7YYds?9UAa*#8dK{)6&*zi;VX4q_H?!MM>_5g7 za0Yo=A>d)^dvYq*PT$V^a(u2=0iVv7*{)f=`7|L92nh`Vl6QMfRl_}lWyZM+6`!}> zyCo-wO~xWL9^?#>zq*tq>R5iNVdve-tIr2uXGs0n(-KqxiH9grJauvfxCu37<?E8t zf=19u9TjMnuSm$fOFOXu_cwzPG~m62kcSPB27X@Wwe3R<p#9tIN#HHHk1OKs0Z7fW zL3LAWc8%g+W@?mBT)O7Tmgr$xgAS}&)}WL2HiQ+I>3r5(oVv8?+4fs9QE8z%>+If5 z{*bwY^BU_c5I3CO<F0N=aFjc{iE!iUR3v!<aD!vy%2dc^^BMkntg9!>@D<?dM6-oo zH`ZJy7)u-53S_p>6X<mV`$467ocka*GP}MwP!sYttqTT~Y6`<PQdl2~GbkLY1Fk6? z!hqfiJY1cgQIk`U6^K=_V0X{gLmQykhO)O7r-v0T6C?}@Kgu1ahi0~lK0q5_(m7MA zb!d=_ZR+p16_OZO6L3A%A8R`}a+MyQEC=LzXJ7frx#7bT5*VMciPZk#7=4iyfWHa4 zZ5#T-2iJv}D9G2b14+y|MqsAvhG?fPT-`p5Gb9RY1!llwz}hWv9`et<#LiKb5b`lo zpq`f$iy}AFU#1lgXxfbrxruD<=&ec?O8XUvWXh9NF04%wagPtp2RrYeBR7d1t!7Y= zz^d@$)qYUKy(A;8j*g$mgMw63j;>UR&Nm+W2xp{_4w)Iyg&DdtKC@1FQ06^WII>)9 zr8mpOb#>6-Kj5+_`V;X+5D!U5wG0sCm7s^xz@#hoO?!x&0L-DcT40$raD%6m0MBN6 zU|F@8&pC)_|L*|Z<mcfL(zE$6ltne7&QG-9(i=^@VK4mSy$}|*kzobIfIbz8^J4`A z365O;PefT;HZz4QumHvNFY2<N48T@r_|d|B|4NaDR0uH<RC-0VlehQB;=NS)0z~1n zP5m)TSLEe@(pZd{1}9aW$pD*ekX32}^fIye&E+xlMrDsdPXolX5hEWEQn6j<uK5Wt zYaqf#_i{pc{{FYSCk1dAVLiMIE2XG1Jt<YKSZg^$Cdi1yTl!8S(&@H{n4~bPjrOff z+5}t*>Qdvw@_r!QkIdk;gy6iy4BzJuhiZ2%CqvFy&gk1SoXxK*IG(GRM8lQQTQ;cn zWhuno9p;ng(Ofi|^M?IwQk86>@9P9A&`9_Rix>xn_$chqCfk8dwXa#In|-|%jNge! zD7$1L4Rf@BGsEOqg6Y(to%#08+)o99%uF~x>d!pNQfI%%m@{hlR!cCPb2E@FsIMlA zB1dr1K7^@>)<=nXfp=`n{%^P=Hy@BWM%%>y;{XKy;{*SD06KYkJ^%oaPX9XqE7f(w zbr&(dp0<uNc%HXj9gR}W@~~ORG5ll_c~xK^8Ab$UNlNl-V*<rsRkJUGR-|bHRlOCp zyfF&U$pUgvd=yEfA|fIhV0#xJiP*5sWrzNzy*pjC9%po_X}(XivOG_vp&CEe7+!5z zS9bb#Jzn~tC&Pd7HF)AIy!sd!!#FC6Az-mXf`}dyH+qm?te997VoobU;8Jh8y&{@2 zN?|TDE&%J%PDZkp6(f`8cZ%5Gz<a!krklQ**|`??bQ!HsoAw0>UN^E_aNoi{)nzrm z7i@>&$uW(IAMyLu>8T4bcFgBPohx*U_0{}b@Ai2Ok_fjvooqH#Cc=EP32YZ_VabN6 z$=JL0NBJU<r_*|Kx+0%`?wM^2R4&?5{J#1l8&0v}mw=eA|5eGHV-Ii5uB7$)&BDy_ z!n=$Gg;snR`IN_=P20cz5JsZUnxWR>w%K_|bp3dgA=jv;R|^9{iJ(ZF46wyS!icMx zd}_?T#Ns5L6U|Twi`nKi&pz4qJ@cT$T{5CTC70sRgnX6<<&+bg<zn>ife(;kxT>F8 z+A(Lg{B!!S;@E^8Dr{udr7-pLV`@m5FY-$h@xdLPXZex2n=9Zh3|Z$Hy@O3V=S>{> zY8~`1&k^Z^n1JwM({s<PW`Tb9@0S&p9TNhFB%NfKr)cHU!@p0jR=QDrzU1%)rT2<3 zXYJ%PigUs>r<yP4*C{GMu12VZs@4%xWv{JDCNg>Ql?Ob^h>R;{uYnq>09w^N@=!i` zHWB7Le92_Se&Gjnp`@ig+)P08chFEfTFzQ`j&wQ5p(zntm$175)WZ(atUxW{*V;Nt zl6YoEzo-Icuu=hJSJT1VC9ihr6FY<~#u!b|-(sN{D#2(O=j1vnOqu+DV6Mawhtag> zA!xn<8E$nV<CYsyQ3w+6I~9Hb4u6PI@b7~t*|&@vZQt-Jy5=(SI17;4u?@gUPF;c_ zXbFlt)kaxwN1{lu$XsDy$N(p2WtCn(C7#;>9<>2N&#wbfzFXZ6c6jc09Gs9Av{TRt z+Jep*6E92XP<M!%6)4a&X=qAD!3=c-XGMBqx4ip%E4nwL6ME>{Ikdm~8>ONg5o_G~ zZ(HY00#=;twFF}mMi82PA7Lj%hMVkf#64axwW35K5~e213Yu_p#C+c!B~tU)9(^a0 zw<>Sw1v?Yc#POr~Mq@A^^-tKZzuCYv{_wW|31kIA*QSg~0{q*aAe|?4f60LGx~S>h zX%X&k`+@myLFRWVwM`%7-nUB&?>kh<vkf6L4#A*DZQb)lq%X)@b%~tv@*EXFT~mAe zDifm)mSQnn@?85(C(<GZd?e0l-c#=d2wctuj`W(6TZ>S*q;p7?F3oZLA+KPktwp`E zb0bm0zRTum-o)(SlJ=QDfMwqCS6>dO30GkIArE4zJfw+ZuR9jfLHMM?VilZ<;uv#- zii)|H;woL5p|mH97oxK&jayIT;F>TN`a|itABeg;BKopH=+LgNH^SVJ4U!x3+#79& z>T(~vE@JGtyo9rpgxW!XRv1had4Q^a1AEZT%lS+pQS`?LvbZZj$Z0ox;(*=XfX5#m zJCx$Sjw7S2zq>;l*e{)<r0ixvrVB-xb6^>Fex-xzK{yfef~<1}-3?VTf~9aTMiULj zIa=Rdm|OVVvY$!lJ98s?LsX}CfY-+47JczL)FLb%2ZSv;!g`Eic7U)TM4l_^!ARS2 zhMkd3GY%KQaN3GMfvujGym$<02}vy)*;YSOR)tM~<<`%_^@-s(=SuejR^k2mMy5V! zg_5XOeP+hdWaO}q?F)97A6ND*Y7f!6P}{HUO?f%xQ~p*tU^$PXuM?q?8<OY!+)tU5 zqq_lI-X(1bCu>%xwr(*_ncKc16H;RwilJ=9{YInPhS)9=@%t>2&sO(wXFqg4r1kE$ zq+9=Ec5l1sYmD%9(53B47`FEDAZvlPkxh!O#_MjvMKn%|{VE_=n*@#{KGKH24#n}& z<N=v5qnm9uoK5@PBCw<WE^`*CMr%tvE#_TKG>Q5nL>j=l=3Rtc9#-wy^oY3)mhal{ z%GiBQkUF|qL&z7}OQ^H(Z0&zt7aTKDqE~`crG%j+zAuws`+U*i;c+jsE9>h{Kabst z_ImwOA(??_8*%V9gbNwmA8At~%7Xg)Lf^CH<BLJRc0^Yx?Nj0ZuvPyFVNw3qRz-ic z*a8611pl*DgPPXSx~dpoOZ>+hPJ}G;@`TtIGgg*Cm4!osR6`4MWr8k=CrFH6a{~jS zWJ5b7l2$mhs(;8W@&+u7hy_08aiBveHGV3JqphQATZhacQqD+0rB0nsbsldyJ?WWU z`dnEb@#El~$;)4L9$$1WH+Oe-H7@aES<I*ArV6!0#vt`tyJfGr6tw4FJ|8b_<B4oS z##BlhhRjA60^|v5m03jwzULH&nVYk|?}gWGL6*2D1Uh}aQdOaN`zYd6{SA8>w5ND% z-~~s;1e0>vzUiur^sk<3%`pQj(!HNFU)tSBsJ?wamp|it_n;0W#7MlQ%(d<ijv*Ip z<f+oSwV07Yz4ShPStP9tuS%bN=>$#$P$zNNC&W=2AEOHG;FtOYU1#p46GlZs;{E)p zLnEy8BPEtLQ%6hp$w8t)P;xeitL2UTF^EPnRT%YU`R6(A)_!89Qzk<fxtnZe!$Q~} ze{{@7?mU7@)PYmJ8ktUS?5zX;n2+(JL7Ba;n({*_hY^)ZhYa88Ie_td<etH`ybdpK zqC+;+t1N_q>om7kEW0yuL;gVp_NV~v;HZ8?A(Cf-$<qFT_`s7i1?2O<(&3*b$yB_* zEe<I&t^Ne^?vCqDb_~N|oR5TWmsXvOfT^1a?OM5u@CdFFIXJ_NrcVc{?0BA1e=N2O zwX*G4fO@{M%CdsoL2U%KQB5gL4xOL?Ax0($Mf*r|gG=Fj3VIebU;0T#d{4r1J{q5z zvc919qMAX|4yVL<e;eGp?N)9a`KAmjadjfyp8pOA^kv#k0<FR^>eoJKhJc==i4P}a zT5QpSkM$=7JzOU78fOsHL)6I(%yK6fJ&<A?#pLdfM!vQF-8<0@qOUPkDdhS-om)KB zhdvBoSVt)Upyx8*-$4rA8uc5@$M7NP&=GGqgn^|@<g>nsk?#9Bd>tS6a$`ioD)Bwb zINULQ<YtasztK_t@aOoTA~h!f4QUPSriZkst#`$*=pOAmq*&(X(SxV1Xq-<?ONrOP zfd~=trydE8@m&K@Bf(Y+-5oieoYuQWk5yMr&u_|$u(1&~Txde_yfTbBy`mE#Ye*P8 z_2f<9;K~)O)R25ljJ1Vkrh0RPt(^86zzL2-T7&U`CJHU=@zA1lMlm&)6p`AU5}B84 z(>iHyfX~>;FhC;6Hi9dj2;y8uyRn!p8~30hnMS9Cl_uwYn0ERw`q=p>y7q5fxRPO% zj~Kk{vu}{HVD&g+tG#3njr8qP|0zwm_~AE658mIr+S(R7|LDK-gO#mVcO*yk3cW8z zU+}BwJ@;<ezk_%0_E?es(}6mcoKQzJ4Dy3Nary&(t4?l2=bh<c`-@Z767TRQ6iTKS zIyzz-{QN);MrDg`rcgTqJ0g8cFc-oYZ4gIIZzvi&25E|Za8^5Xll=9a&ALohZxEH7 zutIjdwwy2KR*y^01T2r6$YNAAIpIaY9ys)y5;jlZ*`Sh1s9WyM?&rwnjcV#0>5;+* zAW<7a(!_Q-5sAJ#rmyKee%%v^lPaInlc8)se`hQ)GaU_k+*V}+Uhzj0wO%UuVQ64% zk^h`__^<*{qaJMcT^zaNn8dEdMvOv8ONQVhSNp<MUH_ZpNdJY260ZgVDn9#3Ge@?y zP<t=uzWa&V6$12wb|oq&YX6DDL$e0HTI^NcFcd@5^zsLqE@VO3?Ym9k{D@8z_5o(R zhJ&r>oQdR*8llxz+fBC_7DV<!2;}HlMKz7fH2oiD%8>u|V@j;B5@cR>ZXv7^${B=m z&>OAyF|&-WB8ckQJpgIR@=~qLGNCSYDMTyCd%LhPnR}WKi?H6X#I>Qem#=X?ch3qP z4sPF|TGnXQ;H1?NZh+8R;G<WrB=#FWanzsLhYo{H{itUVHZYeCT20FGc&JV6$zZ0= z?r+md87KY%4AA=gVwOh1cqbo8*fhm>Ff&Z4>jr$U`77csDooJ#q-_Z0S33W1gGaRk z_AMB)Txda$3pXGJ=w@KMDed6=#Vs3#TZf6V!0)lb`Bd&V1Z~{6Alw<h`_7Z?C%M#? zgE=fTXC2|~nCBe7_vYQ|maU=gQ{!!+!#zjAz|JMU%iKZ@NhDo9L_L3bL0`fndH%qY zMPumYEB|GIXp=V#F5hK1HABy<0R=iv7?~uFFC$I0v;c9Xb<6xSV#`~h{aPhH@0wl# zh;d~7F8{LuO^$qtDR;X5pW%CH+bux5@t&DjM^F)afBCS5ioLWocKubF*a2qo)eai8 z%N4VI8yWAh0tq~JgH0m*CJ;))Ws9E`V5~zKk2(CqOLG{L2}i`6g<ii7e>Sr3(~Oi} z6%M6=JF}M6Y^XH3vwdg7C38t}xEg2G0z3#8;EE&tGNWEph~j8Txhh3oAL#WALT7D+ zvn}f^=*8w&DF%1ZoBXf%;V)6T$ZjQ2v*Jng>FD(e$6Idl?)lNNyX^0KN4fCo?2$pb z;0W+TeLd{$zGncJKJ6nB2C9ieqi(HC{m41$k3Sii#((Q|cYhS(6t$UISMN?;Pkvee zquz}W5{*6VDgKapz%><AGfIKmslu3e-@#!UkoQ$r=ijB+hCyv$*A1TJw(pF(W^bpz z+LSB=F!n$N?`t61XX+Ps<dfSggHDSz{+jrXK)cv>$ho7D2_Beg_@O-@jc_np4b<RD zd}aONMhdA7&6;YK{oU#T>hGTH?<9I=p%Rg`;f?G>tl^pSGjo2y<a@o+y;Q5cmHQLn zR)0>3OBEz~BIy5s6^#G*jQ@od>Y%S-007M4|6s+WmPfRzI`(&_Q%W;DOMed#R2U!n zynxAnXeBY+_9tyAj&)CJsz!>&ym<bQxV0r@L*p%>b~<ZmQSI7G*wlxZw6PfOn$byM z0bM(7rt*@ZT4?j8+cj7A>r|_KnxWZNW-@@VwcpEa>h<Z;+uWZjryUm&1y6?pShUT@ z=EJlr?z@dZ#V(R|?WHyu2)j&~SE!Y%D}ke|r)$;-SwKUCk3%F!p}X5n$M5&hk*i=} zMG9WOBnTi5AM3jl5O~$3IQ$T_Y+IKZb!{<1jjv`F4K68=2pNzkehYdI+495PY6A|k zpGZNRoCR()A^dgirIWz_EhWK!QWP>H7V}F~3-AVup<{~t6y{Liun`T8P85Bj&<gV5 zyma(TU&|I;0z-7hHvO%?!o|TOW7hmWId$0^J|{YZ>`)bdRW3MzDg*~opp8#4ar&v3 z!yewQpj*-$T*AB!7O~q{*J5!~C>!OZ?I;=|41K*;$Hx>`#5jN9E~JDn{pw7!l#Nq4 z5R5QLfLjyd0ruNWEA6#}7MxcN<n;U-8l;*LC#00TxIS)}Whg{r*9JuX=Y;naVbs!# z@|Su@0c%y~I4KCR=qmOcLgdRYPvdL2cGq4P{WP>;Ia1$?N#s18xs1?(hCo%xn!mId zU%3d4wbn1s9aTdJk_rldt;+B`$#3``xbx*8G&sgOW2N-s6F!Ntv|Qq+%7Zm5MC3!E zvVqb5E~j+BscJ!Ot~d(vk&!rbpVX?0_{_i=aXuuBE@Gx?<?{o9(`zM~p)EU|xgNa* z9fS$9cd}-r_|AkDocWb!_yq;f1m`eeS{SJtZrAJ*M>Wt!6VmS#42bU!Yo7b&CW6ob z(<}T#XEfZ(HJ|*H8e<E#2Nsy5hd69F=#ZtLV=RRc-{yh)VTz=|5lPf>!(8%B*JF4D zjh;j_cfY&!@YuGAM8x}wCw={a+NVK7G`V7+6_xa{37rFd2}H%ajmVJT%=rg4$e#Q3 zzxvA<&SfNWWqfizxZ-YX{0vUGW(Gk-eX50v)`-kq|MG49u@^bsl5jYHf%a>1sV4<x z%$9CehnUf+cwp6u$HwIE7~GB&fCGmjkZ^c`!R?s~i^CRlq9KdcE{!Ll?6_m=59q#l zm#p@kfStXS10T+Ua5g?Nw*7$`YMzd{Cr|CDXSPfwQg9?V)iT-=JLTiQbMq5V&i|k% zv9a-%AI+B;ZiF>3e_BwN+vq9s0yKQWTM>OAqLc|~2-Fd@oQoc-k`(FNc#=6^er-&j z6RJ{ppS>V|^w|m`(Aq2b<8%f0C%GEyH~keM4qu1ju${GTxB#xL+>*g^K#9VA;~=_r zZ7wb>Xz80vpT@9NQ!VcLkMQhBfH)}o?aLkuM)IwU@g(aIQ!h^5!Mhx0S!EPNP5cHU zTw3HgD7x0qUnnf^B;~4U{vb{MOF;agMpb`KGuen=IBFK!C$`?I#y#Ey#lbX$Ah1z0 zAwnfO0vS)!f}CBeC9uc)Koc|69VL_p(^wG0leT;NpeZEW4RlP@-C6aPILriXf3|9A z2Q!zx^iG_*La<Ye?b0DZhY$N9X7+W~Isk<~dSC*dq}!G~ZQScZP~0h(qDUAr0--SL zO_Lllnns^{T<%Y-fyJEE=%%<FAe3Kk=7{fG{Fyb|FT7U{LgCk-Ok`h~jB#8O5M_TB zFvD#<owZvr*3CPf7F(J)J(uiPm)o6r=;<!V_(}OIX_so#ML^6Q1F5s+k2Y2fI&S89 zM88>G|8<*<JpOA1T?yg@?$6k2VKV_Ux(bpYZ7e8+N^y5;muW2k_fxx+Y!CRRS)%*{ z@MIHY^}%sM<C(OB%Q{Z)RaaC*LdpG^D%?5H)nB)gHC*=iIqtMU3yI-M#O_%kC(0+M z1iXb#Z3ITAk33fk3Ritk{C8ym-ar{^^j+HKNcWc{o)YX<;A11}26T$1$jwn@{S~;d z?{zhTyeb}O(mkenA-(LFLMMc*VPyHn!dZRkd^SuHkM%Ub4zkZ4!qJoMu>d4?1wUll z#xXvW9v*-v;?P2rg(}eqfAS_>!O5TyA2KwOBP2a|tIAWO;+071(&M10KWL~cuC^91 z+H01(<~^KQ*Crou2y3mn!3-1Y$g3RUI`^66Y7`AuYncFTNNp*$?gFan!x8~86rbyv zkvIaHB&}w96pf9h2{iNPnX}?MMohpT#ZDk1-`OGvoj@UG=ch^!MAI_Rp;0LxD6qYf zgG5wu{L#h>J8U1g-UQFggEi~G5S-m8A)58Il+O~28<;0lzhv9JT9e<;t713;>F|eC zu~E<mhs_?BovBe=rbV%pKN#x?yK+p0X6@<?ZVn%JXYwle#w=B^+De7SsmIOStxw;b zXN{d7so1h=6<2QqiOq8@W3NoJ!jMFTXC~Sux4;-D3kL=%zgi$xWjOOl@sCyuVrd8i zwi#5jz4-2m>&Sv^dHN2s@;!eTSGpd!$!1G7tN1hT-xpfOq14;8vv}rN%Ze+LL6*#& z4ZVkNACkcNZzkP>!4ddh#>Hn#)(P)46F*f%UpKT*u3urLJKF)(9v5$rzcV?PIh;Pa zei2B*qkuPK73+yOydk#O%IvaEvn)X~5U}18?2Cs=4|SYhfBoT7DEB7J%iRZJ2)-pX z5pmT(kY>x%fQs@yr!M)^ii?iD@VuLHy5kvs8}hj9pG^elAV@;BF$VYDV(n9fSTDO% zSx=sVDyZ(2Gw`I5;M5))kqhXCWAA)zj;^3kI;!CkD#luJ(Sn?-{m`E+A_6oJl)@rY z;US5Lq*SNy2O}qKEcsgv7V;A#QwaBcpFwJSZXXigDTkBWMcEC^dO|=u&||@%%o2Rj zTcTx<AsxRr40ZqYM*O8bKPI_+H(O9gponO>y%%;5^-?Bf^po~4rh<6n#Gqgy`GzFY z-fk|#B<ap`ZLy3~<3cCQ)Lzv_dA``^aTBXf<>Ur9$6P+E7|TzGuwQ3~v2-EbLs&lX zR3_<dxvyf0qhA)B)kqCRJ5*x3k6pO=W3TE;sV=)mGH)FUEzSJGmttuETZo#w<Dir% z(^?|Jnch|G-FWc=HgxmB^IZ4Ji4j&Sxq9KpRb{EoS_kc0_%`5>PQ4llZ<pWZchpi- zvdZac15I~t_%GA>9))ThUlnAB`Yiuz&{uy~L@4L&vu()h`gZ%PQuOSIuZ5f|)YpOJ z3BIg?cM`dCZRI|u-Gm#&gMNVO6)4C7sFR{k5ct>1ZTSwDFGtoZ3`B{Zw|!;W=>(>q z2jw6gcONY1<dN43xYLE@{k20k#XvYP1Mq;0-wm@}dQ<O01OAOY@W6PN-R?}*&C<Ts zGqkm+>SmV>_(JMSAnsBw?)y(N)&E}-h~PiA;D6C!nWf{_zwD>r|DnT8ZOe-P1)bhA zyrw(t&kVw5PDg*pLXX6S2MYz^AjgQ{h72%KbCTXj<fS4;5ao%p$}@?hppfMlHAE&0 zM)ZPEDU#Ab(>-8F%WQkuZaajrT$=t1Va58;U2na^7SgP`ahhK@E^B#RvSs@CBl=?x zxb^Q&rda4fh3tdV>I%=BS-ftJYW%$f2cV<;Nj}$}a#6y*Oiu+sLf!rq_L-upmQ}xi zUORCC{JRsL2Hk1jo%x&S__aSL%)6rxn&(E+tDROGjeW1@^Vb-xphq+nyao$a!Ainb z7>{2vB?ix`_%oc-0lkEX)BSoZw~NSyPmplF3MZ5tXa+P)&Ce5f$}u5<<(q>iL3}ZV z=ql&N_bql`l<`WvRKpOut$^tH<%1v2-UFT<s!pTsBlB)WMh&?bhY)}eZc>qRX)!&? zRS?aj!A>1tJemtiRQ0!(vrp^$?%2=9qs|Qp3l!h5TgDu1L*N5pTAkz92sCJHZVvSD z@7r{kRIwkD4Ki9-7<s?$;M_L8@hVpdrbxl9u;FJ!(sy-SvG>OG)jzof3IuTQq>YqF z^7hkjT^WfX9rlnc@#V>ox;ln+UM(C+wL04tIhETV(Pi}4TJDnjKtB)1dP#|ULKdHv zN9SA+sH|-`?~b|b9u@C!zaw?kn{ma<K1((!KP?ZTV8N!Y%gNA~M9>0WVurlXM%I`} z?x2#i`7Np#^cv5-CWV2oB@jsa&zW=jthX#{g=B^%sROea0HBu;4`V1wZ7=p$QoF0M zkJUla<!zj*&s6%&o3{WRLK!(xC~ChaF{@D#rO^}?<+RO`HttQb^K2;r_f|cv{#dEG zQx-Q>c<S-i+OjL|v{E;HgP<@(&K{b4(R1uYf`i^Jf%R_d!QNh=!gyK0ib7V<Vu}=g zIOQs-0a{Vaq|#8TxB#|sX2(vP?HVqhuw<gc9#)B>+>4JIb&7E5FrpdFq%#@SSjh-x z&N_LnJ8D3=v7ip53c<k?R4W`%o-9FLI{|6=DZYytQi*FYKA37s@AOZyzi|)^-E_Xe zDrg>v+1c|rA^qFg<$T@urHw8qmmn()HEmG)S-u0NE~u&o2q%9Ip33*V#{k1N)E(rY z-14vkC&+UFO&rg6n14h-0qD=Q7?ba9l$Z?&`fJFIBBo7Su>JOevRsc`2H#VaTkyT3 z=z>2#p|bRoCB3(0ENG&^6J}(#0zM!F0Ebx36In-zdgYJ{*D^nj0)j{3Gy0f0?c0#A zMze(<XBmjLy!^^{xKjXPwTn+;^R2rfJ#f_;kJ&4=P5_(GycK^ma!i&PsrvWm9wqFu zZ}bC(4m#5<Q3U$)rWhRKzr*V@wvemo(24rNAM18OX9Am3hR0R}0^{Tjq_y$a#0u)i zFrKy)RFqQZbseQNqeZQjDxq#`Sb}XxjD~G%QW(3j>v7RvxHe^sXbM3Ypa!zW^u`yB zCN^+me&5iN9*S_&VQy!|^<6}gSUZ_tVk!i!m<1nKrxRVPWbX<btc>*=x*miu&B8tD zNanX>nrcMi<2fJK=g5~GU=Hs;@zJ#fxiJKde_0>2)Dez8NJd`2^2A5;2lk0I7q<)$ z(sup0!St^*b7|M23fIK2czMgJ;MbIqdnHp0DWu~66^FMHX>owG1pGq)uw31Kqtp{z z=Wnt%gvi6<Am+LeB?kz;%H-V1^g5=(bYlJeIpdTM0xyqhp=oM;VAMV~df>D}I<?@# z9x4Mp!Wz^tm?p~$W!~#?>V61Xm0C`UW`xwMyh09`0A|JlwR^egYt8qjf^+R|$259p zqvwafSlr|3g_eCKALbJv7l^B{t2k6T;4*A=mh$?t*nsz(Z5WQvoaQ*%-Ajj7i^EO2 z7ZBz=Cy;wMgZ21p2leOsYj+f@&A<5Wdozb^nVZabtZqdyQ8~EcliyFGeN_qVf*_n{ zf-SMHR-j|^BOB*1Q%o}q%b<FtlC_+Jc@j#Q82`YTMEoIZ`9^op03DgU2sjIL1qdmK z$Jy=}_eq_9nS|eA5&0dtAao|Jt-U0iMrs<mv<NbXvhK|e&)3PbS5Kf^bs>!|R5dVG zk_Mbjw|G8McG=0W%sk>gCOTmbj1DM4Y^5&?PV;~rOa?W7{3_|fIQ@5>{4&D=?fQ)| z<5RkRrUJSr?Lyd>LLkW7gyFfn`c%i_%niBC05hj=5a>u6_7!GuY!8xoJ>w5yi(|kI zQ-#i1Mf`k()USP;MV=>SI*iiU0&`fo4K4v9dF)xUWJzau_Eo-{{jSQBGBz1>hehHx zL}81RR{qwlUr6MHCH1E+8x3s}1KWy!jX7I>YL_(c^EYwUis|CdCr5=4cni`)pKu96 zFsQIP=o&*1+uZ`1j?NW;d=%F0%g>w*WJ(Ss&oAu@I`bQo2i*tV78&}1gP?4AwETX# zr;31mSV;PAwAS5nt*YVu@5a7ldu@~2tRknGJ0=j|wiG38c_kbrpDUdE_#|-7Aw@Sb z!0iif47Y|Rk;fF_;VGNQ^L2MY(uEp)l)j(JeVkq<E#=}5tE>kD`PDb)-luj&GZ9l= zTijY2A~m)UCT#f|#=KDdC$=J2+|P!^tesVXoVx?0xx8>yrO@VsJX%Mk%-!bx!Kq*e ztZq7|pweS10Y{p?c&GxcKU0;zVivCxp`6p<7w^xCjKb7KTb}hPwJ3;wk(KPtEzLBd zjhvtaQRq<&!ies#1DY*tWuj)!=cdju!F9t@sDkj8r>IQYN_bc5L{b6_a12h=GT7TI z1}{&rA2JI2S;$3%%YFLh3L)|Mi%KUpjhPp!Ku*~3v#1<Th3a2^?C=)h7$6phud7#( zBsMy~)TAAWgVo(=H7k4ZS^)@g5iF{qYfV%df#vfQU}MQVhF0Q?3G}T#nlSCj8zwFt zp3=(uIZx?z*-vq?_%xh2KBSDWIFJ7HLD^>BZC~A3m30_;P({3mh{ZyB(hbcAI=JAD z8jzOV;x6nG_o5r59HxFNOm>7Fg~!FZiD0qPl4Hh}6|*{O*B~lz2%GG<=pNz4PeA^M z3{?^;T^=wRCih!9*S`h708$=!MS8QgRq(~-49^9>ACkVAm#{UGl6zNy{4Hp=2U!g_ zS~9imw%8W$Tp$kg>!7+6c8IbX!XEFsKRO=p6xERFvOYBr!nQ*kwlN)0jou;%NjBao zN9fp9{mCxqdbK@4-lkeH58TzfGI|Zy!wRy0Dfzz9r#j$_>8BQr^9iP6gXnh8l^aSK zQQ9NV|NaL5D!mSKn+u^@BMoF}f&JQ{e($a`CV46JE09w5p|3NnW~spoVX3x@OB4kT zLuBCf@qG_G><iR6tr(Q3$C=Yu&`01uwtmv4FTltK&u;qy3X6SV<O34}%xVg&Ncj5g zFR6{itfdt;17^2<W?%=VX75)+^yYU-0({)#>mhAE6ta63NScY8KQ3qB<io}g)@s=K zSwZt`kd}u>LHMV)Xl&mb>4N_nfZhg}qjbD5_Ng}sk0v{k-p0T9T}_#taU;}G?@f6& zRuF^#%K0S%J)9+8V{bifd-&%6G~Z{5Pulr}a^-_({H!-Wm)&6QxC&q2Da@-53j7UI zo4QM@dLh=6Mrba55u`ZxhcIvVIK&YbtsxAgltStCZ~H`e4FMTV^|PlA6E4G5G9J^b zBt(t(uV0>|+Z<wu2d9NL@mFGs3Q30|Y8TKhZT<cJvY)ZaoTr*RhZ6#Eq&i9&BUDc5 zC8Hi(w=iA@Es~#>3ot9e9GQ0av$MHlCD4M#oqR~>X!CxJdvGS7$97@(`asYdJYnSB z(|;b}$<?C6g2<|z@k<wJ43`zuj6w%_NE7SuOZtbV54og%8vzVEK<R*wadeSsITxa~ zRDg^#Ua%sIMe_(+dOKa0<tgsq$YrM3mJ=wx8{35!&-;f5<k@d7n<Ucs>;6Wa+%@8D z9x^q#e{OnPN2dTmARiq;G-5FgO$3f~fau4eKWA>eS_PeLbtg*xK^GsdH`2l=N0MHI z(T0X|?#f8o7=6|mfjOP_r~3#6Mf3|U&2n<nt{tTzL0Bhad}jW3?NYao5TTEa&0i9+ zCobpB$PPy!UDXI2+CA)nyvj?!?qkxpX>RRM*%v%@7moOocoKCsm&V>CT+{)xlS$nk zUUx1I3k4p+>w&zgM|x<xxQ0$Q-Q-*Pzyj<N0rE{XZk#^%&bKo#%$mGR(8#9d!bGfm zADgt2DKh5>OK={9{W9CRitCzZ-uM@9SJ9h<pKUCzz51oj`SuQ~{Yd*sHf#mZs`_tS z;zcZ+WkIoxExZi)W;R&h4<(zI_2%*&Yh3o8iGh#ZX$WRXlD)O|pd{_=PO4`K;}deI z7ezk;us`F$Fvt{7o1@DZq&2gMBl9(9nuv;(;wwLXxZGRnGYG`rGLhWlcXPjQ$h{sS zzQ7`H*}`WJ%0>y5B-!dSP@=i3P_11d+Y^i7s@p)jYOD<|Z_oFa*RyFfBU*jBDzY%^ zL3JVxzQW|?0&8$?|6V~(gB<@7#5*l@DD&QFxL%Is(_B-2_6=6GhdeV;rh&f2TkowV zUtPvwE-Fl0Wz-A$2KzD7ns~T1t^NP+yn*~<|9d?1pC>9hze>yi0G5dVId7MlFsVAK zY0uxs8(!9zR~MwnBjTW;Iq>C_)F1;s_!N{=`!CTfi1obO%r7z9#lom4;u3~B4nNF~ z<`pC)<nTC%seelbju8W4$!Vn|fdO%y%Uaib$6i}b*OyhnS7&X_Wo_l}T>>S}>Tar! zl|PR=jyI>?LE-xu|6iZ1H8^T)5z|b955`0R@ZaUf*Mk@_=8G0|MPN@yRM2xfga!f` z_=1T(A<L@;LaPVMftAk1_s$MxOy!IQ65l4oKm!^;OT>VrK=T5s*}@T`!}B*5sQXp% z{XLw#Z1D_-<MOC1eHfzoCfe55fIoq`$2mexUu!U%*?g)RsG$}#pc50doFO@%&i&8T zO2<b*8L|x71MFp~sg^NHFsG8>^sMkfjtd8{?r4`(Fx3(P#s@(qSdf8rOlv<5d4<Bi zQ|oL~*tk7YjpycWa2mFD5MLE&vz0gSR$472zdA}lt0J|%RCf2)i{?aWGF{cSS15b} zmouO#ZR|)*S0@><Gr!DeBy6eQ`_n(`j*tuu;xA-PAO<i*Ai;!@qfD^zA_<~K0!+J* z?s`7Uv*)TeXs@IAEjBGEouO&Tb}Mg5LCKKu5Zr%tmP2^q>ftSA9Mfa0O~vc15!t=f zHbP7iYDrtH--(SE0z$WbB1Gv(bO#z10ycrR;Wfn!^whT>+EPk#9K|0EI;<>Idv@A7 z_u7s2m4))rsrIe(a@Yd$VZu>%O5S)(){~`2J6EJpX1min3+j{Gy+zrwV{CN1<CSw9 z=MdH>buE9f5~AP+>n+ivT2><G(}xHhQMd@7XmW@+U@Wdo1NB)r>RP2>E3w`EILp{u zQC(0D0xB;R7Oq>ZOwHHvtW|jDbLQ>$Wd+;s&=orBmPkzRmPV1c^*0keE*4wlFCEyg zVgyMUA{z>t80=k46#;O&d94qLvpIb2zG6!RneeG4Xl^xt%?iL;E@rv0&0`g}VF)Vs z7Kef&gxW$y_Yi^rpUOSVoE*6_2BcJy%YoKVlS>(nl{ZFTXeW92xwzZ!2xFZ(-_|Ho zbQs28F$5N>;w`H18d=$U<<~)obGI_^r(U~1@N~^_d74z^hd(PA(L5KC0Za>7qbilp zeT>`no8JMDwX57kuviR{+Y02g-5^TFppQO@C#6GLYpF4rL{Dz(?UxeGcENKd9sGO* z<>mU<X+sU=*+J6c=NcLZcgp1l%BSA8OKpryQ(WsB3S`+yDks10gl9>gf&$;5)V?Rx zjh-c3BHS2Br6BA#6FdvX%wLm$rL>BM5!uJGGYLISZ`RMZOzoiUgjMd-wVnbv|Msgu zAE}!2cDJlIU%H1FSG6g+XBuPU+t_JY7a;)Pl%8rclHTIvJd?tFleEgSM0(A?<zPiL ze*hYgkne{@tNaR=o=n^1v{WfC-?4>zm+7Spt@fB^88o+6Ur>`_2d6jMUac{s?$T|z zOhVql7eO^-G^g_ALLQ`$a;?!O&bg;XL3W%7$%_@3={3RXifMIe`YZXet*wC1MegiQ z_nSM7Jb-W3j}bni0>b1q)|8{L?#`;ZLJ5zty~~def0w{8b;;<Dd`OK9#GzD#Y}xpm z^5c{#!};dnM<ucXysUVOqHJiVz)gSQeZB4;u9{v~+s3hnw1_m~DN_U-e&6^+jZJe2 z!Bga$ZW_mxXB|5#JBn<oc_tn~@1CDj8}73P_U)N+wRRy1cE?Lv!9SN1xhAT!%6fgz zh9*iM%U<6Vo9+v$+q;UzaG43kFL-OlL!D2BZmY??F*8M=A>@QADUn7vDccY=dTGrG z&r+zbGO^?NVC&|gnSxq)#uWs)E55IYOugXOowXLxzFMQitMcX7Iy_4fYB(*7VR3Lt z^1`;cUiUj38WFfjyPI$Qi@p9wm9w6&M622D&ygT3f&K--2s>$z#YnYNg7f>rY}!vK zEuOZ?Bf)i6|CuzUl?G=yZU%OhaxJQ9zx;~>^VC@^l0qbD5Qa^%OW|%WmoEebzpBjG z-X>^&#tbHh^}WTkjE~a09d~E%uz3&cqFm^JM8(tSnn<v%q*jgug&aO%!3O(V1|F8A z*=Ol+`n6AwTNc^<IC2BcnPfVX(h`Pi-}$QSW)cO#29kdJ9g6YeBK&LLbyS&gvO^g8 zbJJ9fV`!Uon@pcUA(!3g=1bqaMeLxwK?L?_0HuD*!SQKFM*(M!4w0dg8Dal`{}eop z`)Wl4HO8YxS)wo1*4u!hBDA`j8oEE?6STX?F+(fWrt$1vwQ?R9gKwy%kvc|AB*bCS z-7ixn)vvPEPmX5#$R$(|1Dgby9YkBLkKtGP*Iec7W7q(gaWkXT)9ARGsL!#<rx7>! z&88QThNTgz6%^2(l~3!OP&*!v+{=+~8An;Z0IDJQ1mudloI7Rg+q7OnTK@E4z~W?v zGohfytMf_IpxZ%P<#-t6sR|**8>4J_t}A<5L(Q1!XPAwA_U|AC_4G<IpmyyG6bIc~ z)Q0T&U0=?x|NJ<woHLEWJlA@bgR~GK?}=dW^arSLv-1}O-4=^3gjPA|2Y27#KZ|~$ zmS`%zsegiL;iTL5Iv#Lc`GkvlFqrPa_IOa$UN2iieM!H#_(Z1g&i+AE+NZaFGe<=# zO8b!0WeTsp6Z=Okvp##y!m#{-70~)%rXaa?q#2vf!ST&FoMya~NF^C)wX?*4+H^bG zYA_espzS^K2FzsF+0N^voVznk1RKs>1)F;sL@Mxmyx*}drSga7U4jA=Sw))ZJY=fI zJyi`Ql@h@Cx5gRKpdY(wQyNk(o78BXY1GrebKCQ(MNr0Hn_=_f^ghyM<ui1t)661h z0YA+4lw#?EwHK#N+wU3r&TK`5+PyY05qd7Z&U2;H$Wjj54!8ybPfMqwvJJ_hG)t`* z)=981-=MZ_??8yHKxSqA*}6<_bG}lTL`l6q|0VCB#OY~T)7=owyE!yEf=4EYflw`3 z{PDHZ{*`QeE(0gBP@drC7n&w}QsYos(doUV#l_li-lz*I5Q~app#i3W29DdP=9exl zQ|e;=#ABW+nj6+_b-4@H_}6nB9N=<XxT$Zi#VTV}TcpfdJ>4YG?<^^rqoG(s=csu) zETfPgE|^-nj)P#pLL1418NhMWHdqlUqw4FtV{?G}8)O<p_UZ?;760E+xb?>lnu))< zn=5N}6Hqm44W~<B^jly^4R>6pzYV$JO2=^4=GCoYaAT^s+#r|OpoWrAt(V`}Mov1q z6WvWqCF^<^E+;t%z_P$j!kKc|G$}1JrAJv{1$YnfU}4S>_N%WQ32W#T$r?~oj_;Vy zsek@;S6+)`f&YngSy)Gob|QCl)p5Ig`r_Jmrq~m{9AE6XG0Xzb!Uav_yqGcBy0Nj% z>-)HKOB!5D<ht3&$#Pt>l_nRFFjgh?dC2k&Kks1?g$P5XiwatNwB2;f#k{**O{k5$ zpgWR_z|^gtogjC=myIV1);yY*P)!#Pt=>ECriq<<JEn!^OM7;G5P-02>64pDR4sgt zgUZ+#w@D6imTYIYG_p5KkfZDG++J&!V3c<Hwro<xHG;u%J&EIC@0=YX(w>9vLm836 zK?n(d;YTzmvkUPh{scNex`E(Qvm?hCg6IrV2J3EWQSVSvR0l!y(_a>h8H^~?U^lue z|Ljb#W@RYmt-*iC9vY6A%_%V|*DtY^K<-*538WdklKP7c_OzSu{!7_VM)un$%$Vg) zSk@$X218E7v#a$y8zGzw@Npr4!1UtdlPuwsVEauz^R>X<-X7`-=dTW0fi7wWVzT^e zBnu;MbDXG-Lc~O#5l&Wvt4DhIB7>oz<*-uGXC1(UMO(lwEIdLdJjD&Ss_yI7(2Nbu zwoL1Li72H0o+I;~8<rJ-vjMW$jc;{Bb<aZbQ2`IG%L5~dig)P)HIG|q8gfuINAug) z?^c#5>k5I{!-W*YU@QuH=cXt@L0X8R>cvNDwInL4CZ`cjm&?kP-};DJ<DMbNr>`7n zo&^*C7yrF5#)>a@=Aecs1ACwUR|QP|IMnVVKkRkS=FQVKMD;b3peiuK?)x+N2n-DY zM9HyHp3BIrR7VeSN2mf<n+?zF$cFW;G=+M9K}XFD*7WKI7s+qAD1;${fKz76)^2G7 z?zeV}iC!rV8>bGpZ%Eji>>nh9j&7ccm<8X*PkdrNq^A#=NrZBK#Os;P68=xRmgz6f zALZCzh$ch95#cFQlI>cJ3LK#Rcmc+uphK7d5-D&RS_y#fAtB<oSO8`VhY5LY{fl&g z{5S9*I*Fva+T~AL2+F<pBBiCFt?A2kG)dafjV64zWJ^mS!g;Xz-*oOz7?rFS;*DaC zx8Jqx-eJV^oc&(m<RFSEj#v$t8e@@u@WBYWT%hs#ffqDgF%uBYZ&BOsk3kXk7jHPf z{qmr}^>)yhjPv+LvgYHtzA;Vo8&UF(Sx?4xr5GKHK!$=-WQM&~URwK5i)+-$Lp$~P z!QT&>fo`V?hIB19CcDdyM`S6C@Ky+Lp#RpBR_m0kV>!g!<eDf74*vR;)HizcbynN| zY#g<;Bc(M8Aq317!yiSfxlchPa#>TA%)ZC|HYfjBJc8k+A{WGk4#|H4UeKG+zi@<K zNR`;MkGdt+In|&9pDyG&2DXY|1PzCy{BFdE;ng@tI~hbRD;C%PI23V6{x0l(nY6>a zc#|Edg_i?EI>pitTNv~6r?2OlLB{E0OK-|*yf(kTKjOhx0{anxdq(^Ce&i&$ub`pJ z2m3xS9?$h$-`kg+>a5`>l0}K(|D_x^&-ni|@zp_bFu|9Ly98O>0>Nd0#bp;ZSa6pF zC%6Uz1a}gg00|P@o#5^k+zA8?1a}q|-{ZTxy5CjJzf;{a(^LI=`n}OCLct0CUJ*{c z9D5+Rjt55Z#E-)m2fW#so=S5RQeD!6SxR~85HKbK?>p6IU|znR=w<|FDq+92lhQDT zJK@Sg&z*F`%P?6TX7`gWsAndwHwK~Ne9yMton9bsVcF`A1cYJ(WA0<MwYuvJ<&@Z^ zg(Gs2%FRw-O<*^0+UhE8wX`tnP=jhVlN1wdIxo7}1;puw;^mADk1Zj?dRI?F6yJYR zTj<e;$}Lw0X>kt~bV@AK@jmp;=|0|@Pnr_goM)pGb^*BqwjeoZLb*s*cyj!Q4186~ z3J0prEXFT3HyRpAv%{~kC4aMZ0Iz!&)8H1@m2;8Tc$KeLgLeTA%2SG!?X7Zr<gf9^ zWU0?TXZYQ5z9PrKim=Z`6Zx3rY=r;FQ;jWDb9rN$T0n2UtGd9vH>G||KbvQ(=<{#h z74i53Q3M2a0#X&{Ka|Nt*NbC2OkmXPno9b;;iYG(Qph@`3m{&*e7iyS>9=T?$1Quk zKK>6=pX9M>c+KXbUVR8LRY@luWvk^?$uFtikvpuk55?W-k0ig7|B0OblNX(P=L+wl z+r}|)=L?cLec60}dW}I4iD}tK4b@h(t;V-GClAh~p1l^qq$!<5Jy}yNk$igPtw0~* z8T}L@pkSi}O0b@inHZpO#Pz_{NaN3ahrNoRT(NOcFkHiT*r9UOdmz^;?zHKb{G3Ak z&!#{^xhkmbbYg-knq#E7E`>bkXO7al@Zqu0j<bfI$-gSL%U6YBv!*_0)H+^)Y@&9H z80MPTA{Bia>KGX}jFnwSai)HoJ+E+n6Na5bZg(F$I@vbXkRq;#2SD2Q033lf#w=oN zFbi%|)QVC74?44lp`28fynI3MaTL~d_zi~CFl*CJHc^^{n8tcOZV=;Q*$1+4p3^Yj zjYavKR1Bvdferrj5{K^CRqYdKaa=(bvuQ}lvdLAHQwkUPfGY&kCEE}&YUed{%W7PV zV!opZR$x6xMrNL;5x9LHQk`TBZ{KpRXHH_SK=oZ44UviR36T0d-ynOw)<p<JKI9}| zX3}7n@ugL7BDDAQd{=dH2dn*9X54e{vY_W#2pMge<V_qP#`>c9c-t@^yG6Q=>Hxp& zy~|d2v6e;tLodDi<A`#i)3n)c`Oyt$nQwp<CqPps#!j6PedV$1^}qACsOw5PyM>U2 z>mTkYToT;Gse3hm&*3162F3A^BQc&qjk~n~<9*ntKfC_q-#niRpt6iYr2p8u@QuYm zUlHr<!M_-Nzrn0`?u-BuXqNm>6`79YMWinB03D_}Hd*Uk1${tBjqb-uqFhYRwBGDK zHR;SS8r|<IFe0hQgIT2eSnBH!GDW*kD+*cP0x`F0qZo1h!{>0~Mz7bu$_y+DFix#p zWPhsB&u$ryk6q+__P~-=yX55YOCZGl={0Capo@JfOO%!p3kYz_U4cLJo~glWOm9It zr}?aQtcf2_OLQtz!WY{JTALxid-7xQA=Uy-HAO7qq~sH5pD{91iZtdP_D~twn~ttd zgE;AM-+W@z08FJSm1Vo4n;?^FVmaith*e36mu|mk{m9FqA&&lmOH08MLqIK(q)KoS z;W-*mt8QUagWk?L*X?X3{joMmnmE8I2wKDHNqY#2L*IDDb~h4@rRM9y?C~MI(xyog z33F-6r*CD*5d+@N8`xlf^j=gwCAy)T8X`tsS?F)F&^WAcz>+h;P@c%s5Hvd&2k+u< zJQ`lm@2O2X@e}I!L~hZ+dPTv0*X=asp(8*H-aR1wq6X~N_;@on|C*#gNBh9taqqLM zDj|RrX8}OT+EW8COGOu~!ZE`|jrXFJ3I<EjZ>F-o`{*PGj~n6-pa(br@RQ6803el+ z&1Zk>WnJRE9UY8j$`Dy_w+aP+=AgbHx6My~(rS~%z6l)kvI6>8D1raY8H5n3tY(%t z(v<5D#VIFo?z-9vZI(IInRlNtn#~NkfvKqo|E~+FVDC0+s;C<bO>_oydt4x3eA|Ek z(Hi~Yo01m!#yLpW-_oKmG%J`}W6MlIykRgb)M6qh!zW;z7Hc6lNsi4Z;lMukO9-PB zu?LH2;`{mZNi;J8M#8!DH$_Y{b=1_`nx=W;qCa^$B!DD<#~#Fsw_($Q0`8Ax(07zz zAUEJ8%w|&RvksBfb=Zc&v~tMd2N(A%^dePrjnR5(L_-<&7Nz93u$lta+&SGZ81`18 zq#({Yvbpl^k!%uMK<tke@$1_HnbfH6qExxB(T4WezcmW`il#X~zK#QD)gR*FEgVtw zNu2@Al32To0J(2<$&z6eL(I7y0u?PbSj#~)^~G^!mwG<AQITVp9u~*Q8dw5>u{f&k z3Q;sVR6|$_cS7lVF8oHHgj;dQy4^X+5%qNhYf0=}o(Lv_S!KcOr*EjQs+3<>mT|8Q z4^Gbkp#3SchbRw$?Ey5wT<QRq@C*l}us`2mR3Uf;VRx1n{SS<4e9v-r&-UspAB85_ zHrNr`8P<FlN(Zb9Z%}dQV#vw_F5NZrp<>GMgE<2<KUH{PZg&lKvhq<z9l~i%B?q`^ zOKL+(H&#Y4F&*TzB28{&=0C?x=X7}Q#B|BL-$iyy-C@msYA#&~+3y#{ec=Fzg+?2H zni>clHg;wHk;F^y36*okIZ4s<e_9O6EVaY`YG#Yo<bFo@2(;g8F=w;eLZ1dmL{`ls zaniDm708F%|CV$&gBbyEaQnQXyxW87O<Pob$m&2SFC7>%*>#|2W%|%V84XeKns?1c zlDDr7F;$G6O_BuG(U$aHmPpodP;!$i<JDMa24^k0gh=_O?6+Het=zlBhbUhz(IY-F z)G4bCP3B4e5=7bS6aKiTkY;5hGn-ccHr`tOp0ISQ$m5Gu%hyT0FgE)jM<Wryr{VKZ zKGaB>&AYWcx0?&#ioPH<RoH<e<~{CSOow+L2~J<`nC8@9=_NM>qM57{uG8jBsw@-3 zg<R?Bl^NMdu0OHx;VU|oa;&gu52*;qJof@3JX*)|nyjmy)95=<Jl>G8OiD?S!3on# zNkq4c#wQ=rjj<r-GO9svuL?KD?@u~J(qR`91d7$(O?+Yb;&4<Z=nnL{!Xd%%s>v0x z9({0$=$2|7Po*5x+)MG7alzgRD!YkW3X^+r)F1w1Br>sUBS|s4b*C9a)xJy6r>hGz z4qo_6^t$*1zxTSrSifK|>#uX<Gzd>5J{N1TN9=Y!;9KEz<IC1k+2fve6W~Oz^0?E@ zWP;&_riUakpl6*O(t#72Q5~W<i7$O>mB5W+b|wVa;-J4|0*lEC84v2;!e~qlC|ePI z)*>YPEuEiw+Be*p2vi89qI-Bw6($|JD1KZ-=YI_EU8X<}Xx78TY8C*j#sx;eGP9D{ zl9P7PauDWoE>iM9(+zY-PUzoAJQ%s>UT_2Z)21@<zL+0=^GS`SN+6JPawRy}^g*nZ z_f{QSU_M67Y(QfYO~!R>HZEgWoES8CDmcF5gC-|KT7p8H-x8A1Ujh#{q7wZvTqotR zuAs4YP8WF2rq~b@`(fN5#mhO2lODRr<q|Ap*@A3yeTWH)yKkXGN=`3-0u5|P2I(>N zt_})d`A5YEyy$=!#9qY3w%_FE8Gjz5)j>Q`cR*Un2G;$7tsdUqeo3tce|kizp$s{* zvwQtUH0iWjdkO6$g)rB6N4fWtbS2W4q~4F}x1E^c{E7$fMQw@)L>m)bf3$PHE~9ac zrffx8vP)f)7kuj^D3z;@6grek*sc&{)x!%9&Wei#9sU74N3e&3>1UwNdxR7FY3F!Y zhDQs2+Ao;Z?mZra`%x%!M@OQRj_o2Jdnl$*<P1L|;8LCa;e=Hb&m;o=wTZFesItcA z8wQbeB_rXNQ8e3C-*YzFrQ)T!DtYU9(~N?oku`~!<<pr>pv3NX0?X<^$-NSguG$4> z&2BqoOQDMpldSKK-3~yb9IwolC4Sou;1psp0ahA+Ep>USvHTMyd_7=U1Vf;1>7Ky} z{MgGi0IS)}3|%qQXKsM=1YpP8as0wZTL@Se80W92<ERu09orAIKAP__HFlC*rp2%& zPGZ4G`uY7n-yuQbR2<vgwM>|)T-C%^>c2B((Luu|eI4=#)MK7#ki_*PRfaYFg0b#$ z%KcUZlq&IJK%o<mm^qpb4V9B^GdUNt(tp%Fb4%pQ`4YyBlndb-+C?eJse*>+`PX6q zQgYwil8(HY|71W}N2Hc0_i~Sl*b3Ft7*3^)QUc!=QT2}YMV<S38y%StxPSHZw-_b~ zjvKeKh}iEpe{+7GU5Fjvyd!%N2CYR8Qo?D-#mpv9`=Z%s0%{2XYvM|!)lV%eQJg?E zg+e!6aaUVSZZUL-o+gqzFYa+%&qpkWqRP+^FB|q6hBGhYg(8D3Y%Q&)v8XaPQ5Tm} z$#wj6$}c|e6#Jv(Vj?h0hZM<hE>XO#-6-hql3VD|Z~$onKYi0Oh#VI7UDf<Bw2I$h zroG*Ou%2v^y>a_^vDbPg4}aV~-q|~ZQ%(Y9Em;JIO}#?{Ayt{CmsBm0^z!ddja`W( z(W?W$mrCO|0i0$6Oxc6NS5ulD$1!_@;Oibgs`=_M8s1`*J-T9Lqhuk4qW*NEra@lp z{|gLx5JOV_(1>;ueI+{g)#$-U6pv5--%{Hn3k9#al%%xI09)N(W7a4V<nM;A8?H%b z`OVGAoYvE<9F%ARbIou@0k%Pbee@#ct&Vc^VpN7edPY|P!vc)$=bX+|>pq6g`S5fp zdI711{%bLfdp7iD!)m1B;d0Z0dF*T>)or}O&t<HV)%5`POYVAw!l{!BSORkE^V%~j zuzztPn3L!><P~`Lb>1XOOf?EzbNt`F6)O1etE$^9VxZLydP(l%-u?L>(B(KJqHd#i zZwI>JpqPC@JzOOh;M}%vCvuF{C{1?irChX3^8P0F$6yRpqtNcGGv0D9n8q)Or{ZDz z)x%yx3DRLLVz5u=S<G4q_0@&1-%@B4rKH@xuU8L=(kZa%O+(J)FtHMKEhU!A6#(10 zOOh!2?`U3uC`Q@>V|rmoM-^da;^x0vurvIa4=O_Q1c*ISc1gd>&yf&Z8G|XY^M5`4 zs#OP{xT%Hhba(!+%cjtCsftzSVoC2)+<_+5oAt<1fB;PmUMnBWH}Oaco%0RF`80VP z$v+b-bq~MZ41kgdkLNrIua5*D?ltF-j4KLix`>U_*l*v!d;xVV-1xtvSn|Mg8}21X zPdEZx$fMK|$kvv+bGZ$Nl|8Wj?PuQCMdSf4a%t%}<%h|M*>WR?0M52RY8L%lyM7gd zBQ#rn8UL1xHB)pn+CmQ@d7ovQ-MjNWmJF0_0Lv_=1lCtVm9%W8TFVBXGjm8%d|z3j zk}Ey*9a()!i0=)NOqo3;tDV(ORL;$N+-JVM^C>AAr3!q{Ui;C;v)>Io37;fL_T3~r z;h#h(`?Gm*D_FKqTahxVnWF4N38aXsT>*NFy|z4+p+j0(!Tbzgd5!m{bnGLL{xNO^ z!iOyA4-YXcL{^f&aVV+Mt>#{NPr-3x5PmmlK}YDcc5_;S!kQY%>!(^vTv;P-8=BEh zZF=L|(UNYV#!;<{H&m`T*C=7A-EW3I<sqxz;tOz*O2_e=qY&dkN{7}zS#+Y(`OEe4 zM=wBfsc3NTUj;C3^+^XcQ~v2l6P12N@=CH_{9!HQcSpWZpDKOIU6(aMkU5FU-!jyu zDC?onp$4I?-(`!6oQ|j}*JG-+9t4La2dvTctp2naIVh)i@dtaBGjHe^OD$K*5ZQ3I z7^3_C2kQSbQ-d)jSvj-3g!-A_e{eh%ged6FNMnXt!XTdRJ1`Z{SGkuY-q>I{H8xs< z0}_5mT%gMGaav#&_rF5Ox7rA87e%EJw_6$zp#-AEjKO28`51xPjgxX^&H(5GS@!&g z`BPh2p?OAV^8E~?t1Fir=n+=4?HI%hmDci>?diJDF;He>_P`5%Sz(c3wNKrN*wot) z4^XOMiMJ%J!6Bw`!VSe-mmjSEX%R!5tj7CPyrCPS!pMtD{a^W3j;gIWbwK?04InLz z{7_w8LB%qmd3B{6!}bJ=G6Pd3D6G8HvJ5%mqWFR;u=wk3I5S;DQo0RYyUXmmS9eK| zfusJ+1BOZBaaZi_FE##X4D?NBlg(8(+3<$e*Zp!P%p(s=36^qi353Wy1;(e>o%O~O zWB}Y=pssDWZ)Pe^GTY9KJ}4D6`3qziVRt{H{>ezGUHEgQP@GS_@_p*ufq)zE*R$@0 zaC>kEKP#^g`8lJOv0|pTv`$0nSiFoPdlU9E1v6paFqoP_F5%8{=jxQ|O9{wHlyD`F zIb#-&fQPR6(Kn~#!_+co2%EUK?M}TA<?=Pp9?Nxu$nm_Sm3miimpUqA6l38KCy_I9 zcB*%?AS#u`_0TTym{WTYopJ#+Pf_u}p;|~_)Fg5a#|Ea4X<6E(4P+Yk_1wt}A1iga ze)Td|DIZ-8;$q9t9&E!@L3XOauQXNRz&{g_w+4@FyhAXTD{cdn^Y8NxA27cwkpi4w zNKsUV*9cC}BcaA+^lO;9;`qZL)08h!F@DQYF3gWdl0^S(PAjQOuqoT-VV<{dr#_xw z<zf<|3XtDm7wwDA`X+H)nzT*a0&2O|c5E&PY*2+286CMM*RYQDiV>;%)<f;m?}%A= zw}<OyOO753yF%qO&0#9^L6KD7SI~72<TewlVLR4$66qiE@lxW#ft~LiJ%wr*TE4eq z3G#M`89eZVv!Q0m2uGZ`K%v+{dyBSER>f1tP=@Y_JfE`{&5;Z=&Q$aS=D?r?pmo=| zL#o@aSnHSNe`O%!sldqk#{pPU)=9i)2KQhqeXCxpb*tx{iSBb1=4ak?mz4TASe=15 zGWG2z&T<3dHY<4LwIa>2*$(kYSb?fwYnvE`oT=!)N$W7gite=35~dL#Ahqzm7a2Mh z)nu`k`&MK5O56L<7fpuoLF2pOyT2IGgRhxb#er(2Q_lN0447-)|B83Dnst^FR`C)c zTdVTNUOSnFb#I57cg$jx{{#Yb#c|UzXl#{L?t6o9CiE(!UkWlt_C8Cg7cm&F>5QyD zL{p{*x#)?yPjrthK9r}e%=;7N)gqai6&h*cn>Y~}tMD75zOdevi+-G7=)IeD=2J+M zjBuw40=h%doz{Rl5#pYZXAtPAcD6z(j2vbVo-9Oz!u~wb)Cf!^EB$g86s|x4qw&0E ziyY~xWS4w0-k$V}@1jXOpuyUrgdZD<b0?elw6w$yJyn~2J_ugFWy5FAVA8DCOh*%) zz_Hm3gLJf=?@|dFgMZ%m2P<2?U3r4(Tto2FGFRsk9V7e!l}iMf+?WBEOX;pAq;Ius zVKnojml#o+#l=%;DER^lCT(5rBD>W&i^SFlhUU}RL6lK@yGvKfnk7*5%a5Y*2Tuy1 zv+msp!MXH^xlfu~iZm|g9$KI6e!rkJ@x@airPek#KkMPksXb-FZX1Ot3N4unuWmNE zZLmYRH0Z6YS?^A7*>tXv3)wdn>5XyFt7`fisk=b`4k`!w^@VQKoL75hyVZY(odS0l zNQL)19kYcY_4PMATVzrX`G_0xpcsZ=sX$T|0PEYxw3j08y?pTpn?tTQ_YM#CGOU== znoMPcb9`?Lu9IdH2j`^P=VSOiQdtH>z_(OCiE>ihhuz1g7iMNN++6!Ia&WQG+;hea z{gWC9mv19fzyks}uOmC}t&=_1ab$)fq&{$8EGtAy=bv8!Sk>0liIVXWGh=76+I}Kw zC@imOx<cT+c%kcw;xx?nl_;zimv-xZXUdh~hG8kY0ik_ONQ|<`#xzOPaU4h@l}pjH zeLD8V{`1wfV%M{`-}6uPv(Hpf-A$nAn?E_o792#tKx?;q8%*{e%Yl=zqGy$(swBxA zIU~_sJadbHW<f>2pNB2PIwwY4@YRk57Tl|Mu0kKU*7uQ;VXU61YZ7nLU0^CTc5Co; zP+E+PkDWJbH|-1FG&kyIB<u5z6ADQ6sXM=HfDETvKdW(38$(_5(nGR)OR7&ck44+} z{r9?%*4vZbY_-K5bQA5md}GvLCGbJGT`!$NLJ4>R7H8OC?i~8U13r)Z>3f4imi2&w z`=>K}<Y_&lj)3)Js!9>)$A8Y&0Bj{XVbQf1a-3L*Jwmv1C-4#B4=lY641?!ICraPG z6m_2rn)lagCk-GCcnKOiqG7A_!teP<ApP8(8L2~1N80_njm(KsQ1#4KIu&}qcpEhN zx*OFj4<sQm#zdXJz)A711Cav<XWBK5$Ju<$#`oRPGLVWk^U6j~%djC_piGh}VjMKs zBQ?=d`91Y7AUT`rkUJ>kx{TGYnDbF199HC){-+7cWS#dp4XB2N(ZfzN*RsdPar{tz zNKBi@%Gmy8t+9Ro7TW>y2Fo&R79%Z>7e?JG5Oxr(p!w;kDM(z;3Apu|Fh(PB|BIny z@~K(jCjHVEwDtCiH8fR3f#o_L2LT6C?{aNC)m!F$_D0KC*c{p>Xrn*R)C`v4F5sbW zV9iF>H_?4&PT+mL_wb00g^Gbwq@%y85PNG95~|iv%j9QV)DW{PZ9$rYc2?}KdVIxE zL+FPzLCYO`<^_Gl-$i+TA++np>Mjk!7c@5i-zdfyh4Iby)9DzPEW-R?Yu7kUh;|a4 zazt#tz3Pr`a4D@1q-}rh5MGw7CsvC|EbpuruzeP^u-EVa0!ITP(oi)(zb?Fvd!nLE zF8e;_SDUs4;K<wZc!+%&cc8K^vsmDy6Q3^u79J0tqu5puTxf#{jpWH{@Xb;=f`f#O zBwWMly)X0mB~dKx0U7?A&`;g>uipFr#5PMU4UQ;MeJjfV_F9yUx~l)i{2E0M%M=4H zXr*3*(+$!_v(GkLs2Hph%D63wxs4w0(WkILxOR&7f#`^w7OYUQOFieEcM?^C=F1;c zO?`Y6!Z{7>6oIJtv$vmffU(8fNevmF>R;znb^;U&f6#?TRVfN^{3bC=jZ<(iDC9K5 zlQd~di<j?EUDYw4r7=5RTe`AZ0FJ(?a$|A51NC`uQZF|$zEgkx)r9-)&1Mg5t}ycf zRZ|e<Dnh8HpZv^oot^%pBR7{`L)M-!9KR1tNXMzZB&#FkC=#9R7xMAz%|Q`rwHWgl z#uUO(wtfCP-;1gU^HiMhi$GeXC-FzX>Uuj6xL`SEm2-FCXC}eEcR%{1Tyr-GqQft} zhwI9${Tbdm<l7SpxPVrD_07@H#L@<`q*ObM7Yg9dTGS`k+(ox?O4)HXRtf*|v(#Qh zXZ#cV0JvOapk48YJ!Qr4tQonfqO`gl$UHawsjdSjf+@@P6u!Uvqi`!>g<K>DY?Z<L z0sx=0)3#9wF$7eK^Rya+=5AUHiw_6aOK5)X$D(s^eZndQ_AXNYem>6$nAQV>tfK(p zpdSgN#ytp+#K~%9LXK9|`wf^W`O4N%b%Qcdue3&fvjE`Q3OfWHd+p`K!bT-r=+svS z8ACWcop$$=XU4&PTl^bhL4;IjDId{qkA-Lcb~!j%ru)GBQ5M3p`pfQQOlABQNQQlv z;dp=R86)=5!4*9M1AFkM{gWQdxxl<l3>A)^Wb&IiHg}|yAXoJfm;DI-#^6hQ!C$rn z)m+TmP^DG(gNAVZISFK-WFke)+yc+PvevKSZFrs-0%O}Gj+@`?m^hrp8dE24z(1B0 z+K|f)3CdM;&BYqih+VoQ^RdczRMsTZ)SOPRYw|h4g<L~O!3uKzkjC_TqL!~dR(um9 zM42tl0L3g-N#UQitYR=9@7?zfxsk{CujQokU)WTTBOhHo4O<ihIezBp2nEJWVuQxe zVZ4x`yk3U85=+Bko`=2e#GD^qeW;8Fz4IB1JtT*!i{~^mjl`TsD*uP|kvhc>Xg{eZ z&Kjgpd)n(Zue(<`T7SV7!v;>lH^n%gv%JN+v~$zTtsocW|7^}mQv0ascJ4Q?T>Zcr zhhOy;i%u8NkF#Z05yDcu5qEW$ueIT+g`%?QIzeomiUWn(Rn~Eslb0Xd%`PzPi<sZJ z5kAE{z2TqM;jv|I&pfP!WF;oK>~VeY0rjcqtU$6!7R=<NK9q50wYky2(_=N<2oDC- zx5fJE8A&AyA9F1R+UCBwz8hEy#-DXAS&1(aSRJ_wG9X$!dZO7XUH{pEV4bx^+rBu& zZ2WFqk&*ZUxQhW&@tvkV8LOzl8ojxwy$bb;q-u3DtuB2RFw19!whdEYvN;`H%}|ea z#~O9S1*x>DJrp{X-9&dRyPMRa`#&B6DqKLvUf^`;G148n)4SJ;Z<I^cIS58|i@snp zkXfWI$j}Gy?RKB=MCo_!-Q`MTtUgXhq0<{ZcrYnf)A&_vA9S6n;g!kua`fWQ%GQS{ zlp&!?fl)vR9m2`;oRsHJ;eH6OA(7W^>ye1fzwI_6B76Ne(mcbU@jP%lm7zI7^4#j^ z0#M(QndSLI*(*rax5Be36Rh~L;Fzr2r_K<cdI@I7)-$~h={}Yhg(Xv16<Tt~b<} zb?;q-rW?P}4%n4u(%+#qR;%(&8e9YrjB)C#mRd-2b%S1LCLi+UI^qavER^f7X|xuT zdj|6G7^mh!%m(f*;(BU*unJ#^HzMVYZoMd3ab9&g;qYYx7odhnF`g&ArN@SPKbs=F z0zBhSuutx}70BfDFA3;d5ijv)K}NRjQ$r^_B@TLP8h1s6evY>MPI&WDH~Ov<_g*^L z&BFIRVq)jFPkEkFjJ7=8pfLl9F2Kr?*d{IYOtzt$|2c!*x%ME#GW0ElB|CbfX~u0N zmEkAtKqan1nE^b5=TLV`_{I%z@ih6ZfP1&|FPq&27R_+D*-*};{)fVXy(8<v`}&{? z-<h{XBg-ZVSYw%BjykMvjZ<<GQ*#&9Gtq^jSKjMyIejf>OUP9b?!U|yjTF$BKJ{eT zxKWiCdp!&~gZb+Wm5+)(%n8-ss2U@MpC3u2*$zmtg@T<Jl)H-lB(67d^E;Fj829{= zRp}){SkWed^f`3lrd7?kaMK>6T!Px;={g+kKD+ZI9f_@o3p)Szr{ucoNOL`UVFG}d zH0yylWs&w2uCw|e_mdQi-2a&b+9ppMKw8Vnx<W-!gb%qzffv{mBL%a+Irv2Hc-Q?6 z2vs4OT84CpNU&|28LrPmf)JfIJ2P3XPAc0CDp4W<ebff}j&OfKTh*wElk%e-#|9av zYiT26Hj7memr<XpL=6YMiRV>u=k=G1p@k%(ngObSSOL3D(Ml#^6BMNov)zWJOP*Y0 z2N(0xo^9}QMsORE;H>8&L)o5jO4(BexyZLb`9r`VBem1Nd3)B%CR2@$IV*y!*3O%5 zDgCW~Y%d?DlV3@Ht=+^=jscU=@>&)3^y;@HpL?0t<he+J%}l-4#zP}xI`~*8))->r z6o*TNa6I2-NGv8E%-X$ur*{R8(rpg;k@7>NTZO4U@M%DKsm47Hnw!Vq(eSiBTFtj^ z7XVS>3{=1ks%fVb62{JCd|vB2I~0b|g8niKx%{K_Y~=;))Hr!<HKJt8o|88j;azWG ze%Ix1qfAY@2KY9<2n}wozDTT&djV)rh<X7QZ9eQ6<~B@zbl`wv)p7i+e>cyr^SJ#P zO6;+6CHQ54nH=KOH&Td>IeG`kaXC);H<{T%-!bISnkhTPn`1=2|Epn7=@6dsCc10% zw>Q7>mDv)aq*kw6rO}@VrHu<i5r>THHwSv>5$>VG=pqrFXaKJlH60f~UJ!5Ct`@&k z#P(Iy4E1-f!f@>mvDrb~yiv3oLl(S>BlS*i?7Ik_5v<-q#IPtTj9gXim?!8a9+n4x zyj;j9p3t|SUp?_yv*Q8`lA!lr$4ivY$hNP}Tf~xiEAe9JNF{)BR_r0MU)AXBx1eO& ze`5vcLa&iHe_UrmD82=yxCJE>B$ovpnztp~WF@b8QB->|;AcAkpTz5!J|6WFrP&|K z?g=H#rLf0j%wW~oRQh)wE>$lY8CNxkN@UBcy+Mh3nQR;+4oq|(Br`fg=Eg^K(n+U| zWfCOy@n<(&BZZ>p3v%$0YqdO|lQE`Z1EdXP<=#lX3^KK4a^@SJ>9D!WtW`Bp=8FEP zMy9O_pxxqL!5`kzW<!`{ixnDO^J*pV&EoFLY<MV}seN+<A7m*S%18N>B`ps6xpw|p z@DNLr&88)dJ`-e3nId5}<q(W_-lWZ?>nxjM3qB^kW2zi@Tpr{rT`@jBOk1VbNJ<$_ zGC*<lYx_WgnO|x=Sux;f-0+=)L(RRx??t^y8CVTSe3^Tt!Xzhex6P8E*BJq#8w@Ko zb&HhV;&eKgO6R^Y;eZD`>tw)LjTrP;?L$&*k2-t95&_c;j(JQrZ2ZTp_s@C$P*28j z4VOQQuJM$5yUsn)#}hOw2rC(bQYjX*UHhbcDSU_7I@_HCOmWn2X>vtB8JRT8S#uv- z^5gV}gnQlfV+Z}5pdFJyvk(dzpM{578P&O&l~1#pd)^RaCe_UH7IgqhBKhxyYMklN pg$%7o2F2IOX}Lq}I;N;1%qjn8$Ozmbk(HT^LnSvV|G$Fge*v$Y9XkL3 literal 0 HcmV?d00001 diff --git a/explorer/icons/links.ico b/explorer/icons/links.ico new file mode 100644 index 0000000000000000000000000000000000000000..44ff73160d3a51a47c94ce22cfda95b7b0007fd2 GIT binary patch literal 31545 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 literal 0 HcmV?d00001 diff --git a/explorer/icons/logo-150.png b/explorer/icons/logo-150.png new file mode 100644 index 0000000000000000000000000000000000000000..efae42ff53a73e8c99acfbd9d42830e8b0eb638b GIT binary patch literal 6849 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 literal 0 HcmV?d00001 diff --git a/explorer/icons/logo-44.png b/explorer/icons/logo-44.png new file mode 100644 index 0000000000000000000000000000000000000000..a46a0225f65cc15a31fc35ed68ae077760071326 GIT binary patch literal 2089 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 Tlu}u-00000NkvXXu0mjfPId}6 literal 0 HcmV?d00001 diff --git a/explorer/icons/logo-store.png b/explorer/icons/logo-store.png new file mode 100644 index 0000000000000000000000000000000000000000..5f2d92208229e36c6069c349a6eb3c1cd6e62c83 GIT binary patch literal 2445 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 LNkvXXu0mjfxMiT> literal 0 HcmV?d00001 diff --git a/explorer/icons/optimize.ico b/explorer/icons/optimize.ico new file mode 100644 index 0000000000000000000000000000000000000000..b0d9208deb1f62d77f8c9bde9e24dd0aa64d7bad GIT binary patch literal 23912 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 literal 0 HcmV?d00001 diff --git a/explorer/icons/options.ico b/explorer/icons/options.ico new file mode 100644 index 0000000000000000000000000000000000000000..c428b179bf7c3216c4f2b862ce50ffbe9ec7b589 GIT binary patch literal 27405 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 U#x@Fr-DArfMTzqKzagOi2Zh@f)Bpeg literal 0 HcmV?d00001 diff --git a/explorer/icons/paste.ico b/explorer/icons/paste.ico new file mode 100644 index 0000000000000000000000000000000000000000..70a1519dcf313fda307563f71d70e4e4dd44ab8e GIT binary patch literal 23383 zcmag_bx<9_5;qK=gS*SY-QC??g9UdFF2UVBNU(#uySuv++#v)A?rvZ1z0X(m{_)oP zOzqZA@67bfZguysyLSfw00Q6uXlQ_cg%q$20RV*mt6^dNkIsYy0L=fLAkhDzp#XqS zn14M<|3?S?t7jkr0JOCKqd#E*00ImEfR*)sbTm8wfR7IVh>HG?wn72`iYWe5|4$(W zC^7&5i2wRVsVK`JBj6+ayNN6(E2;MH`kxh{!TsY8Ai4cC0RSM1<s`*4JhKecgd#Px zus&wGAE&#(Ivy)rbe3Xid0~hhb#U&=iQA&2bZSr#{o0hnn%|bh2^h@G>?z2?v||d$ zTcq*iIN?L{!aCN@-p;1FJZ9rJdG;F)IUijv`F0+&F9{o55C1|OJMQ!ve0cirDS(<4 zEXsoFXbAg*U9bMMN>A~i8qR!{*#LK!q(3!sxcpIsn;vlzGjmFOjDXn3_mkJ)6oyy- z{9c}L``N$Tw$;UAY{mt696)}yKEO)eNmfDs4I^q5V}&>Q7_C2-mXZDma_d?mBDT&1 z3BjTAQboqzAV%^RF^m`G&AsOr@xN)^m%%A5Q$r<H<{bDFaDr-oWQ1-8iMs{N+NOXv zhA_0jO7ixwQ4=T0l=SrXFxEyUn1MbBOho2YyHS0un;H;EHuCfn%3wK#u#w~{6;(#R z<v=}IV%ny<lb$;-$ce@*othMJG5IjjykdYP_Ta~Y(v*iw>}T{9(?EVqj1$+uVfEgk zA|$059Kohf)1o*;)J80>l~IU`@$~|X%_I;9dA8RN`GTV;L0)Vkjn=7LRuau8_D~l& zSN{cWI5QGgq)Y5NTD8mk?RkIWB;eo;*tC2~>r-z-Q;v#na)Ql|-Uqy;aV6zA6C~MR zTVVlaXUMq?Z0Zt)jGB$f=2ia*(@q#O%u0_WM`_ELKWRQ_VqpbOGpa0w=eq9Zi(~lw zS&T*<c*_-q+qSzhj}7o&mvryb3a9>3ng4a4=gr3>u-XSw#gaM<PiDJB=5&if^4{T4 zyn8p;qAc0`vgTs@O19Hj_%=TrUz-0|gAnzHN3XTYZHGs`$&5SrlSB@lF3*y`VNd$# zxW4k6A5qZV!%6KalZ}7jT#L2h>lImSf7j&hw7pd3=HIs-cafzY$kwt#wxD=sj(>6s zkdsoDtPwX3{(q6~|L7Oif2BJviU=71fHeJ|bjN8ZMCwan3AI)j_8uE;$KJ~ElVc<d z1<iMpKn=$sx{;aFA&@caho0#}Q9|)xNTq)b7T1T<p-U<zV2jj2k=&9*L&6&cE6yr@ z@pw^pyG*HA8C<mwUM}=}-xhFt$$F&#%%LvLNhR&fo=@Q{t)(qq)#pD324B@l%?UOJ zre`aIHU*vA>+>rlCFNnw1F|lA^d@g&BoE<jkv?WIRB6p!cV%(~Kfays4`GXJ3a$A0 z<ZFI5aNL2y^M?X5)HG_wTO%v7#-~h$M!l^*2Yyz{2p2r)F!9&8(zHGgBv63sRiGo~ zAt21lj$6m~Z`1u^Rk59^)m3r09M+mG9#iluV%|+e66rj}!FNIJE3WA<`F?(Y=%SxD z)3iwKs^2WTO)iya3YZ2pxytCx5fH9KSsQ<|x(=AWdXt=#!Z&xt(!&a0Ov#3z{e;R! z!T_>y{l+%YBb7m>gxf`7XP2X6>o*L(WgIe;zY?iNF`cHR1k|ww0vbhq&}CS^W{_ir zlA8BrjiIzelb%6i)gJOb_+!2W=J#k2yF;XIe>490j%<=kM*h<(q>swYyDULp$LQLy zOCS1C!EOF!o&#C%K^l2u=K%wcO>9uxq^qkh>WGp@xG2O=Df;83;%8tr2ef$+DLG@; zQs28{M_X%0=0JgB9)g&KA}z#EtP!GWcf2KaJY6fq^x!&Yd(=}c4-<N*iNNaGN9V^z zcl!KgA81Qui(^G3^#&m|-b8B|(;)IYsQVOzRAnCL&k<o?z50(~<~D{pr4W(Yb1Dmm zR1E6xAfHy^J`0#C3uZzH+vt3RWaz?b72T;scW$dXx5A(JgVUK<7#azz=#_*^!+d0D zIBq9P(Kh694`z{t!w0kRA~w{DSX@3pXnC(W(q*q&0kAj1fFxi3yC2V5<Gr@kcU}+* zpL{_MHRD133Z5O+^0!QX--}kN8(*5js=Ym6cobV^4&$dT)M_};?u;LkCfVXNmy6}? zZm|TWUBh^$uTmAgMak6XkBIwEUQ;viqi^#tBD#Jb%QyD88yU-gZ>FvM!Q-5teRx_l z`7*I5bVn*s2lLd9`t2UCN4HV7n=z84?|aA1KT~aL(VGs~#J%5DIxBFnc~{RxLoN;9 z+$_#_7j|r>L|Szm^#2QW{~xOPAE*QUS2cG%gq{EZsQ;syDVj>w24B%W4zpZu4Gj%5 zI7Q-^u!=?0^vbZM{z{9fXcZu$cetp#sYcIfN@+yz%AZth9gFL?Iqz%o7{D<XK?meZ zEvz@qamp>cb!U293UN@l8mj$F1D*7FU2ghV^?;u(XEqhI(Z5oW|59+YX>mk~Aaic} zD%lrQm%?j34Qq~%a|6+P{uZkXk17xK3qX6U18P&u(eY=15?*r{h3vQJ8GW>i+KNIF zg>s?e^z?XtIDWttQCt)*b|j>s@zx~rQ)It>_?>1peRvuZmPfRK69g8nLyKh0>-X-{ z$O#bfIDJuwKp~E%dyo35FzUhiBAh#;S6l`~?vhDLDz(vV#DD-)iQ~#_E?@pd(>ePX zV2*dU+17X^<G9>O6VFH3e!sg8)PNbQJ=>q~KUm{;`-;rGK)YnBv{h*G`{B(b@Zry} z3q&f`Q23a!s99+SfPs3pxrIDoLfhJL88lY;23GkhxQ=;JlPn%Ls-(o}hB!b<hUB9{ z6p4s1@ex9QO6ZKRJin{GR-lP)t<`fp;SaY9E#)S&3rp07L2K(`1Ml(5ib+O|eW0SD z=tdzu#GlXL6s(DGLRLn*>sCyRzy_--W@0vcE-%-oN*g$xDPF|j-)Srba*pIc+6!<V za$$yAQ;z3l>a*!zfzwm?iiB%+2CCAj2yW}M7R)iZ3^PIM{w3<h<Nk)BGR+=t=wN*L zyjNt_VYv_oiC%=1+$7O&6OEFWXT4LUqAVRtY)h>Yql+*+X6v`=Tm{Yn|2U3*HnJC0 zDukE{G`oVC?P82<H}>ipdOF6#;-PTQ28sFwpwbpXIXsShnWiLK;L3E!l1!XNk6YK# z>=H+7!Gy^<4?BgND384MC{b0^xI&hPWt?HJ@#76KZII_LvE{b31yy>cs=Czuc$FF% zt9<u-3L)dnEh~OKP#ns&Dw)eEL%U@A@b*AB*Rv?dzm#P<&WKyvu9d=KMHK%7$3oUj zm#p^MT$`e@&!H_w(SRQR5EscX>PQnkaU41Kz3dQlog)QzMIKT(P%Y_bHF;txrAa1W zjT1jl6*;Nt6-MGzb~(QLTKz0RV-Jll!99ZQ-x;!VVgDgY56K-}Ccy<}wk?yt?w@=| z;zh7aO`<syW=md%jA~SFC@WWogd?vsIrXJWDQUq7wCUT5Q798hBC~7M5hb8L?4Yo9 zw;x_?MI7gjLsyNCd=Qb@A^K>q?OpaMzBuVbpgSYwBN)wcWdGWVwxZyKhu3&A&cM*x z{R{Z`yH-XQ>t3AXg@{AuM}hm5zQ}tmG;E<3l}kHvh_ZH%_sg%3OtJILi@|o1T0<`f zUIIT8=9%DX-8%ZcpyBP_oGbz)isrS4I~HM&OS~53sG+L^8kUHLRrh7OZm~b^PfFVv zdQq!*YB{jSE7iW&??<&lTszMV+P6_AuQ9Lz0cF%{s&1g_B8YOk=e2@AoUVAXTZD3N z$A6bbKMZ4@QDHW2-tdA|rT;Hp1L?nZ(*K$!S8wk-002hze_lhemVvd!686Wk@atyo zX66(nzgff_SegA}*H}qa;XLH-vbgD93PVrK7mWnVS5>S&S+%Z!G<hAtk3JGh9;T>i zE=?E<0ej<Dgqj|WSoVpA%rs@YYrw3K)n)U<`cc*&WhEC(1Ct1!8AIFJUdQTg6qC?D zu^{gZ&(r5pwP6_iv<*Os6RAyW(Cil=31IweVR1(Z_PkEaHXb!V6pM-Pp%e%<MUS+* zy@-e;4Tpm|!7KPG;pt}aw8vodK7QSQQy{5eHSUO~LT}{P#wB84`_`b-?7@qQ)EzjC zYv)pjhQ%I^^m{B1ADEs0YUQ)q8SpVY7{K7B_Pj3=kD|P6{2^$<FsduJf?ke#($_Dz z6I7(V8A-sVuzX7M?nwCgyw}Uj!YtDd033G5UF4#yWVE&>DO-*WHKYwniON#l)5N1< zp!ZGHsD4`=LY`SEs=sOkmv;1bdXSuL3N2WFcz3V3kAN6n;ag#7r=QEjRT5&cfk9!7 z6qxGQ#bQTMm@G;{B)(T?m(yx>k!U{Qo@+k!fv~Ypps?cJ`z_w~-)Ci+yw^FsENBHw z5n7e=SAR3_%iP(W;W1U9+;Q0frJ@Jv{byiH&-)K`19KAgvI6k70D?H0LMmZr3)gj= zdx4vhE9g~@M%fh$!HQ6hIuHJ51aY8{xa_tWs4|L}0Y!#*Krr#eeBDJ#k}yVvxTO9? zXMyR82<VHK$UgO2wVa1IAiW9`e>X?ox*z7c-GvlwMRzb-YCH*8ItVlt1;Ap-S_qws zN)IxKN+tkG?3L(ox4%hMI#XR5Dwi>nYc~PoAQ|MnBK-9hTaiHK@a$M<2VEO5f5J{* z2~P~NAd=kAk?CvMqrrhs>~8{0_mY!#F9L2^o(}l;r%Vk>Jq?;j3HBXzrGgWc?DPyi zRh&vD>t;xEV}Ez1JZMw|zOlWol4%@~x25i|4;Va@P3uevd(&Rg)=ogJ2_ezijXss^ zL*p7+_uI3cnS`(ia)hjRO$+1$n%hA%{(_hf$ueH8$(PRD;ehV?)r>upNBv=qA4ORR zVT?HKYOL6n9XMvcJ3utK-3add5DYksq6iZj;xk*}qt7HYg}oWjW)sm*y(bvt669Iv z*8QTTaoLO(L8o4AEfJ@llIo!!^3fhSZCF^~ii`{%;;%DNyKnK!^8#rwhAFB#I}5=( zR1hGgerx}x`8&L6malA&n@iTr8iOX57=Npgt{?Vooid?e7U%QndqXb><Z8OkTg?d& zmz+{_+TD6cfMo7$fgB_A#d3<<nuA=Ais4o>P^uww0z5-{@qV#((}NzMOTqT=Wm`W< zCHf~}I-f8g1!>dEtdCfcd`!DS8oh#uyHwhg5c2(Qpmow*fWYvC1g?acJPZG-1e7}; zbFhc)M#DNCb}|*UY-UbD8X}}P%}?KyY?VwozVCngk2@qdLG5<2`1z$rpsRON?mE$y zey>5bLW!|v^&f^B{C3|Y3cE1np^aS+4A7t?c3^F2Os7PAu(0Ax`AFo&j|lLjA(++k z>QxXMEF{IT6d)16vGB{D5@%sI<E^}rH%=$T`SO*yjl4JAa=!S#g96oIjy3py=l!#+ zuOltw7X*j?W1Xx`0zXajA@qH{FsZ3m=^BL|&m*E2pL2ExSeAoiDaz?)c#z56xXbgG z;bnS04wghX&;IcE)D*VL5nCf4sNC#P&`b0LK;96b?hWKu2q)_eaH*Gu{^VgH6uBQJ z3?-keAKEdUT`z8_VT~>a@m`mgHSqvCJShhBYZvVYLU#U+MhS&*SjGwTCPBq77LFhb z?YM=<eifYar!Ml7q!_KFe-!3kDoe356sPi5HE~d8$te-|^tUzY>ZF<e<xk{xnms$z zm{gZG+mbGI2Rh<laK@_7m;CkW@HzP=V}(2T7vshhZYZGZn8c{O@Y;pL#*k+h$S&9a zno;jg0|}|Xc47(Pcj3!<H4bU?x}wy}(2HuHgJ=4#`0}!rX%uj<c<Go~IV~iq=;8IG zPX24`C_Chk{Ido#DF|@caQxxEVBmkeapcfl)=~4s%k&LzavmdfApDo@O3hS8I*Qu@ z7IyYCs^~WaP6ljk$t}GPp+_S(_P=lwt!{6q>qFRTOGLdr{}%xIPnw7JzW@~b(Pj?- zz>fS6fVy=YBlWegKeJ!AGuOadYXM5S$JCbSP2X&ws?movV>KAd&_vGsF-4x_iq-0u zHLA)pemxaq$E2n%w_u^S&{|`ar{I{PGv+T2;OwVm7=LiBoy|<mT>K|VljwTs<G7>9 zJw9W3&+PGV?)Nx*`SzUcddOU-{8PeIGW06Ij-8_4d%tO0(mSzA*ob#^izaxM-IGQ1 zCpkpo<O<R<C?6h5@;>md{p8I=oCqD!sfd8BP=p1hvR~zW{hrISN#I3=Gz_DY9|Hk8 z8rqy3VDjPeoL89h-uj@p9S`0Tk<>M?me`wX^K<Zhyxd1`r%ZbOOCc!&L3S$I7((b@ zZ|s#7C>sO}bT*0ulR`5F=hv&n!W7t;jPIqEke9xV*Y^aK&ABWsTA^X!v9g3!(}M#h zOdZLpkNR$Y!Yo_vABrNv52E2w>?t`t9?ukHQnfU8Uk@ZD4+Eg9dikiz=*KCWUAT15 zntFKO8xuunWjPv08EAi;o1sgIWeruZ4>BeI`LlkO`1Lh=r|NF%+VVRynjh2$Y*AQD z1!bpx@wY#IaM9-5R_0fPqJS*>af2GDML20v@kf?*OxS@yZEaOKc{JF&)ysH=MLOUp z>nEOvmZIDcyFj`5es*&uPDgO!7a34z=bzDP8;ic~@5llla5QgT!#Li7Z}~$A$KiIc z$@~CM9hD8EftFg0H*GxaHzk4+=>*^-WN1e{l}S4jEZhk4GQScMp@Qsm5?rvV-<8?? z^vJibkYQJOPoWrvh-^8K<}j6Jol3Bq@orymC}WU#BY>34xHI~YkQ(Zx+U80jhCVrQ znco=S`Np3y?J@G=5&ZLEX_4wPVaJ#itE%1Nm3OCs=9XoX2Y`E2_!?x^NqX~}bO7|O zw!VG_yB^nH98etJHa0he3Iaqa{#{IMa}cCVpaG67L^?u$@<IrrZ8n4s+FvIKr<foB zTm`erpI}35<BI1^*m`ti`nIqAR}qtCT_OX&j5JLM{7ZA1b;OSm&@fu2HRpvK=RK>D zIV82JV+lnMB;%vPYLzgWtqDLGDD}5KW_by$H}e?E#JW&Cb~C$nHIzs{-~}!SB<zjW zPEEk`g4<%OiduKmiXlIyPly~?&79?v8Qd)_p<tCwoppULQK>hXH<{CUaaOs_PW(}S z2z(Hwz$e+Uw$d0vu(S&6S+Lh^Vg|~K+V+HS#IJ}Yid1z74AhV)^*vGk&IG#qdk_|q zkhmBtfv+xVGs=2fPHs4Dg<Mh^jk{M4s5Jwb&#c?%pg4_S$}banGVgWUt~N>*=4LJx z+v?YQ$dE4YEf={T%E?snAo}24F4B;*0`h~LraS?33X8EdWq&!?aDV@N6nk)1xvgU! zqbVJlJFBKHQjtI+1Mz4-nN2FKdiBDV&*UPe1|bGD&MrECgi#MT?}xfkYgDJcy>Sxb z0tQyJ<s4$gBXvqg)VbHNrN7ZTg$14036O#)^aVR&)n%C5ooSpV3`@U3KYk}V%CT(| ztiI^$NQFKi0=7*W-#5l$y&sj>O#3+r1-_VRF*>}sAh!y-VQzbvcRuD*Li5#-X7WCd ziQ{*vr@;ksd|}!<YgAB1gH`q;3^v%w9fHmAMJ>6&^Dv>cvNr-|N@1b0S~vz^pWl3g zQ{3h{o6_uV4n1K)Pr~srI;NKmiRpFxy%WL0KZkI4hZ)2BYDX0GqJQ?d^rW+nZhD4^ zP184IRRL%7hqIkn_HMNQO{yREp7p+a<{7FubC7et=*Mq<{euEgoR6m1C65kPs*r=$ zbz*%rq;3Bmc8x~)$6z<-`ROrQy~vR0Z*jvFVy=9mmqTF^i=k{jpT`e45E|4?+ZViO zB{qHM0}9w0(`yIK?_5`<2L>WBG3B>6`kSzGG#3LpgE0MNVyvdjlQ3dT-Q7;Nhy-}Z zJP;gevOH_xZoMiXV}|xGmm-q9%%rb4IZo;R#+f_@Y{d3;eB{_YZ|xkfhi!?Rjn!Wl zQz1)|howjsJrJlVYoV8tdZF4bq^aUyax{dfm(x$_k!vfe{?yu@kDP)*!3$rE2JZYe z4C<y69ZRA<i=FR9zUaHGjine%X*sv57fGGEprGO0Vx_Z0op*P-;EDI<zc+`C5LDJ6 ztVNI5i>bB3B`Z4DCd&2Y!$<0TfFTw8SUi#*LKscid2~4HOV|Qax)Jq)QBRnE9Jlb` zo_cAfhvvUi@qC4x0<U~tw;nj$PSbxy*6Yrq!-|_AxtH*;sFNc44K<@yo^uds0#*PO z6weg9Zq~`9pu=$F=}g%?ytS~WXaqu3Hl7s_*juET%1`Dn*+FBQfl;@ee=k#88pj$s zA0w~O?5w`a7wU-!T2f1}>Qow4!*oF<DcxZa#-w<%caiD-HT3<M;dvAkNi*oRa7f%5 zCE5`9lw|@5ffQo7Yjq19PJKOW9a-t(!e7u;u{5VyGd4XhW*y&ODpB{yVC7hNeNeJ9 z!HAYdS<R!uyaA-*&wFI*+Y+p@l*^S7)kCn5Au0^$XzN`r>^QIc0!JPqKc!5e(-3}b zuqS-k_7_~=DEAX%^qV1XM-GN}27h>C(~&~y7V{weg;Kq{>3lewhorf%rZ*W6$n5b} ze|?O%KOnmI_Axl#LHmRr)><roD2na;zrg>0zUr|47yh*%o+AJNc-8;G|Fn*Mto~O# z|83XH?D*{LcLxO~bf7I=b5uDTgp&0e99w^Ioc&$=O(nt`TVSsTkN+-eF?UK?T;h-< z=6V@jf;C*nQg{hlo@{+Rz4k_pUdDTRHaI&Q>@({%?K6{Id#<=)Qaa4T2L=l~_B?vc zyn4+5nJFUNNp7Cdd_3brJsN5DT^>~;WTHGI=1qRxF!0P!s8X$uND_bx>&HNVicu$I z-{L&kgUDm1YWe`3*Ygj&7|Sed>VBx-3>e0&OAdmML%$6C#C}(1OheL%u;F+T;XNvX zM9l-$nlrQ{S-usJ>|AB<9^j*AP%b3)Jw3H$WMy%x@1Hp`r}P$&y?Rr_m1!fRpQsSq zc|B#oqkH}FdXIu?0@AA<lpfs_k6!ZfHnb&4W&;|v;hs)0abK2Ap2nQ$pU2nK##sjg zS1IP2bKX)0khmdiIJb@t7*crTv9<zkJziNjf97Ru81pRJ4yv3k6z`xEzY4Rp>LbBp zp(S#iy2+qEDnFZZ@2ND1(1suM7Ax7j&Y|6;qZ!e-CxT$lGR&_tDIomIwW&%(b1Vk~ z6WiN*AeC~1Elk?cP^i`P5K68n!0&@T`Z#2A>JT4OX2bS$I{{pax&)y3n$IF5)pS05 zMT>XS=BC>bNHA{6NU87V-*XuzmEdRHbp^Hdj5JUOr;!^2y9gK6V&;_<>o<Ge=mHvG zR~@84Ec9otjLYEEiT#&n3G|4riZ$H1=)SKG)`_+74HtFtoei{CvS6F$@2}M&I<KfA zANz%Py^dunOd#@NO|Dlcr!`XN!iaj7;`8FQT&6;A!%<32slYz!iIRp7@v>G(Cn#;7 zOy8ZKq2JnYRx3$K;hoO*IFoofnT^jTzbOV3?)JH&CNadYc{RQ@L6KwrShHh6?_Hn6 zMjR_Oj<?dg$CTYJ(jwA9JC{ZT3Q_lFA$}t>FYJP40kjRULOV1m@GD1k&!Y%Pj3~uZ z7*p<a1{rGi!Q4dK3fYOTa&sx0DE0-q={I?c_C@AU+v=V^%t6?#QaAAf$<#gamwHBL zxQz-*R-n-IIF$=w7&Sd{aq7f+2c*`Ae@)n8;qqT(q?wbE&Hol>H?`lQ)qv_gd%;f8 zyztU<)B0O4w(>m)uEYB5mL40ojTvs$&OHioDfr1oYFlqnb_>7nl!CDvPn>ET#!*1% z9*WGD0S1f;J4Yq`T+K?o0}VZIu@XJ4GlmmcxmW;DH$~d~ITSt$TYNn7c1txy$k;cl zMyOETVW$BSWno*soHjMLBH=Yx6zPt9yGGF1S<?I#u|ORi4xRPsfoWZZSJ=sp(*-~m z6}LN#@X~84%CA7=+v+gB>KTP$y9tE+0@NXj8J%#pIU`3L=HX$Sld7-J$-@i7v?$_% zSuUkQMr2LA-I;6-Hfh*h5#itMi+SEpGU8Qj>9A@3YXjfZrqYU&fLqRaHN%2%1%oZ^ zVX03PCHL0?@&|s0;@WO_Hzer2s&iI37<Edh_s{nt_>$uf26R>>ZQCvDF85A(B4=kc zIpY`68DX9mW26~?t@~rAP8^k&df+0Hn1P5_-)16};wLFA3kCAwQg7>z=3*3(mQbxV z&_=gxNJlF8^6dkfK-&xz-s$v)RA*s{_~(f7Z{3gEpfw69#mm|LNqXE<ckT=vVXZ(D zXO~uHN#~!M&h6WiL(@MJ#&|Kv-7pv)7HoEL{f!2m{SZ;Qz5x<JiI+*y=N)_ODnlK? z?aF=7DqRT<5eEG@Rf|f%Wq;wA0}e9FfUnk!DyA4m4@|4L@qRTaP%<dK7x7eCel|1P zdaz&WDqFdH8e{`V`-Y8hRD>}H6x`gI$_J=F8cl*G7lA0i+FYkeb=w4Of<pG#m|5&y zx$Ss4PrTi;g<H+p41+a(0OAKKRTem_dbVa$f}IU|WSzylelL;C$MLg;Qu(qQpzdHZ zs`a~`0sql}>z8#Qek;<rHg>qkna&k^rc1z1DrIbu;l?-aoZ7^;C;e@RWVXjl@(&@t z(-MVPOZAoodvfWQ5O~}OvIOlT3hg7Yw9M}wASPz>*F<+VQU>2)I9Ggr$6aLJ84T2W zD^rVyZ}pNSdz(RCjD$>Ur^7!jR+zOtY|f*!Ip{y*&NSAm(SS@pH8Ky}mFE|0T02x= zAue8`m6u8~us3Lw$i+IoSLlBlve-@YYY28(s-fh$9zQItY5q<n{lVfM8^ryGlHjWq z1*rOD_!#4YZPmKmk26UI?uaY)dz1b4k(!;4Ad_2Pv8ql=vkvM|w?85fhCTDA=jYEt zXMtD`8U&oTzHEor;^pd&WW&i=hIz;{_;zZ<1W%PxF6Zem8wcFmguV^Z{uPOQPiGCI zrSTp;0f?l6W(iYxYi`3)P8$|EAP1?)c4H-UX7hv%?mUuOJxV_T`v4!jja8V!O36$Z zQfDDe8a}5>^N+ejos4jDjU%oZA&wZ@($ngmr#h_4C1jU2P~;7a)#G%5AZEvSL;5<Z z<sW<;)+ehn36mv%Ev?j8Ipf14zNudQCa(O_2$-|)QZe``;IR^uRM!%e$Bt&m>>5mf zd@Z(wp;{4phFj*e!J~RH{8BqyipKyknIm?6c-Np?1DBCKHcXePM&RCG&&lV$YXRj? z{!>&z?bsW9a~_C|$$Q>|Q_3m+a|;bQ+)v-f%1mMIpeW0{JHP6CiI!^Z_v1b;bj!m& zM5rx)KDq1;#|fzfLhDPuE*X;7v2rV!;Q9#Mfp!&i=uZ|-*&jyQG9mqSy`V#XkIU0m zzjX@(_BaXQK*P1W$Jn$7L%GVSW$`9!xwg+8+bhBcuVd0b)-davUMu5q3zz_<;8+1# z$ZII-y7#+7@#d`F03DWYzCXyYcD(H2&FRd-%v}y4TNjyZ(lR=Zq>)WIHJX#TFHhsB z*)mAmCXN^|3~ZAzdOINEgGCOxl$Qch7BH16y^!hX*<9tbbX6w2zwSMm7<{tgak0MJ z14AyK-y=AqlSgEpeBb!1nTOqExq)!746=*>yP@Vp>PB8ixHwx8m3neK=G5VCcPY0B zg9yrALMtrtl|4M?XsEV?|L3>Ujm)MW7g4c2aeak}ghx#d2GzQtp&r6hv~ljyUeS}G z2lY(D+P%bNzNqnwb?I_+(?mmv^OJYuj1I>NS0#um5d#^8^kg}YnE#6>Ci<^k^uL~1 z#W&||004>kf1cQup5H%D?EfTUw!m96-xZ!uN|U9T!r-8SKnVDhKr_>+WjOfH{D3HE zc#@lX1GXY*2r&xkm-rD$MS^z;RWnR$B~}QfLhTmPrs5XS{LT$`kE2t+EwdTF%juc_ zl#3ZVy_v&{E-%MzzDM6&pKZTTFF**qKt3xHMBcYZ&KaPw<$$}k4{)=Khz#Ai^6{51 zsI(eOS>Th&eI$)S;D>V-vNm;qRPx`_KgyXa$}Oybt!Pr~8j>r3UK4}qTZq_&^F%+6 z+6(t|TLxYw=XYYJ$<FS)$n;2RKo+T*BX8)ImHflxX>K9My{l0IfLHoz+vCeogTb0T zU?;mF>;4Dy6B(MdblD)zc^PD1pc;;yloM7So)hG!M4-RcO_$ZOVCHimtd5E7zYv#8 z#jHya1QivZ+t$lzyzvmvL1$$@zu*)S{nVX~8ziRa+p@|-iWxW++RvVrEU&ZH6qj@q z@6GS~JE^oYz`@g$Efp-DXE_z{6xc~&TT1LQh?bIvfhLQdIKYRLp_7h8G}+>#PN&#$ zQ7hee>}bR$X-Gk)B6RBm`>5NBw1v^tTYa^GEd+M_ktz=ine`eu4Kfp}`a8b5kNtRX zvl=Dvkn->hDF9mnEtBECpxi?F>+@3Jr-&|iT9{Xj{soHHYIYnKb!y!xah%_5_%~u@ zKvFly9$UNeJ@9h1d$^WK;qlGn7t=Go-NN&f9}?2TYiHw(b$*@w`K)(t<unS`r|1CO zcDF}WE5UIq5rbPIL7Q(6*pI`*DY+1Mt_AV9aGE<yqVPK_iR6qZl*)g;Sbf9g_-q)v z7DK)-B<k_#lN8M>XcVusR3Wi@t7u3m@kXwRMP~FuV7r*1-Q$=0iyF^&s#Z76S8>jK zQp|HFwqbytxtK&+XF7A|)$^H5NJteHj5+=gElV%m{#{jtr^R@=ys7nQxZ;>q=>B|y znQKi5XR#&xAnBQFgAn$z5qAE+bW^uTuhAV^IN`R*Pb!h6xlO)vhCqYxrP8@qs?jX^ zo)e0!xjZbX<vFoA{Ho?2$UYV)G&>{LYc6Vh_S+?YGz<lUB|0ChDPiM#3}$ay$fE(- znQlEb-ulA8x<1lM*9+2=MuN71{X<Gj+Ne;$F>a398wn$Mx|4Lg=wOA|vpBlJE;xyB zLaQ2&DK3hlAML=OByg%#Z*8@8;-RLKz5AE(kHE1otn}p77aQ*!<6xqY5MDIOb(|%0 zj2Qs}Gzk<c2J;CqD%4#w3IKCRdkmP1v{2pHlcG<6xSEs-oia6O?ukYt;wWKisF|E? zV@bUL?D;*xL9#F?3Ve`-^HQ(EkL>Jc`(-+BS%)8rdUVKg`|mnNTVEB#E^En_$t{Ni zH)2Q>qPsgv{p_>VB!njp{z3&MBi`!G7u}3ws$G$2U>sgnVnZt2*$EUSV0=Q<w<!b- zx<eWxvX)5>CmkJf1bAVS`}9=_H=p}2mut|FpbgUyW4g6Bz#jKWm1e6Z$uaF2Z1Y8C z_{UVQo>EGylC|WKk`+e>vu!wF?x4&|f?Le3xmUi`>ToYiJ;ALxxlt%nUEAFicfdJL zJ%FAp-MH*~60ksj2X2aMzG0V62C)ROCo!y9(Ztsgx)_pJ!-FwTDmdbWG0*I$9<2*> zXt)=wZ9qb8hv;Di)(>HC{PhFbkjCnFB}9%9bz|Ol1lyLQL_;Daw#Q)yLccdGd01bH zQ1@#5uZ8kXWD>k{Inp1?4k2HB65%}z4vnWV`P3gz<@KSd>8sE~`^lzo@!Snfrd5Wz zoI|t?g7vIHJ_dKbw$QA?2Zb?2AL++pauUeqGSHf{R_fZFLXKxjjQOgWDOhBTHmj4^ z%fet8?-ctBY{C)_IkpS#Y1eRQ<3x-lU`R*c{0^=P-<cLT4WP{c_3RL;0&Bu&>Tkew zd)*zZ;Dq3iPu7HE4|M28v^Km;fQQ8-`yt31{kx85Sd=_;wy5r6{2)B4h`jo6ziXhQ zG?l_lj_4K#iMgMyZTgve3L7~jPgft$hWadF{%U@7r0yc(eaue&D;_%jn(Z%YW=VGv z3zVRb4UVrb_fv?>#{}||iZiX48g4fo$VqXTM1N#=e|cWct77eBHH3zW3D5uw`V~zp z%h*3lteoKfGs{nnHD*MWuRuo5qzXF5C^SXEI{5W{ZMchMw2b0)-NOijuE%%PI^6vV z6MvX3=wU#uFx-qtw2cu3FHr{BXtO78a+E^f0`HA1BpGL5sMn)sU}1>a;Wll$%j9?5 zENIUjzTN_*;+C5kLykY%GfI>5BShp1yf;_0(Xck5bD_@?s9BP%#Q3?jaZgMO*)l}N zTJcE}HZ`QQQrdlWt~lI+jTpxY6j<*@<G<%xemWQBRIJ&W4eUk8T$K~yl6LY5VS{Yb zYY88npL{5;WF*RnD{5$xR#{0ps)H+R@}%G=B#NBWC_WE}IpE8GnU6VNC~UzYs=+O7 z;VQNd?!kU3NYEBXLmqr%BZ;^Wfp??~JgI^Ay#MZ)EvGdz-i-G>6RFh@;GGlS(nLZu z_UGqP&QhhKRqMQvE+}qGER^-yo3G-=F7M8W#q^_y^~;<;#|y`?wBqzFUOy7<ZpOV0 z2kSjVq3>$#;kB#;7L#R#?F-m5wgpqc(;TXu<vT%s*0T&=M^#};4qS_B3F{7CKe%kM z27-)VYvYSGbjdx`C{THnC?97zqvS*#86>%{FMup5EA1Lvza@41%|b)t&*F=(P-Gso zRbgrBFM+aO!(Dwf%Kq-dN)he&G;&@7D?JzxXBOx@;cRA7(*Yu<_fmJ5=X8`@mWxOj zbX;?Fg7?+Sr%9a~aP#~Uqja@7P6mM)u&WC>h>>*7fqlu-3zoQkMJv2xTggFNmFwI3 z#cis;y2-etIIcm4eH_rub4L(ajM=s{xN>=)Eme35K=K3|v6P~TR9{{gj}cd3jw%&b zXq%sXp5eNig{6$KE+d*&EdN|wMc1Lq0(J`oc}rx5P)h}@0Yc$l23_mMUY;;rwE_Um ziPW;NRyv}2T5WWTbib$g&dCzAwUFHWVM58*Fesk!m7kx?W_BKA%(8#akRn*?dt(=T z5LJ)uaFmn|XON(SmrcNBdhX!CACI%%wFaLTu-qG!g69)pzGl*B-n%Cm-g`BeErMUF zW+AD|2t~fa_b&aM#)?F25f4&O2;9)?M5-TSky(w8+jbKe<z1g<gFPs^{#+h}tYUC| zV@A~d`RIp9Ay7sPl?9ej)&b1WtgaKv{SpV&wvR@qmxQa|)&je%A^xhobLCwTGYRZX ze~cfB%euSEP6%Wg|JK9^Ib{B=U9VI7rqqLyMVN3dYI-$PYxt;~yX?EFsvLl}RFoTO z-@s)&B#}p2eHNGNWB;z27=dy4Xt!o&^!YLZ58=O1$Uc;RR-)&7`mB!^j$1ugbwX7g zB7%5p`T><hX~Q_^+v7c)n3BBg$WYcJ`cNwsPdVcg8JznIM`uXh$ZM+y8MaUcjAfsS z!?4N)a2w1_^E-p>mk^?_)TVg*W1Sl!%wW|X)VY8A%1nY|80IzQX+pj&^gQu(uy;m) z;X?Qz?pdBLs-9OQC{O2g@~lf8j@qzeFD|YX;a1NBEc7S5{Fu52QP+20BKMMSKYQ(G z>njmaL+yc7R>ttiGh4b_*}E{q5!U;-$<v3XiL>X*Ls_pTwki?jwed<tfP3}K<0re> z{Wce#vZyO4P!ThFCghRgPxn9QzR^I4=~TD?cRF|-t<Q_q;YTY4%&Z*Jrv75c-07JO z;z-s!-Zs@19TRJqcBQlJElH>fQzZLhZuON#|NMmv_RA%)|6V;A(l~wo$z!uIk2LLT zaU2yIQJ$62+V|b~d=z4;xfP$K2I27V(VR68hJZxIRDNYi7DRelZS%?3;5y^{qL`HE zny$a$+v+^M&BsP;B*<VH2K-IFzUAd7=)zt{Z;$4|7k8MQ5^$~gGH!4kCvqSRX|R=3 zRHQUkRS1qwC)aHZ4{_I<%KN6(=sX0Hsfs=Rs-&KWeKq+;W7zrI@!+IEybH7b6QkoQ z6A|wpC;V^oFMr1S1l(Tp<CbvChBpsfxvN<~Fl=Q-Hdx~=*v<r^={Uu*d6~0*pRn$t zP4P#L<^PE?{y%<G2L5XW0{$Cj=)06z0sst{{|htDv*FVTWm58tB+ZwX47O}^k{rjA z?9Jtb>+0+KBmV4x(!udt;Ah<!F!*4@5$L*Z%(1!(sfHRp3=%Xp)-iV1aW@8h^9aKG z5rituL}2%<>tm-NOsUgjp}<t$S$R4Y>-pL}R-q~9;P%xc8+`8{aIEQ}WuYZK<a7PQ z6CHpw$ol^{B=P5uQRlo=^4@<P&-OQAtKz+hJwDPWY60MAxg7xY&aiOWM1q&JfGS8< zQ^|DY0O69`U6|xTR{E9sGE#TIfQ={!h=s0&Mjj2(>jnD53jd1oBK>#GkR>!Qt;VPP z66!H@)s+<(!n)dnI@y#B57-#=xliwXX`#ZaGI`l!r5A8cP+LW!wm~4nKrkMJNj?Sq z>A-`^X?hJ3%%V(b-Q@8s;jSBiYt#tlMF;%AgiwzpX96Ty-@{55D5ZnRj#I<~#Tezt zMv>FW^FZnl59E=!fME`VJ7sKzGklj_DK_%AlSfDV?V@lk)CEvfC^X)B{}0NtOtAs? zzLOt)$m#srH!~}6xD**H6p^=R&N>58H2WyiPj`j@djMzZXB-@ik|#k3I07RfFSKr7 zY@P}=J}wDn%xAa&aNPx1WlmX#34CPO7p%L|WMlIqk!0&YU!=9;q@bY4*MP|<xaBMy z#78rI-vfW_BDXElzQgKfia-T9eh=;BJV0RBT?A8|2XPC#CGefBo!=s&ExY|4gJjEw zVlWzSs&#=aN|NtjhvEDt3shMINcG+|pgGktEY>Eg_2P9&on`gRvsO$4>UzQ_*X%<r z=hFP@kJmnmzx@6Ub<+BcQwxt%>uz-4uc#ZbC#b-vC}+{4Kb3MXsKzRtf0RJmPjtV` zWjsB4JhZZEm{o@{H5u&@5J@68`?==aTAIVs`=yUMp-!0a8Uh`rzxLtuaYx&mh`a|^ z<xR(E%D@hd^fbjfe5GICVc5X^L7hVt3LPB^Bv2`PT(rsChC!-MuSAdbX@}(NGj3mB zy->RoTCuKnF5RICTs597F`<ymlS1A6`<^K6iVWy#7Qw+(ry>zNhmK<yli$b7`PLW) zz*3NODysa&h8vA9R``((b=}<Enfr9TmO0Bj%^Br}S-=qDb1J5Zf0h!D`=L*Nf8FN7 zoPWtt4AC7)-YBnv5^vHmU?3VoY97EyM+l#A+kI|)^-#O>(EiB>K`}B?BfHzd=sNcm zqR9f1Un_Ni`PG5eARo$iBIP1;d@7gzpo)uBv`jfbIh+p%Chq?Ir-Pa*pnmt*M`%Cb zB6I`e^Sfs(WP7CnItkiV(&&!%@(&jMGy$#){#<nNo{ba)_TjD)(rUD%cW-LWyk<DG zS2H?nbM&r&3EUVSrdJp5&i8ki<Sk?5@A^QywYuSUmp>E6%b$|h-4H`ZYBimIRfMe| znFaSbOj_XpP>ixg=KYT@BYjpmxxRlCaQ#okYuA6Di$MpPPQv_?jW0&IddoCRJiqE! zH)s^72sVF;H<Zsx!h}dO<S(kQ1J$Jh^zyaaUKRy@#joDE!=`~ImBDXV5>$HudmWoj zx)reM4rk}Ew|qM*!VOm(suBq0NFc$4$>$muW;sgJ$DZ$gA0b$0EinlbVgqA(fRyAh zm{ro9fUP(q#bFE*h9~0W?@?BMB{ZU<0?V-b@MGTFk2(BxuOVsg@n6BpRRn0+SC1Y> zw>Q_2*I_%S@$HVn>9e*W((+>Y7~#kHQc?hK6ZV5Yf}i>D**-_dt*F9b1ao{Hfbx_k zrN8v3Ew33<?Z?`0qjD<-Y^qaUfPrGvd2BxP@NbQ~c%1(H+ec3$B$@PB+g|HL$2-DT zJ+S%+7%jK1P016G=k45$HM4P_8t_)6M+d%SMGHTAXIZz1Nn-`ribJnl{r759KMY<X z&Ksa~YXJ19H)k>&r>~n&9?kudaz46nhI50gOUL3e^ynU@<VV=GLid+17uNp_LUqpb zF)*i-`gX>j=bGZnsibO}wG>I|6Q~4%uIMf<JXnhz5u?1e%gO$bKPek_JAyfM9wI&G zxpo@qaWpA2y2q+%z6lz)_ODsGnP?>}m8?*LEI;h6I*Hyx%3Ye?H~1z=pvEseAK_%3 zmE73RnB|fC*x7+uRyRwyqGaj=N{y2AZkuDG>KJ%VKkjWwuaA52%MNN+ccaaBD>GI@ zc49=4!A1D5?KXuL+YIUEj2|IeB*Xz6@FGf8N}qcF_JA2ob3(M;Qh=o(mCp=i_$FNq z$>5%xbK*@-A|7Zst@RJo@HQp6_1esb0|<N@)}$nr)By{6WcIMW&VrAb-v!+cBuy%^ zPRx$2(%UJlGl5&U3gt=6!WX=2F}TGz7AA#E@xvD`K<+@U_gtam=U*!9|3)}ZV2amW zaZGiIxxg-J(4GE!6_q!|Lmt)-rP-1BnT&zQc{>p_pLVq14-v3wYA|-!ScFLi6!{CH z`uohs=AY5j0Jp2jX?iN0>6_QwUVe|H%;b1@G{`1op3+xPN&B%FRkCyOK-Fcp|FhOB zNr4~7ilbqzz$wHW@w>((;lhqwM-;S_LBqx)r>{}CNlCtvBbQBr8ea|8r|oPf8<2JL z$_u9eujG@1B<F25M(wy)Bq8&r80$y1t0}0Yd=95=1Qei3e;#{K>Y($mbXSV+1}#ZZ zB67a}m`mL-+9`d3Mhfe@zroaT<ntxm<is6XaXgv1$RG^g8Tyc=N<cI=7A_>`S)4yd zUxi%?N~|+OgQR2tw-p!<v^FJ}>*vAub4oe2fiyx6bq1~505#n2z4jz99V6SLIuRcN ze;n4TnSv}WkqU_Ai<UecPDB`AYmb#~g?!Bo%lY}C60d;5xk=1<T191_z7E5zQ-Wx4 z1%G{Lp*C+8WpZBV7@^`Jf?c=tHD+k8WN7k)U-P3pkVY1?%%j!yH)dJw!`bb<YV#tJ z-mONio+{5F@{wJQNGT67-!{6;8r!U|H!c)L)sL*Y2`{&1S&8_4DNBAA6e+M!)qPe` z8AaGVf7iE*LNtDlMbFQDA6wLW&0d8585WzUMnChyrbvU<@E7+zZ2WFK0s-s+&vwNm zk2nD5byV#H)P(&iB%Rqy%_2E=!MhV{;tc{n`tfJq6*gJ*b;NzYFn&+<+rj}H;D37v zcsU6<8cunI1)GNBP}A1jnWfK=L5+2#EkIs>e4V|>d>dRC+MPXe=@H#RF!uCZ4gXA0 zBRO-$X!w(6y@ZPU#;V8@m{fHg59pgMr|jKsU9zCp_=Py@Z|n;fx_&NeHO4{3Uy<n= zfVAM1AgKdi4t(P(_1z+7Ra+S$a~lQ(-$5Wi-H(P`e~^8_Jr?A^@ee;nfwCuLNBhDD zGyKv%=59d!#t-2C4ML~+kS7rBBuyOr$BT<pjj<1QC%w`M(jP^-BqXR&-bRT@EW$I1 z?s{`+?Ppj*+P~Lof#1FxVbWn|qB1jSqCc#4xh>!fY(L8kx6S3%zlA>Kwri>tyV_v~ zU4Fsee|4`04ze1+ob+fz=#zbf_7E5v=qcNF08W>osG$%%38)ChmyJOs4Cpzv{eT{5 z0JlR^jZYlUA_7xVYwyvP4@SCnoxmRD7y4uJtz?71I&mRG?mhYn-<O?~3U%sa(v&|4 zbVwP&Dl^BEJ=>2M?N=16E{amDoup}gaEZE}Vo9MpR(q%%+%APcMI13Jv?&dzwE(O6 zj~|5sd&3vl#!bYL#hANZX<D6Ex30hm;n3y7BuPdT=vvV=K+d}a%st2kAQZOCn4G}B z5%lB&J>x8<^#Y58^=M6d@oSfalT;nz?~|t8`ZcEFMqP|M)Y^w5R3J%p<@L=Pw&>bt z8Yv669ey|_yfFeCIhnCFFYtKMz$x5vdGCV^65J`6{*?Cn&d0_lQISWi@>Z}K7}hoR z5oiM`eTWNLS3^b~ZB>)wDY#dnd02jz=JAG{c6EeqT1u;Z(?dC=%#;>GqEI&JoqyLA z?zb}`aSV;jJ}ytHsFJ*$QbYUAQJ>oR`KA^rZni~rj161#K<SI2kb6UjO&Ud3sF)JZ z9+okPw6Pa%H-~m_h~PyG8SWHD8&-J=LyDZ{3-GU8Xm_h}Q0q!y<ZJ<FdQC`2VzTJG zCvNt2H8ko}3**!3$D7lY0Pevt9ZkyINGU<xRRlD~1E}wsL|JFAb*FNjJJ&A`=9So+ zWoxj8&P+T+bdin+{zp*C-TPlg7yl`v*i^_s>mjf+cA=vu3f#}*TnX)~QD>(wMaP83 z%9&CrDS+;@3$e%FLyn%L90mwL+OV&H(?d+CsxCPIBh6*d^5@kZ354}tIBZ@xRME=F zWT6T1WBw!Qs*mDZ2OPCg3kol2^FE;qKcfacZQ-%-Ruz!K15c)0t@ytANEWErOfG)X zrEUB&%VVQ%NF@0v+cgqa{wh!U+6KqS2nN_Ax$V$J#5`Lbrn?T_WkTf`J5sL#;2>LM zHvmJaum&5l%)K{;J}d|*4e%h81QgWy<N-bLoqrEy%8V13hZ%58BE64MZT$?g=U$)q zGR+whJ=cLa+0mUS%+R~S!~$w~wB%q#g7Z-%iO%m1Xm7n7y39^5X3qgbJ*6}Eecx6Q z#h?oq5+WhbpeRn+E5MOOYkK5B42aZ(Oqj}$q{}W6RCZTp27E*Oz1O?BK_gler-X9* zMgmg>{?T6{tiTbP%G9eORv^#LAX-F7q_9Eake-QXtONQoBE(52K_<2Qv6rVmAK`C% zF}Y7l2wHDdi1dViTePdq{0cNiLW}7~0Wf~<0rgmIT|XmGDXBzdV5T6n9;DE4G)oL^ z91$i;jM}WF0{(416T-w>g@`0)EK<x~tY_k_{J5HrF3)I|e=6IuI)jjm(*z$2qK5v& z?>BY_f=VLFzX9uhqmrBfSg~y^Le?OR(}^wJ5sic8`+46n>2)m{>ghmon1PLe#G<di zW<wEA8h=&Q8si3<kjwcYWG)1%hAae55$-aILVXLXpMe#Z#{4f^6I@aoCpI*7C3MR$ zCP4VH2`@58&Xb8$o#fvdkY^xRUH`E}FG_h0Vx12*10XF7)*+&Cwc!MUA?<*yil~DK zfhOMR{Q7}6YrBn(EHmFz5a)t>8q5MIf>cBP{|v=++i7Sq%TxNYpd$(O5&JX-J0Uob zTp4*``dEcx)mN0!4mgg$hBFXOq@>ALC3)R&T9EAb-vBcZk_nm@2s4t1HPDgx{{~J0 zQ6Sj=&!ixCpl%!#n#{0?T|&>2z+=-%Pjwqlb3CuKfGSQjSfr5zX~+kn1%XUTMMPba zl}eDDgN6`*hf7KbEYqW^-h%@oPyzg))FnlGPmYSvOv&4z0Qe|k?v($gDeQ(0%;h4b z6!k5Kj9MUyWKspl2j;M<_|8PUF{8f0BR6~rRuSS|kOM3Nyv0NC6XrY|rdm?)lL7eo zO<yETS{*kKkONOBnEJ{iE%z7s30DtncH5;iI0NZOi&&KU23l#zn(1K%{O%PLSZvbU zI8b2&a$tolM2pAp14qg=9C*CcMeTn3$?Y8z2A`zWJ+Zu)Tt)x0UYfNZjl`lC*BFFv z7R2nmEP;w}frc8XOhv+o|MtYL&p{pJbDe(aa0lRY(Rn?2l-M{MuB{XUd!H)&L2ZIS zmMu2;XBt73cO^9lgIMejBypD%L>dDQz_t2>#1$>HnE?Q|%0hJI$<gfUrj=vCe#)$Y z&j}|_$FdjxZLK($xM9E%dQAfw;_Gu#M4IM;tt=pQiyg}EXt*!8s2@2oEN42Gb<RU< zN|-~a)1C&y8{?_MJ%borB*?YOUEEU4onx3Y(<BDekO_G9cH<-rS)2HSuKczODAMfY zPInt3&4I_iiVoHTuv70Qe?bzzL4xI^1G@crKXT*Blop0;PK3BZ#ryvSvl&e0=)W)y zOK)CapE*#PHH5jW6sS$9ZK;i^t!>7j(Kf;!xN5)_K!ZX-vlf}O1DD2OaBafQR&$xf ztwlgVuC#=u8;2mVVg@BJkI&T=ln0@m`Nt0nKSlQK@8&T2=pNLz)W+1-)aJJBy5(6z zN*!I$X%*Jp7ySncVc|Pc!C;?{X<AkS&H@Qb|8~e`4Ja@uREyRBoS5Hd5DtPrt^?u! zn=0X-M>|z!ecRTm-1dAyBV(YZ0^lZ|r47i6Eg-~~xsY7xHfB>*l)zx11mY_k@H3=b zj@*y46XHLwF+l%Q0A6|KKea*OpKc=n+t$?P)b`W|JVs&OV}N4-4U8V^`xg-sXE?!v zmPXT4RZ3vl$ii2<1D!SiU=D3lHv7|7_=f_YzY*cD{P}XQmD-%zemWMw7tCi2a15YP z5Wrph>KyjGsd5LF{q4fCI}onyz_jpR)Lh}O#<qF0m0S<P3ZMxzT{w?c0?h~vwu4Hv zzs15&gh?TGGwcF1!F1H)Es)AuN}!$QKXlgYp9$OMZ1zK=<A5!I2B1Kfa0L{f4XRjd zTB=n_;4>9>z;xy8cZAvhsTR)s<u;}^r?%$<s~V$@Ex``|#~cL(q~ZX%CyU^{qQRwt zpJosGqm;lipE?MI-5#hkRng7-x0=;g)sJ$_5m27_DcYaDDA7{kuY3S%Yie_9d#)0k zomySME<l53r1g0x3>^B`d{7TyT2wh#RsyGyC9uM+&mCwMb(#GMSlVK<-?ps)+t$?P z^UjX+(p3X?0UE@Xs`g7b@RKZ*_WHrH)fN==h-xKp3%LVsuo}+k2D3i_OKIkhw@~<L zg{1=9#?;o-<}FdSJq9a)Mxg;u6>d`op1*C}ZvN4#`u-V}K!>se?G*k>%>cD6wK27| zEemF^w8aX5HUxk!Fk`y?(qQZP^N*L{*$oFlPf~?XYutgFN}x{DZ_ZTRyHeO=&Hh%; z{M3e2Z!u|X+fo}-TT`2Nyx%bdSB=v_*#c<RKqV#6FJbEc6=Ba!2kq=w5!RL~fiv3Y z4jeJ_f4cR;PtQt!kJ^;l)|&ni-!q||umWfzG%#ryZ+=$^p1JuzdzHZH4)|nwP`y01 zZZnTg2tTzYwJEhN3x9K|F=tEwq8p@uIN@3sw2c+*>_Y=~&&>y5`Dc%_LRuNnEmH!Y zJ<k5U!XD4|YSa5mQdJ*9|3&fk&iwRDyGpiP+ITI}Y>{SmAAl`@R=ERd358vr9l-6f z1W4H=&v3!d&|;zHNoFP0*?)c<mVJ6*n}wg&Jn+olDp&!uR0)W-D}mEKa~ve?I)Uc> zA)PglJky0!Zz|9HE!vW6X5o+iK8c-#7Xq~~0!u6PtP<Gi!JeDiqyz>ftoXulR$zl) zG;q)Idt)a#u;TNJz!{K%@XJ;Q{0`VQn_lhM=}0<;_^JV004-)(3G8Z*5};0xo#?>e z<-xAR4aFVG3Lt*6bGZDr9l~Fk`Kt~JVOj$#fOfkBEmi`R9fzBm38>t!<*7b4`@63g z2+O5FoCRnIn$2WdKz?Tl_Iz>-mj9PUEz1rxT~J%J1@{rc|H(0XS`wWSWPFbHx9Mm= zwgB1*oq<P|0Hp|@{^VF|ErBklTKK6gs7(U1pM}4junW+!6k+cwfun`LlIQ1WfBWGq zKnEhTL10iqVP^@RzOlEIz!AcK<Ctv&EBqYo2hIZY5YtLvSMMl+R|$V*=I3aC$6yzr z)9%1Ppak|rTnQWz@T&;_0Gs`thFyRTFVwKL18E64atCgRrV=<}=D%UgKC7Miy)IZN zgAu=Kz<UCA(PE(-xdS)shZVO{icqyCMc8hpg<l84zsmzBEjZQJC4_x=MXQu}pqwJK zmVgewB~V^A>>mn*-<I?a@Y?=vqV^UN6*Hm^bAoA%iaS7yg-BpRZ3)nLq0)gO!k$kb zfZS8%dVVtdnXVyh!>VVp16B!qBBYi834i(A#AiM|2HD4of$(#*zw2NH(8bvS>kfoX z2^=N-llK-__(SaiRLVcu1!yaWvjd)00@fWE>T-9WTKGRz7JjOCV6(q-6dP0krv8jV zI1%N#_oEA5C`H%d2cOOk>@30V8^+-DZdL+S!oP=ve_H{ZAu8<Y@aO8{{_O_p*hh8_ zNyRWh1A~H89)K>GV4LZ~=U~}==Vd~IbjzkUcG4XnB~XOjH|&SgZ(ZDdO5kYWzc+7% zzoUgcA?e@NBbtx}h>HAIYUN3AG}v8q-9-upE=oaaWej4+)8_gBC42T<$p){yF%7Cu z1_x18w!&&>ThR7<w9jXGvC!^M?1$68&_zn1TKNB_Ec_L-zgpnhK^XhD!*t;}vn`~2 zsD;iUsHA`s-?IRYdwXB7+szDk`!yW+Wft~tngpFkdmu&IE7tI^JK*$pnG!f!__tMN z{v$toJ3mk8`nSV$dj4oDc5qA~Bu;bTj605p6aM2sFgQ$LYFA(MGx{C9hF(kWq4(Mo zcsjaR=&%x?1vVYa4%8C<4iNVK?F2oe07y`1W=Je|;fyaXwmauem!QgE@Kj%w%m=-O zUQ6$x_tHH&X?9oK0a_=p`>#8s1ZEQc4oCZ=(!cGd=A%-iGzu3*qiIX)(>5L#n9g+C ztWzUKLV+ZwJo64I`(C;S-K%5I0_A5Zy92x0tpuus|LL2@VB(%Us0Bf^--e2~f1#VM zTJ(gj3rs@;OWrjAiKW5JFc(wL9{KHqeJ|aE?$v2iv9egGtxDhs;osjCW`9)sw_Vhs z05J5I@hBQBVbP!TPX~(TO6Bxjx(D5h?%C<*LJw_a9i<3&eSBYQmB38Gzd+c}(CK!F zYX3r0t{&eHfEIz6976v&aqFkrpU-EP+j4q{?m_pWd)fsi9q!xe>_E$ufH_L|?<xEI z)zN<LUkIW6_kasPLTUg~t75i68rj{vvT`hSR_w@yB^{<ZJJ56`P+kgtgz$HP+27Ls zT@`ED@n_ve^c4UhDCOfcr$gypCpcZ#a?^{2o@$~Js22X4s)XN*c>gYL(!D}J<XwPz zO`*D|oRv4^fKcM_64GwCD(=8QSqWU<pb|Jr_$k_dM5-@}{aa0^pQlajQacS8fy)@M zOFo-MIh4?i7p3DUJCNO3f}Pb$U=ELuRl>i!BK+mTo{*07IfD_oYS9B(fZ!Q|Xm#az z8U?%h3bF%%B|u7`w9gMxUAo5Omlwv^MKxIiyFa-PChy5r74~%V)od^#7xZ{BQ022X z+o$XDb|HbK6k&d65uW<c%dmXoV(42F4}M8YV{zu{Ia>Hsc+P`88^<8`WU*}acj-g6 zsvofX`?qdtjQidy2I?{FVxfL%-JhKweFYZ(X&M&&`!vK)a%LPC-T@5<em(`SP;tzp zvGIhiiS{!sffYc+u}hxgl*9*k`5z`=>}ONZe_k9?E8`G5L4lCMx(HNTka@TO-oBtb zwiheodXe670h;~!!_+QiLAD!nmJr78%)$7U+>!PAGT0!)zNTC~7Yf=D0*LVW;7%{J zLn~dxFkyw7_P*#RXTN&q3)*!AgQBUh2!0hT|MQ1kfL>#IwOqB>giVz(ZFB+3A>&5Y zSauRSRX2IQuG}+>W<b=S_BTx)pGc-qRsD5@eSj`o(8@4OJ7ERDFg?udF2DpWd=F{F zs{&^Mq77#O8iFkVhUsB?CJoq%dxp79q6Du5o<Gq)9-K|YXv6*65Iu4<SgULRraNF8 zZ@zF0fMI%=-f;nXxfUSGa5->8<-lwKFia2AGg$y^wpLXlxO!ys$gYL<^KU^vU<AfJ zQLOR%-f;n%c}ow$JE%bxf;xMqbI?|2wC^F6IX4xIhz4kUN1!OQM3X*$xiRCXxUlTH zg&<tfl-n|m^@%AUq*j%;J8Q@iz^WUBeazPfmjllMQBeRVI&ji^hFa7mOe6Ht$-d2? zcU*ub?+AiaF3NNbw6$4N;{X^jBVc6aAF~B8A84#m;E7>EPS0ck7-lZx1tT!->!EjC z0EU_Cn8E1h0XbyCFg;8Ur2!dcF5?9wGInN<RrQDk5cW=FnAXrcF@Ugsex@^EZ;YEB zu>cr`nX?5TeIZbRz>u$aMG#OL3*nJBO#4BA(tZtwPD%>70U$tt#LD{Bc_@H!ne|+7 zi=oy420^+2xu=SUSBx>tOo-shJy8TfauZ?=K*DdRY|W9yIlBP#X5zBDS7odoppvVQ zHU%AQB$E=Rb`&AMr+i8ZSMV{f8Yp0e-XGU6d4CQhosJyR<=$kwD3V#ksT7Lw=^xJ} z27o}*K7c?h+J8(RuNA(F3Pf~P!^=My56;01X~#0H12t&?fPFungyJhcNL%R{;xTWZ z%6P8H`LjLuu@nHphUo<2egzZ=u!;r3c%hHrq$TYC=_F+StpLIi_Gb)J5q=sIg%><{ z>AQzO^~pdXbivr2=Y`Vllp+qU3at2PtG;dvV03ge_#MJ4($-jta7#@2H0+%>?1lU@ zrNc@f+)u?c0tS-<6?V}EFHc>+7j(veq{vu^#|2H+<N^p3`{{e!fbv*RG)oY0UHNYE zIRUaf{f9V!W&lJy$Ob(AffwP-TTg`axryoDVdZq$*@LD`*s1DgA;C@rG$HJ~;bq7^ zSp;W5fuV^Z)Wbj^#qChwi&c}knWF+2wf{E;pRvLbgakqjY5<iiD}k$DgyYu_!tuj{ zkT}IXrisKvjl=z18uMZQk0)X8_s7AXG~lGwVb>7Dt>h$4`Y84sF`3Ur0qkG0&NhJ- z{w~jytXmNUAt5Co<H25jFaGyKu<s|6FmQen`c}swezFVkB@Qo-iZI@o4}}+f$URwv z$p`aLeAx%pFF{e%pZxwvU{io#3_Mjmna@c93~vr}U;<*haynm<LdKAi>QS(f%f^s9 zBms*C4sMx(1HZ}GCnJ-Pi7w~|Ss?QJWl{uVfLy=`rG^oVD(XDAj(VbcGM@=iD{O|t zsJ1<~^QnYNtSFj-2|T9=K|*gAfCN#(ii^lZlVJKP_q7SRsXqfWf|YQDHh#uQ^sTsX z>&au3(ig`F;?K4c5I4alB{mCv?<Kn)jfvQb5*8{6#^^xd4cjyk8wt#e1ic*TzQ(wS ziyU}6YY9Iw>ukPw?QkIOXtvp?V#HgHVZx3;VO;5gkn(=|est}qUB)}FT7dma0)a;q z_ZD@LzM*^|!!TV6A_^*G0$<!y&+BJ3=qu*KmbI_+C-UP@yE4Am!xD-p1Ogc*dRW;+ z01wb#dC7fe?I~yP%)DFx5`KyUT)Fl5DG=)JgiP2FV@p0d!!Qj8024AvF8iYw-?#Fa z@&s-g+7Zac0k#52V}2!-{CBn{fc*f5={f|0iK&<@VD2}8<&F+)g?SYNO|x!mFyng$ zex30rJP;z}E2SAGnxH^gFnK^>epVgBn~l1B`HCNL_eD?M)$jCQmh-1Hh+vZdhG9An zt!jwNge;o;)2?25)<q8ruUyeEs}iW|Xt2?>Ai-J!;`<7m%Me3e8OShE1HmLzQWi{U z^MwxzZ_C;(&XrrQoYnj%>RQz|x^<&<0~EMFne->JQc8!{%rQ*&fC5xjPoWX!hxGma zCHw1|r0Y)SZ5l?kezVYbU--m74!A>CWxNR=1RpNSFdYX`r<{H{<xkyx=>sb-tCjj| z=yYHQ)YnS7c$NJl5hxL6n6N|ZeiSMpL4A$BA6+|IcG+t)CkfsF8{`O#nBTwdiEVvO z|LgO9)_|~k4>1hW8H_7qqNIz@gPS_*4cksF&<|%@|6k3VD*M*0U1wjfKz`8y6)Xv0 z7^ZU|nv_flDa2RbxNT{k*8bNk{KQ;scq{bVSA#p5c=FM>N}gFXdCE3Kt3;S#LI4Hg z9pO?4;E<61YhHi<s)O|NxhR0S3NDg{IeUjFfe@divO}ESOpjrhwt}GhRa*FH?zs5= z)d%J}`xEnt;*k{~U>L+byPtd@srt^#>m0`d7^bbDiHQVwSbA9~SoO>MzCX1QHsV|r zfHN<>GYpb83c2gGPuwJx`~|rMoDpD{_F)h);U-l<=Rb4VeXAyE=Pt3izSLhe^YYzE z_%{u2QkOq`)-R|0$zP<^fI>8U`X<A)EAOxR)P#TV5wHKOzYliqnqQUfyc7BM@DTvq z_S)TNI0_yyh^`MlEkNMK0SwbZ1PDJa<4#@|*IxS2$~!BI^yYW31}K{y`uFGWxM6{F z+~>!=gT9c$;p`y8w1D7TOMij8&^hFdee<%1*Sx<XgY&)Rd}08H*$jrXPyFczZy)#M za8mWXE~m3vaHSx_G#xZ(Vlu8K{fXy2Ox;LU_{Pl}8_L2pY_3<<9p7{QldGg~9!4~Z zT>*w^Iuzm837K@JOy<p3JhbMwjhOxw8eYId!cS(%8y;HuxaSwH?Ne!5BFF(jhG`;* zs0Y*nXUflfo`j#ueH#^iqG<uUO8xQg&fD?*1@6Lk*?54k=d3ae(*OpI9&iR#R%h;f z!^11r1!;J@KS#rh@S3)Sciq-?nvNk(ID_xa_>+&OoPLK>gACIcbi!XkB`Dv&*Hh-5 z^s|lj*uLg$%G1=8T_ql{<^0Fa=!3+)2r%TCA_^h7R)AsV2%@32{>A~vWMO>W+J`T= zyBU6eHBB|qEAaraS?t=f=FvazbNhZP!3B*T3Xr@$fMMox#veF3A^V(((t&rcee8m} zt((1B)ZFH4E;M~+rktexpxe(G&6@0A#AHk=a13uD#xV6kvLZp~KGp9``iHJx``EeP zr!Btg+2e1nw8S*05Bk9C9&oRG<eVQ)=}DUzkSH}*4l+zFXv<yU4>}8-Nq^$DD;_!f z_CWZXJM&j)saZ}+;KBzl^zJ-+$9045;FmIb(jXYY?f}CaW9CPp2i+m(kay_z%O72J zeIWdlR&UKt+%5OZE86SMb9Q{JPxakiGzFtUQ@nr!gA8+o*)I)Q%Nad!+vSg}{zMS) zYfifFShOWDcUTELc2!cQzNbM;&y=(fQt=@}Om8D7+Ha(gqEGgVDU-SWvPV|m9;~Zb z*Rq-a@Lz8e6(z8B%|mZZsPqq&aE9_a>x<y1F|HqCdJYk+@bhCb?g$X2g3i6?itXq8 zLs?cR)z|Xfw%TTflkk&PTf6=IUuXQu%Y5TKHsCC945DxB#>NcOTNp&Y-x+WK<nviS z|E56rw^RatZIOw#`r(uvpa*>Ojth1i%pbTkYo<02Itxhq*-Z}G`B@mIQy?PEd1iq# z<P>y%%OO2>>6JUq{$0Jtc{P)cEY6`FOxDACEAYQN=ZTLw;NGf)bn`k#E&-i0z>9{M zNP>uVGY=^g?dSLTUp@MdH`7@g&0gVGFC7y!+E{e+@MgJw^LqXJHBVe5rTSK%>VNHo zf5=uo@ty)q)K2dO02ow5GN-e9N?7>7+U@83isWD;fEcOsD6eMIu~Z!GUP{7GX3wSD z&$|ElLl3=i%Fo>5fa_5zgp@#~(HJJg7(n!sG9?otDYGW~js2yG*OTzm*e5yYl<-5h znA+7Y!CmJ({yGQMtqGZUlZPG@b>0VI*9`Ew0VXsc1-21%OvapqOhI1f9x&3}c<G~O z{g!^;DU-h|6#zk|5FKn#34&}}{p3|B#mz~XT9Y?<@J!JUDvEdk5!2Ne3h*iEIDIk= z1(SP58~w#!@A$ztM_|OKVmaDMZ?60IM_vIOz1uJ~(07(?Nv!NY`TYRmnv_Z|FPZ`r zFmD73EL#O#_xYKgMbjZ!v}a#ZrXZ)M_94JGN>1*}SN_}i<40S%-9pz2P_>Eli!-(j zEKDrAN*n#5xQw4eX~V3UqL3<E1xyD)11Jm%bW*Yplu%I6`Q1{$H?>mVz4VbY_Ssi8 zxN~n$Du4hKTdLdw3YsMLpYlft`f3F6mOj<z7O@BglP8-%gAjCV8J|tSv}!ye(x9|L zZ&X|)MM5SZYqB5_wjzjcj~$x)@jLcjn5&Fe+9|7B%>585fSKb1#9gbluW_XFrv_nI z2yrfHU=K?`Zh}S~G`jsCD+FfV;|`%B@PI-Jsp2vLF%h%l%tL>t6ypCXVgC2UkF9#3 z^1d(#ey9{c6=Ksc%Hhp6MqpDX)G_z0e)=K+{dR-;EeLRaN~KZ?XrYA%B`kuEK6Qk# zXPeuDi^yQG&o08+5KQA>`75nM4ZfujLSF=pE9D4BxFQBF9l;F<S)DCO5RZTm|0<;T z#egZ@bM}t2OToSDfw{7q0(|ul+Hp@a`{>$HdGylB`_}9{)zjuul=ucjb0L6ODTO>P zDH9+-+K$wy?PWmIri-*D+kRzw2Z|#}A?=uupsfF{%HPvypc&prZvsH<lpr4jf%gh< z?t0^nGj~<rr##z}(1&sWg;oI^eOx&ygPF{($5ubLa9n3sNTpt5&^t>bE(Zap0K)Mo zaDf1s05B;48AmW=Swx{tm}5XwJoPamcmf1Pl1nIXT%vjf1-=9T&nh9GK%<_JG5K^Q zkax7u@87x~hhaEWv;9m&Zm@5F4RYh~Mlrf?RMhgr9zOTsK8ZuI{r=cM+8Ih@N*Rbl zti2zYX)`5=K^pQ{Dh<Vx<CCSFf7z3(GPAvd1fIT*Ze3?OxoWQ!L{0(BSaSfI<>IxA zr=K;<CL7cGi30#2Dl<G&Lpjhzolh|ZzIvw(%6%?u@U90YLWW@&hG7_nVHk#C7=~e> aH~Ig7Sy)g8@xFcl0000<MNUMnLSTX}^~gE^ literal 0 HcmV?d00001 diff --git a/explorer/icons/pdf.ico b/explorer/icons/pdf.ico new file mode 100644 index 0000000000000000000000000000000000000000..b86e969ecc741dad6919f69e36c365f2e3bee8a7 GIT binary patch literal 20021 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 JPDHLkV1nR|@`wNc literal 0 HcmV?d00001 diff --git a/explorer/icons/resize.ico b/explorer/icons/resize.ico new file mode 100644 index 0000000000000000000000000000000000000000..5b1754dd0ab932444f685b404b205c18adec2a89 GIT binary patch literal 22913 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 literal 0 HcmV?d00001 diff --git a/explorer/icons/svg.ico b/explorer/icons/svg.ico new file mode 100644 index 0000000000000000000000000000000000000000..b00c97a2b92b47b76ac10a089147c65cdbd1b369 GIT binary patch literal 22352 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 E0Q@8#V*mgE literal 0 HcmV?d00001 diff --git a/explorer/icons/video.ico b/explorer/icons/video.ico new file mode 100644 index 0000000000000000000000000000000000000000..b5febce1003bb04b29ac4ffeb2e85804d2234524 GIT binary patch literal 21646 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 Sk@`Xa0000<MNUMnLSTZoGWXyB literal 0 HcmV?d00001 diff --git a/explorer/icons/zip.ico b/explorer/icons/zip.ico new file mode 100644 index 0000000000000000000000000000000000000000..9e6e7ebf864c6db2b27d66da8c9ab071cfcaa086 GIT binary patch literal 21937 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 literal 0 HcmV?d00001 diff --git a/explorer/menu/Cargo.toml b/explorer/menu/Cargo.toml new file mode 100644 index 0000000..8df692d --- /dev/null +++ b/explorer/menu/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "justtools-menu" +version = "2.6.0" +edition = "2024" +rust-version = "1.90" +license = "MIT" +description = "The JustTools File Explorer context-menu model shared by the shell extension and the CLI" + +[dependencies] diff --git a/explorer/menu/src/lib.rs b/explorer/menu/src/lib.rs new file mode 100644 index 0000000..ef988f5 --- /dev/null +++ b/explorer/menu/src/lib.rs @@ -0,0 +1,870 @@ +//! The File Explorer context menu, described once. +//! +//! The shell extension asks [`menu`] what to show for a selection and the CLI +//! asks [`action`] what a chosen entry runs, so the two can never disagree. +//! Nothing here touches Windows; the model is plain data and is tested on +//! every platform. + +/// The COM class of the context-menu command, without braces. +pub const CLASS_ID: &str = "7A1D3C52-6B0E-4E2F-9C41-5D8E2B7F4A10"; +/// [`CLASS_ID`] as the integer the Windows bindings build a GUID from. +pub const CLASS_ID_VALUE: u128 = 0x7A1D3C52_6B0E_4E2F_9C41_5D8E2B7F4A10; +/// The extension library `just install` places beside `just.exe`. +pub const SHELL_LIBRARY: &str = "justtools_shell.dll"; + +/// A JustTools command the menu can start. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum Tool { + Video, + Mp3, + Audio, + Wav, + Optimize, + Resize, + Webp, + Avif, + Jpg, + Png, + Crop, + Rmbg, + Pdf, + Svg, + Json, + Links, + Zip, + Paste, +} + +const VIDEO: &[&str] = &[ + "mp4", "m4v", "mov", "mkv", "avi", "webm", "wmv", "flv", "mpg", "mpeg", "m2ts", "3gp", "ogv", +]; +const AUDIO: &[&str] = &[ + "aac", "ac3", "aiff", "alac", "ape", "flac", "m4a", "mka", "mp2", "mp3", "ogg", "opus", "wav", + "wma", +]; +const STILL: &[&str] = &["jpg", "jpeg", "png", "webp", "bmp", "tif", "tiff", "qoi"]; +const ALPHA: &[&str] = &["png", "webp", "tif", "tiff", "qoi"]; +const WEBP_SOURCES: &[&str] = &["jpg", "jpeg", "png", "bmp", "tif", "tiff"]; +const AVIF_SOURCES: &[&str] = &["jpg", "jpeg", "png", "webp", "bmp", "tif", "tiff"]; +const LINK_SOURCES: &[&str] = &[ + "pdf", "xlsx", "xlsm", "docx", "docm", "pptx", "pptm", "md", "markdown", "html", "htm", "txt", + "csv", +]; + +impl Tool { + pub const ALL: [Tool; 18] = [ + Tool::Video, + Tool::Mp3, + Tool::Audio, + Tool::Wav, + Tool::Optimize, + Tool::Resize, + Tool::Webp, + Tool::Avif, + Tool::Jpg, + Tool::Png, + Tool::Crop, + Tool::Rmbg, + Tool::Pdf, + Tool::Svg, + Tool::Json, + Tool::Links, + Tool::Zip, + Tool::Paste, + ]; + + /// The native alias, which is also the launcher and dispatch name. + pub fn command(self) -> &'static str { + match self { + Tool::Video => "justvideo", + Tool::Mp3 => "justmp3", + Tool::Audio => "justaudio", + Tool::Wav => "justwav", + Tool::Optimize => "justoptimize", + Tool::Resize => "justresize", + Tool::Webp => "justwebp", + Tool::Avif => "justavif", + Tool::Jpg => "justjpg", + Tool::Png => "justpng", + Tool::Crop => "justcrop", + Tool::Rmbg => "justrmbg", + Tool::Pdf => "justpdf", + Tool::Svg => "justsvg", + Tool::Json => "justjson", + Tool::Links => "justlinks", + Tool::Zip => "justzip", + Tool::Paste => "justpaste", + } + } + + pub fn name(self) -> &'static str { + match self { + Tool::Video => "JustVideo", + Tool::Mp3 => "JustMP3", + Tool::Audio => "JustAudio", + Tool::Wav => "JustWAV", + Tool::Optimize => "JustOptimize", + Tool::Resize => "JustResize", + Tool::Webp => "JustWebP", + Tool::Avif => "JustAVIF", + Tool::Jpg => "JustJPG", + Tool::Png => "JustPNG", + Tool::Crop => "JustCrop", + Tool::Rmbg => "JustRMBG", + Tool::Pdf => "JustPDF", + Tool::Svg => "JustSVG", + Tool::Json => "JustJSON", + Tool::Links => "JustLinks", + Tool::Zip => "JustZip", + Tool::Paste => "JustPaste", + } + } + + /// Whether the tool can read a file with this lowercase extension. + /// + /// A converter never lists its own target format: turning an MP3 into an + /// MP3 needs the tool's explicit re-encode switch, not a one-click entry. + pub fn accepts(self, extension: &str) -> bool { + let within = |list: &[&str]| list.contains(&extension); + match self { + Tool::Video => within(VIDEO), + Tool::Mp3 => (within(VIDEO) || within(AUDIO)) && extension != "mp3", + Tool::Audio => (within(VIDEO) || within(AUDIO)) && extension != "m4a", + Tool::Wav => (within(VIDEO) || within(AUDIO)) && extension != "wav", + Tool::Optimize | Tool::Resize | Tool::Jpg | Tool::Rmbg => within(STILL), + Tool::Webp => within(WEBP_SOURCES), + Tool::Avif => within(AVIF_SOURCES), + Tool::Png => extension == "png", + Tool::Crop => within(ALPHA), + Tool::Pdf => extension == "pdf", + Tool::Svg => extension == "svg", + Tool::Json => extension == "json", + Tool::Links => within(LINK_SOURCES), + // Folder tools take the folder itself, never a file in it. + Tool::Zip | Tool::Paste => false, + } + } + + fn index(self) -> usize { + Tool::ALL + .iter() + .position(|tool| *tool == self) + .unwrap_or_default() + } +} + +/// The lowercase extension of a file name or path, without the dot. +pub fn extension(path: &str) -> Option<String> { + let name = path.rsplit(['\\', '/']).next().unwrap_or(path); + let (stem, extension) = name.rsplit_once('.')?; + (!stem.is_empty() && !extension.is_empty()).then(|| extension.to_ascii_lowercase()) +} + +/// Every extension the menu is registered for, sorted and without dots. +/// +/// `.ts` and `.mts` are deliberately absent: they are far more often +/// TypeScript than transport streams. +pub fn extensions() -> Vec<&'static str> { + let mut all: Vec<&str> = [VIDEO, AUDIO, STILL, LINK_SOURCES, &["svg", "json"]] + .concat() + .to_vec(); + all.sort_unstable(); + all.dedup(); + all +} + +/// What the user right-clicked, reduced to what the menu depends on. +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct Selection { + accepted: [u32; Tool::ALL.len()], + pub files: u32, + pub folders: u32, + /// The only selected folder is a Git working tree. + pub git: bool, + video: u32, +} + +impl Selection { + pub fn add_file(&mut self, path: &str) { + self.files += 1; + let Some(extension) = extension(path) else { + return; + }; + if VIDEO.contains(&extension.as_str()) { + self.video += 1; + } + for tool in Tool::ALL { + if tool.accepts(&extension) { + self.accepted[tool.index()] += 1; + } + } + } + + pub fn add_folder(&mut self, git: bool) { + self.folders += 1; + self.git = git && self.folders == 1; + } + + /// How many selected files the tool can read. + pub fn count(&self, tool: Tool) -> u32 { + self.accepted[tool.index()] + } + + fn has(&self, tool: Tool) -> bool { + self.count(tool) > 0 + } +} + +/// Artwork for an entry. The discriminant is the icon's resource ID in the +/// shell extension, so values are stable and start at 101. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +#[repr(u16)] +pub enum Icon { + None = 0, + Brand = 101, + Video = 102, + Audio = 103, + Optimize = 104, + Resize = 105, + Convert = 106, + Crop = 107, + Cutout = 108, + Pdf = 109, + Svg = 110, + Json = 111, + Links = 112, + Zip = 113, + Console = 114, + Options = 115, + Paste = 116, +} + +impl Icon { + pub const ALL: [Icon; 16] = [ + Icon::Brand, + Icon::Video, + Icon::Audio, + Icon::Optimize, + Icon::Resize, + Icon::Convert, + Icon::Crop, + Icon::Cutout, + Icon::Pdf, + Icon::Svg, + Icon::Json, + Icon::Links, + Icon::Zip, + Icon::Console, + Icon::Options, + Icon::Paste, + ]; + + pub fn resource_id(self) -> u16 { + self as u16 + } + + /// The artwork's file stem under `explorer/icons`. + pub fn file_stem(self) -> &'static str { + match self { + Icon::None => "", + Icon::Brand => "brand", + Icon::Video => "video", + Icon::Audio => "audio", + Icon::Optimize => "optimize", + Icon::Resize => "resize", + Icon::Convert => "convert", + Icon::Crop => "crop", + Icon::Cutout => "cutout", + Icon::Pdf => "pdf", + Icon::Svg => "svg", + Icon::Json => "json", + Icon::Links => "links", + Icon::Zip => "zip", + Icon::Console => "console", + Icon::Options => "options", + Icon::Paste => "paste", + } + } +} + +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum Kind { + /// Runs the [`Action`] with this ID. + Action(&'static str), + Separator, +} + +/// One row of the JustTools flyout. +/// +/// The menu is deliberately a single level deep: the Windows 11 context menu +/// draws the flyout of a top-level entry but leaves a flyout nested inside it +/// empty, so every choice has to be a row of its own. +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct Item { + pub title: String, + pub icon: Icon, + pub kind: Kind, +} + +fn entry(title: impl Into<String>, icon: Icon, id: &'static str) -> Item { + debug_assert!(action(id).is_some(), "unknown action {id}"); + Item { + title: title.into(), + icon, + kind: Kind::Action(id), + } +} + +fn separator() -> Item { + Item { + title: String::new(), + icon: Icon::None, + kind: Kind::Separator, + } +} + +/// Drop separators that would open, close, or double up the menu. +fn tidy(items: Vec<Item>) -> Vec<Item> { + let mut result: Vec<Item> = Vec::with_capacity(items.len()); + for item in items { + if item.kind == Kind::Separator + && result + .last() + .is_none_or(|last| last.kind == Kind::Separator) + { + continue; + } + result.push(item); + } + if result + .last() + .is_some_and(|last| last.kind == Kind::Separator) + { + result.pop(); + } + result +} + +/// The label Explorer shows for the whole JustTools entry. +pub const ROOT_TITLE: &str = "JustTools"; + +/// The entries to show for a selection, in display order. +/// +/// An empty result means JustTools has nothing to offer and stays hidden. +pub fn menu(selection: &Selection) -> Vec<Item> { + let mut items = Vec::new(); + if selection.files > 0 { + file_items(selection, &mut items); + } else if selection.folders > 0 { + folder_items(selection, &mut items); + } + let mut items = tidy(items); + if !items.is_empty() { + items.push(separator()); + items.push(entry("Open JustTools here", Icon::Console, "browse")); + } + items +} + +fn file_items(selection: &Selection, items: &mut Vec<Item>) { + if selection.has(Tool::Video) { + for (label, id) in [ + ("480p", "video.480"), + ("720p (default)", "video.720"), + ("1080p", "video.1080"), + ("1440p", "video.1440"), + ("4K", "video.2160"), + ("source resolution", "video.source"), + ] { + items.push(entry(format!("JustVideo · {label}"), Icon::Video, id)); + } + items.push(entry( + "JustVideo · more options…", + Icon::Options, + "video.options", + )); + items.push(separator()); + } + // A selection made only of videos is having its soundtrack pulled out; + // anything else is a plain format conversion. + let verb = if selection.video == selection.files { + "extract" + } else { + "convert to" + }; + for (tool, format, id) in [ + (Tool::Mp3, "MP3", "mp3"), + (Tool::Audio, "M4A", "audio"), + (Tool::Wav, "WAV", "wav"), + ] { + if selection.has(tool) { + items.push(entry( + format!("{} · {verb} {format}", tool.name()), + Icon::Audio, + id, + )); + } + } + items.push(separator()); + + if selection.has(Tool::Optimize) { + items.push(entry( + "JustOptimize · smallest web format", + Icon::Optimize, + "optimize", + )); + } + if selection.has(Tool::Resize) { + for (label, id) in [ + ("fit 1024 px", "resize.1024"), + ("fit 1920 px (default)", "resize.1920"), + ("fit 2560 px", "resize.2560"), + ("fit 3840 px", "resize.3840"), + ] { + items.push(entry(format!("JustResize · {label}"), Icon::Resize, id)); + } + items.push(entry( + "JustResize · more options…", + Icon::Options, + "resize.options", + )); + } + items.push(separator()); + if selection.has(Tool::Webp) { + items.push(entry("JustWebP · convert to WebP", Icon::Convert, "webp")); + } + if selection.has(Tool::Avif) { + items.push(entry("JustAVIF · convert to AVIF", Icon::Convert, "avif")); + } + if selection.has(Tool::Jpg) { + items.push(entry("JustJPG · convert to JPEG", Icon::Convert, "jpg")); + } + if selection.has(Tool::Png) { + items.push(entry("JustPNG · compress in place", Icon::Convert, "png")); + } + items.push(separator()); + if selection.has(Tool::Crop) { + items.push(entry( + "JustCrop · trim transparent edges", + Icon::Crop, + "crop", + )); + } + if selection.has(Tool::Rmbg) { + items.push(entry("JustRMBG · remove background", Icon::Cutout, "rmbg")); + } + items.push(separator()); + + let pdfs = selection.count(Tool::Pdf); + if pdfs > 0 { + if pdfs > 1 { + items.push(entry( + format!("JustPDF · merge {pdfs} PDFs"), + Icon::Pdf, + "pdf.merge", + )); + } + for (label, id) in [ + ("split into pages", "pdf.split"), + ("save embedded images", "pdf.images"), + ("save links", "pdf.links"), + ("show page count and details", "pdf.info"), + ] { + items.push(entry(format!("JustPDF · {label}"), Icon::Pdf, id)); + } + items.push(entry( + "JustPDF · more options…", + Icon::Options, + "pdf.options", + )); + items.push(separator()); + } + if selection.has(Tool::Svg) { + items.push(entry("JustSVG · optimize in place", Icon::Svg, "svg")); + } + if selection.has(Tool::Json) { + for (label, id) in [ + ("format in place", "json.format"), + ("minify in place", "json.minify"), + ("validate", "json.check"), + ] { + items.push(entry(format!("JustJSON · {label}"), Icon::Json, id)); + } + } + if selection.has(Tool::Links) { + items.push(entry( + "JustLinks · links to links.txt", + Icon::Links, + "links.txt", + )); + items.push(entry( + "JustLinks · links.csv with titles", + Icon::Links, + "links.csv", + )); + } +} + +fn folder_items(selection: &Selection, items: &mut Vec<Item>) { + if selection.folders == 1 { + items.push(entry( + "JustPaste · download the copied link here", + Icon::Paste, + "paste", + )); + items.push(separator()); + // Each opens the tool's launcher in the folder, where a blank input + // already means "this folder". + for (tool, icon, id) in [ + (Tool::Optimize, Icon::Optimize, "folder.optimize"), + (Tool::Resize, Icon::Resize, "folder.resize"), + (Tool::Webp, Icon::Convert, "folder.webp"), + (Tool::Video, Icon::Video, "folder.video"), + (Tool::Mp3, Icon::Audio, "folder.mp3"), + (Tool::Links, Icon::Links, "folder.links"), + ] { + items.push(entry(format!("{} in this folder…", tool.name()), icon, id)); + } + items.push(separator()); + } + if selection.git { + items.push(entry("JustZip · archive Git repository", Icon::Zip, "zip")); + } +} + +/// How a chosen entry starts its tool. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum Run { + /// Run headless straight away with the preset arguments. + Headless, + /// Open the tool's console launcher with the selection filled in. + Launcher, + /// Open the tool's console launcher inside the selected folder. + LauncherHere, + /// Open the `just` tool browser inside the folder. + Browse, +} + +/// Where a headless run writes its results. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum Output { + /// The tool's own beside-source default. + Default, + /// Pass `--output <source folder>`, which is how the tools that would + /// otherwise consume their source are told to keep it. + SourceFolder, +} + +/// What one menu entry does. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub struct Action { + pub id: &'static str, + /// `None` only for [`Run::Browse`]. + pub tool: Option<Tool>, + /// Arguments placed before the selected paths. + pub args: &'static [&'static str], + pub run: Run, + pub output: Output, + /// The tool takes exactly one input, so run it once per file. + pub per_file: bool, + /// The fewest accepted files the entry needs. + pub minimum: u32, + /// The result is something to read, so the window stays open. + pub hold: bool, +} + +const fn headless(id: &'static str, tool: Tool, args: &'static [&'static str]) -> Action { + Action { + id, + tool: Some(tool), + args, + run: Run::Headless, + output: Output::Default, + per_file: false, + minimum: 1, + hold: false, + } +} + +const fn launcher(id: &'static str, tool: Tool) -> Action { + Action { + run: Run::Launcher, + ..headless(id, tool, &[]) + } +} + +const fn launcher_here(id: &'static str, tool: Tool) -> Action { + Action { + run: Run::LauncherHere, + ..headless(id, tool, &[]) + } +} + +const ACTIONS: &[Action] = &[ + headless("video.480", Tool::Video, &["--resolution", "480p"]), + headless("video.720", Tool::Video, &["--resolution", "720p"]), + headless("video.1080", Tool::Video, &["--resolution", "1080p"]), + headless("video.1440", Tool::Video, &["--resolution", "1440p"]), + headless("video.2160", Tool::Video, &["--resolution", "4k"]), + headless("video.source", Tool::Video, &["--resolution", "source"]), + launcher("video.options", Tool::Video), + headless("mp3", Tool::Mp3, &[]), + headless("audio", Tool::Audio, &[]), + headless("wav", Tool::Wav, &[]), + headless("optimize", Tool::Optimize, &[]), + headless("resize.1024", Tool::Resize, &["--max", "1024"]), + headless("resize.1920", Tool::Resize, &["--max", "1920"]), + headless("resize.2560", Tool::Resize, &["--max", "2560"]), + headless("resize.3840", Tool::Resize, &["--max", "3840"]), + launcher("resize.options", Tool::Resize), + Action { + output: Output::SourceFolder, + ..headless("webp", Tool::Webp, &[]) + }, + Action { + output: Output::SourceFolder, + ..headless("avif", Tool::Avif, &[]) + }, + headless("jpg", Tool::Jpg, &[]), + headless("png", Tool::Png, &[]), + headless("crop", Tool::Crop, &[]), + headless("rmbg", Tool::Rmbg, &[]), + Action { + minimum: 2, + ..headless("pdf.merge", Tool::Pdf, &["merge"]) + }, + Action { + per_file: true, + ..headless("pdf.split", Tool::Pdf, &["split"]) + }, + Action { + per_file: true, + ..headless("pdf.images", Tool::Pdf, &["images"]) + }, + Action { + per_file: true, + ..headless("pdf.links", Tool::Pdf, &["links"]) + }, + Action { + hold: true, + ..headless("pdf.info", Tool::Pdf, &["info"]) + }, + launcher("pdf.options", Tool::Pdf), + headless("svg", Tool::Svg, &[]), + headless("json.format", Tool::Json, &[]), + headless("json.minify", Tool::Json, &["--minify"]), + Action { + hold: true, + ..headless("json.check", Tool::Json, &["--check"]) + }, + headless("links.txt", Tool::Links, &[]), + headless("links.csv", Tool::Links, &["--csv"]), + headless("zip", Tool::Zip, &[]), + headless("paste", Tool::Paste, &["--clipboard"]), + launcher_here("folder.optimize", Tool::Optimize), + launcher_here("folder.resize", Tool::Resize), + launcher_here("folder.webp", Tool::Webp), + launcher_here("folder.video", Tool::Video), + launcher_here("folder.mp3", Tool::Mp3), + launcher_here("folder.links", Tool::Links), + Action { + id: "browse", + tool: None, + args: &[], + run: Run::Browse, + output: Output::Default, + per_file: false, + minimum: 0, + hold: false, + }, +]; + +/// The action behind a menu entry's ID. +pub fn action(id: &str) -> Option<Action> { + ACTIONS.iter().copied().find(|action| action.id == id) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn selection(files: &[&str]) -> Selection { + let mut selection = Selection::default(); + for file in files { + selection.add_file(file); + } + selection + } + + fn titles(items: &[Item]) -> Vec<&str> { + items.iter().map(|item| item.title.as_str()).collect() + } + + fn ids(items: &[Item]) -> Vec<&'static str> { + items + .iter() + .filter_map(|item| match item.kind { + Kind::Action(id) => Some(id), + Kind::Separator => None, + }) + .collect() + } + + #[test] + fn videos_offer_every_resolution_and_audio_extraction_in_one_level() { + let items = menu(&selection(&[r"C:\clips\holiday.MOV"])); + assert_eq!( + titles(&items), + [ + "JustVideo · 480p", + "JustVideo · 720p (default)", + "JustVideo · 1080p", + "JustVideo · 1440p", + "JustVideo · 4K", + "JustVideo · source resolution", + "JustVideo · more options…", + "", + "JustMP3 · extract MP3", + "JustAudio · extract M4A", + "JustWAV · extract WAV", + "", + "Open JustTools here", + ] + ); + assert_eq!( + action("video.2160").unwrap().args, + ["--resolution", "4k"].as_slice() + ); + assert_eq!( + action("video.1080").unwrap().args, + ["--resolution", "1080p"].as_slice() + ); + } + + #[test] + fn converters_never_offer_their_own_format() { + let items = menu(&selection(&["song.mp3"])); + assert_eq!( + titles(&items), + [ + "JustAudio · convert to M4A", + "JustWAV · convert to WAV", + "", + "Open JustTools here", + ] + ); + assert!(!titles(&menu(&selection(&["a.webp"]))).contains(&"JustWebP · convert to WebP")); + } + + #[test] + fn images_group_without_stray_separators() { + let items = menu(&selection(&["photo.jpg"])); + assert_eq!( + titles(&items), + [ + "JustOptimize · smallest web format", + "JustResize · fit 1024 px", + "JustResize · fit 1920 px (default)", + "JustResize · fit 2560 px", + "JustResize · fit 3840 px", + "JustResize · more options…", + "", + "JustWebP · convert to WebP", + "JustAVIF · convert to AVIF", + "JustJPG · convert to JPEG", + "", + "JustRMBG · remove background", + "", + "Open JustTools here", + ] + ); + let png = menu(&selection(&["logo.png"])); + assert!(titles(&png).contains(&"JustPNG · compress in place")); + assert!(titles(&png).contains(&"JustCrop · trim transparent edges")); + } + + #[test] + fn merge_needs_two_pdfs_and_single_input_operations_run_per_file() { + let one = menu(&selection(&["a.pdf"])); + assert_eq!(one[0].title, "JustPDF · split into pages"); + let two = menu(&selection(&["a.pdf", "b.pdf"])); + assert_eq!(two[0].title, "JustPDF · merge 2 PDFs"); + assert_eq!(action("pdf.merge").unwrap().minimum, 2); + assert!(action("pdf.split").unwrap().per_file); + assert!(action("pdf.info").unwrap().hold); + } + + #[test] + fn source_consuming_converters_are_told_to_keep_their_source() { + for id in ["webp", "avif"] { + assert_eq!(action(id).unwrap().output, Output::SourceFolder); + } + assert_eq!(action("jpg").unwrap().output, Output::Default); + } + + #[test] + fn folders_open_launchers_and_only_git_trees_offer_zip() { + let mut plain = Selection::default(); + plain.add_folder(false); + assert!(!titles(&menu(&plain)).contains(&"JustZip · archive Git repository")); + assert_eq!( + menu(&plain)[0].title, + "JustPaste · download the copied link here" + ); + assert_eq!(action("paste").unwrap().args, ["--clipboard"].as_slice()); + assert_eq!(menu(&plain)[2].title, "JustOptimize in this folder…"); + assert_eq!(action("folder.video").unwrap().run, Run::LauncherHere); + + let mut repository = Selection::default(); + repository.add_folder(true); + assert!(titles(&menu(&repository)).contains(&"JustZip · archive Git repository")); + + let mut several = Selection::default(); + several.add_folder(true); + several.add_folder(true); + assert!(menu(&several).is_empty()); + } + + #[test] + fn unsupported_selections_hide_the_menu() { + assert!(menu(&selection(&["notes.xyz", "Makefile"])).is_empty()); + assert!(menu(&Selection::default()).is_empty()); + assert_eq!(extension(r"C:\a.b\file"), None); + assert_eq!(extension(".gitignore"), None); + assert_eq!(extension("Clip.MP4").as_deref(), Some("mp4")); + } + + #[test] + fn every_entry_resolves_and_every_action_is_reachable() { + let mut reachable = std::collections::HashSet::new(); + for extension in extensions() { + let one = format!("file.{extension}"); + let two = format!("other.{extension}"); + let items = menu(&selection(&[&one, &two])); + assert!(!items.is_empty(), ".{extension} is registered for nothing"); + for id in ids(&items) { + let action = action(id).unwrap_or_else(|| panic!("no action {id}")); + assert_eq!(action.id, id); + reachable.insert(id); + } + } + let mut repository = Selection::default(); + repository.add_folder(true); + reachable.extend(ids(&menu(&repository))); + + assert!(!extensions().contains(&"ts")); + let mut seen = std::collections::HashSet::new(); + for action in ACTIONS { + assert!(seen.insert(action.id), "duplicate action {}", action.id); + assert!( + reachable.contains(action.id), + "no menu entry runs {}", + action.id + ); + } + for icon in Icon::ALL { + assert!(!icon.file_stem().is_empty()); + } + assert_eq!(format!("{CLASS_ID_VALUE:032X}"), CLASS_ID.replace('-', "")); + } +} diff --git a/explorer/shell/Cargo.toml b/explorer/shell/Cargo.toml new file mode 100644 index 0000000..30314b1 --- /dev/null +++ b/explorer/shell/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "justtools-shell" +version = "2.6.0" +edition = "2024" +rust-version = "1.90" +license = "MIT" +description = "Windows File Explorer context-menu extension for JustTools" +build = "build.rs" + +[lib] +name = "justtools_shell" +crate-type = ["cdylib"] +# The library is empty off Windows and has no tests of its own; the menu it +# shows is tested in justtools-menu. +test = false +doctest = false + +[target.'cfg(windows)'.dependencies] +justtools-menu = { path = "../menu" } +windows = { version = "0.61", features = [ + "Win32_Foundation", + "Win32_Graphics_Gdi", + "Win32_Security", + "Win32_Storage_FileSystem", + "Win32_System_Com", + "Win32_System_Com_StructuredStorage", + "Win32_System_LibraryLoader", + "Win32_System_Memory", + "Win32_System_Ole", + "Win32_System_SystemServices", + "Win32_System_Threading", + "Win32_UI_Shell", + "Win32_UI_Shell_Common", + "Win32_UI_WindowsAndMessaging", +] } +# The `implement` macro names this crate directly. +windows-core = "0.61" + +[target.'cfg(windows)'.build-dependencies] +embed-resource = "3" +justtools-menu = { path = "../menu" } diff --git a/explorer/shell/build.rs b/explorer/shell/build.rs new file mode 100644 index 0000000..65e96ef --- /dev/null +++ b/explorer/shell/build.rs @@ -0,0 +1,75 @@ +//! Compile the menu icons and version details into the extension. +//! +//! The resource script is generated so icon IDs come from `justtools_menu::Icon` +//! and the version from this crate, leaving nothing to keep in step by hand. + +fn main() { + println!("cargo:rerun-if-changed=../icons"); + #[cfg(windows)] + if std::env::var_os("CARGO_CFG_WINDOWS").is_some() { + resources(); + // rustc exports the COM entry points by name; MSVC's reminder that + // they are conventionally PRIVATE does not apply to a library that + // nothing links against. + if std::env::var("CARGO_CFG_TARGET_ENV").as_deref() == Ok("msvc") { + println!("cargo:rustc-link-arg-cdylib=/IGNORE:4104"); + } + } +} + +#[cfg(windows)] +fn resources() { + use std::fmt::Write; + use std::path::PathBuf; + + let icons = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../icons"); + let mut script = String::new(); + for icon in justtools_menu::Icon::ALL { + let path = icons.join(format!("{}.ico", icon.file_stem())); + let path = path.to_string_lossy().replace('\\', "/"); + writeln!(script, "{} ICON \"{path}\"", icon.resource_id()).unwrap(); + } + let version = env!("CARGO_PKG_VERSION"); + let numbers = format!( + "{},{},{},0", + env!("CARGO_PKG_VERSION_MAJOR"), + env!("CARGO_PKG_VERSION_MINOR"), + env!("CARGO_PKG_VERSION_PATCH") + ); + write!( + script, + r#" +1 VERSIONINFO +FILEVERSION {numbers} +PRODUCTVERSION {numbers} +FILEOS 0x40004L +FILETYPE 0x2L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904B0" + BEGIN + VALUE "CompanyName", "JustGains" + VALUE "FileDescription", "JustTools File Explorer context menu" + VALUE "FileVersion", "{version}" + VALUE "InternalName", "justtools_shell" + VALUE "LegalCopyright", "MIT License" + VALUE "OriginalFilename", "justtools_shell.dll" + VALUE "ProductName", "JustTools" + VALUE "ProductVersion", "{version}" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END +"# + ) + .unwrap(); + let output = PathBuf::from(std::env::var_os("OUT_DIR").unwrap()).join("resources.rc"); + std::fs::write(&output, script).unwrap(); + embed_resource::compile(&output, embed_resource::NONE) + .manifest_required() + .expect("the context-menu icons must compile into the extension"); +} diff --git a/explorer/shell/src/lib.rs b/explorer/shell/src/lib.rs new file mode 100644 index 0000000..17ae6a1 --- /dev/null +++ b/explorer/shell/src/lib.rs @@ -0,0 +1,549 @@ +//! The JustTools entry in the Windows File Explorer context menu. +//! +//! Explorer loads this library, asks it what to show for the selection, and on +//! a click it starts `just.exe context run <action>` in a new console window. +//! Everything about *what* the menu contains lives in `justtools-menu`; this +//! file only translates that model to `IExplorerCommand`. +//! +//! The library runs inside Explorer (or its COM surrogate), and the workspace +//! builds with `panic = "abort"`, so nothing here may panic: no unwrapping, no +//! indexing, and no `RefCell` borrow held across a call back into COM. + +#![cfg(windows)] +#![allow(non_snake_case)] + +use std::cell::{Cell, RefCell}; +use std::ffi::c_void; +use std::path::{Path, PathBuf}; +use std::rc::Rc; +use std::sync::atomic::{AtomicUsize, Ordering}; + +use justtools_menu::{self as menu, Icon, Item, Kind, Selection, Tool}; +use windows::Win32::Foundation::{ + CLASS_E_CLASSNOTAVAILABLE, CLASS_E_NOAGGREGATION, CloseHandle, E_FAIL, E_NOTIMPL, E_POINTER, + HINSTANCE, HMODULE, MAX_PATH, S_FALSE, S_OK, +}; +use windows::Win32::Storage::FileSystem::{ + FILE_ATTRIBUTE_DIRECTORY, GetFileAttributesW, INVALID_FILE_ATTRIBUTES, +}; +use windows::Win32::System::Com::{ + CoTaskMemFree, DVASPECT_CONTENT, FORMATETC, IBindCtx, IClassFactory, IClassFactory_Impl, + IDataObject, IServiceProvider, TYMED_HGLOBAL, +}; +use windows::Win32::System::LibraryLoader::GetModuleFileNameW; +use windows::Win32::System::Ole::{ + CF_HDROP, IObjectWithSite, IObjectWithSite_Impl, ReleaseStgMedium, +}; +use windows::Win32::System::SystemServices::DLL_PROCESS_ATTACH; +use windows::Win32::System::Threading::{ + CREATE_NEW_CONSOLE, CREATE_UNICODE_ENVIRONMENT, CreateProcessW, GetCurrentProcessId, + PROCESS_INFORMATION, STARTUPINFOW, +}; +use windows::Win32::UI::Shell::{ + BHID_DataObject, DragQueryFileW, ECF_DEFAULT, ECF_HASSUBCOMMANDS, ECF_ISSEPARATOR, ECS_ENABLED, + ECS_HIDDEN, HDROP, IEnumExplorerCommand, IEnumExplorerCommand_Impl, IExplorerCommand, + IExplorerCommand_Impl, IFolderView, IShellItem, IShellItemArray, SHStrDupW, SIGDN_FILESYSPATH, +}; +use windows::Win32::UI::WindowsAndMessaging::{MB_ICONWARNING, MB_OK, MessageBoxW}; +use windows::core::{ + BOOL, GUID, HRESULT, HSTRING, IUnknown, Interface, PCWSTR, PWSTR, Ref, Result, implement, w, +}; + +const CLASS_ID: GUID = GUID::from_u128(menu::CLASS_ID_VALUE); +/// `SID_SFolderView`, the service that yields the folder a view is showing. +const FOLDER_VIEW_SERVICE: GUID = GUID::from_u128(0xcde725b0_ccc9_4519_917e_325d72fab4ce); +/// A stat call per item is fine for a handful of unknown names and far too +/// slow for a selection of thousands, so only the first few are probed. +const FOLDER_PROBES: usize = 16; + +static MODULE: AtomicUsize = AtomicUsize::new(0); +static OBJECTS: AtomicUsize = AtomicUsize::new(0); +static LAUNCHES: AtomicUsize = AtomicUsize::new(0); + +fn wide(text: &str) -> Vec<u16> { + text.encode_utf16().chain([0]).collect() +} + +fn module_path() -> Option<PathBuf> { + let module = HMODULE(MODULE.load(Ordering::Relaxed) as *mut c_void); + let mut buffer = vec![0_u16; MAX_PATH as usize]; + loop { + let length = unsafe { GetModuleFileNameW(Some(module), &mut buffer) } as usize; + if length == 0 { + return None; + } + if length < buffer.len() { + return Some(PathBuf::from(String::from_utf16_lossy( + buffer.get(..length)?, + ))); + } + if buffer.len() > 1 << 16 { + return None; + } + buffer.resize(buffer.len() * 2, 0); + } +} + +fn is_directory(path: &str) -> bool { + let attributes = unsafe { GetFileAttributesW(&HSTRING::from(path)) }; + attributes != INVALID_FILE_ATTRIBUTES && attributes & FILE_ATTRIBUTE_DIRECTORY.0 != 0 +} + +fn exists(path: &str) -> bool { + unsafe { GetFileAttributesW(&HSTRING::from(path)) != INVALID_FILE_ATTRIBUTES } +} + +/// Reduce the selected paths to what the menu depends on. +fn summarize(paths: &[String]) -> Selection { + let mut selection = Selection::default(); + let mut probes = 0; + for path in paths { + let recognized = menu::extension(path) + .is_some_and(|extension| Tool::ALL.iter().any(|tool| tool.accepts(&extension))); + if !recognized && probes < FOLDER_PROBES { + probes += 1; + if is_directory(path) { + selection.add_folder(exists(&format!("{path}\\.git"))); + continue; + } + } + selection.add_file(path); + } + selection +} + +/// Every selected path in one cross-process call, when Explorer can provide a +/// drop list for the selection. +unsafe fn drop_list_paths(items: &IShellItemArray) -> Vec<String> { + let mut paths = Vec::new(); + let Ok(data) = (unsafe { items.BindToHandler::<_, IDataObject>(None, &BHID_DataObject) }) + else { + return paths; + }; + let format = FORMATETC { + cfFormat: CF_HDROP.0, + ptd: std::ptr::null_mut(), + dwAspect: DVASPECT_CONTENT.0, + lindex: -1, + tymed: TYMED_HGLOBAL.0 as u32, + }; + let Ok(mut medium) = (unsafe { data.GetData(&format) }) else { + return paths; + }; + let drop = HDROP(unsafe { medium.u.hGlobal }.0); + let count = unsafe { DragQueryFileW(drop, u32::MAX, None) }; + for index in 0..count { + let length = unsafe { DragQueryFileW(drop, index, None) } as usize; + let mut buffer = vec![0_u16; length + 1]; + let written = unsafe { DragQueryFileW(drop, index, Some(&mut buffer)) } as usize; + if let Some(text) = buffer.get(..written) + && written > 0 + { + paths.push(String::from_utf16_lossy(text)); + } + } + unsafe { ReleaseStgMedium(&mut medium) }; + paths +} + +unsafe fn item_path(item: &IShellItem) -> Option<String> { + let name = unsafe { item.GetDisplayName(SIGDN_FILESYSPATH) }.ok()?; + let path = unsafe { name.to_string() }.ok(); + unsafe { CoTaskMemFree(Some(name.0 as *const c_void)) }; + path.filter(|path| !path.is_empty()) +} + +unsafe fn selected_paths(items: &IShellItemArray) -> Vec<String> { + let paths = unsafe { drop_list_paths(items) }; + if !paths.is_empty() { + return paths; + } + let count = unsafe { items.GetCount() }.unwrap_or(0); + (0..count) + .filter_map(|index| unsafe { items.GetItemAt(index) }.ok()) + .filter_map(|item| unsafe { item_path(&item) }) + .collect() +} + +/// The folder whose empty background was right-clicked. +unsafe fn site_folder(site: &IUnknown) -> Option<String> { + let provider: IServiceProvider = site.cast().ok()?; + let view: IFolderView = unsafe { provider.QueryService(&FOLDER_VIEW_SERVICE) }.ok()?; + let folder: IShellItem = unsafe { view.GetFolder() }.ok()?; + unsafe { item_path(&folder) } +} + +/// State shared by the root command and the entries it hands out. +#[derive(Default)] +struct Shared { + /// The menu resolved for the current selection. + items: RefCell<Vec<Item>>, + paths: RefCell<Vec<String>>, + site: RefCell<Option<IUnknown>>, +} + +impl Shared { + fn selection(&self, items: Option<&IShellItemArray>) -> Vec<String> { + let mut paths = items + .map(|items| unsafe { selected_paths(items) }) + .unwrap_or_default(); + if paths.is_empty() { + let site = self.site.try_borrow().ok().and_then(|site| site.clone()); + if let Some(folder) = site.and_then(|site| unsafe { site_folder(&site) }) { + paths.push(folder); + } + } + paths + } + + /// Resolve and remember the menu for a fresh selection. + fn refresh(&self, items: Option<&IShellItemArray>) -> bool { + let paths = self.selection(items); + let resolved = menu::menu(&summarize(&paths)); + let visible = !resolved.is_empty(); + if let Ok(mut slot) = self.items.try_borrow_mut() { + *slot = resolved; + } + if let Ok(mut slot) = self.paths.try_borrow_mut() { + *slot = paths; + } + visible + } +} + +/// One menu entry. `item` is `None` for the top-level JustTools entry. +#[implement(IExplorerCommand, IObjectWithSite)] +struct Command { + item: Option<Item>, + shared: Rc<Shared>, +} + +impl Command { + fn create(item: Option<Item>, shared: Rc<Shared>) -> IExplorerCommand { + OBJECTS.fetch_add(1, Ordering::Relaxed); + Command { item, shared }.into() + } + + /// Only the top-level entry has a flyout; its rows are the resolved menu. + fn children(&self) -> Vec<Item> { + if self.item.is_some() { + return Vec::new(); + } + self.shared + .items + .try_borrow() + .map(|items| items.clone()) + .unwrap_or_default() + } +} + +impl Drop for Command { + fn drop(&mut self) { + OBJECTS.fetch_sub(1, Ordering::Relaxed); + } +} + +impl IExplorerCommand_Impl for Command_Impl { + fn GetTitle(&self, _items: Ref<'_, IShellItemArray>) -> Result<PWSTR> { + let title = self + .item + .as_ref() + .map_or(menu::ROOT_TITLE, |item| item.title.as_str()); + unsafe { SHStrDupW(&HSTRING::from(title)) } + } + + fn GetIcon(&self, _items: Ref<'_, IShellItemArray>) -> Result<PWSTR> { + let icon = self.item.as_ref().map_or(Icon::Brand, |item| item.icon); + if icon == Icon::None { + return Err(E_NOTIMPL.into()); + } + let library = module_path().ok_or(E_FAIL)?; + let location = format!("{},-{}", library.display(), icon.resource_id()); + unsafe { SHStrDupW(&HSTRING::from(location)) } + } + + fn GetToolTip(&self, _items: Ref<'_, IShellItemArray>) -> Result<PWSTR> { + Err(E_NOTIMPL.into()) + } + + fn GetCanonicalName(&self) -> Result<GUID> { + Ok(if self.item.is_none() { + CLASS_ID + } else { + GUID::zeroed() + }) + } + + fn GetState(&self, items: Ref<'_, IShellItemArray>, _slow: BOOL) -> Result<u32> { + if self.item.is_some() || self.shared.refresh(items.as_ref()) { + Ok(ECS_ENABLED.0 as u32) + } else { + Ok(ECS_HIDDEN.0 as u32) + } + } + + fn Invoke(&self, items: Ref<'_, IShellItemArray>, _context: Ref<'_, IBindCtx>) -> Result<()> { + let Some(Item { + kind: Kind::Action(id), + .. + }) = &self.item + else { + return Ok(()); + }; + let mut paths = self.shared.selection(items.as_ref()); + if paths.is_empty() { + paths = self + .shared + .paths + .try_borrow() + .map(|paths| paths.clone()) + .unwrap_or_default(); + } + if let Err(message) = launch(id, &paths) { + unsafe { + MessageBoxW( + None, + &HSTRING::from(message), + w!("JustTools"), + MB_OK | MB_ICONWARNING, + ); + } + } + Ok(()) + } + + fn GetFlags(&self) -> Result<u32> { + let flags = match self.item.as_ref().map(|item| &item.kind) { + None => ECF_HASSUBCOMMANDS, + Some(Kind::Separator) => ECF_ISSEPARATOR, + Some(Kind::Action(_)) => ECF_DEFAULT, + }; + Ok(flags.0 as u32) + } + + fn EnumSubCommands(&self) -> Result<IEnumExplorerCommand> { + Ok(Commands::create(self.children(), 0, self.shared.clone())) + } +} + +impl IObjectWithSite_Impl for Command_Impl { + fn SetSite(&self, site: Ref<'_, IUnknown>) -> Result<()> { + if let Ok(mut slot) = self.shared.site.try_borrow_mut() { + *slot = site.as_ref().cloned(); + } + Ok(()) + } + + fn GetSite(&self, interface: *const GUID, result: *mut *mut c_void) -> Result<()> { + if result.is_null() { + return Err(E_POINTER.into()); + } + unsafe { *result = std::ptr::null_mut() }; + let site = self + .shared + .site + .try_borrow() + .ok() + .and_then(|site| site.clone()) + .ok_or(E_FAIL)?; + unsafe { site.query(interface, result).ok() } + } +} + +#[implement(IEnumExplorerCommand)] +struct Commands { + items: Vec<Item>, + next: Cell<usize>, + shared: Rc<Shared>, +} + +impl Commands { + fn create(items: Vec<Item>, next: usize, shared: Rc<Shared>) -> IEnumExplorerCommand { + OBJECTS.fetch_add(1, Ordering::Relaxed); + Commands { + items, + next: Cell::new(next), + shared, + } + .into() + } +} + +impl Drop for Commands { + fn drop(&mut self) { + OBJECTS.fetch_sub(1, Ordering::Relaxed); + } +} + +impl IEnumExplorerCommand_Impl for Commands_Impl { + fn Next( + &self, + count: u32, + commands: *mut Option<IExplorerCommand>, + fetched: *mut u32, + ) -> HRESULT { + if commands.is_null() { + return E_POINTER; + } + let mut written = 0_u32; + while written < count { + let Some(item) = self.items.get(self.next.get()) else { + break; + }; + let command = Command::create(Some(item.clone()), self.shared.clone()); + // The caller's buffer is uninitialized, so it must not be dropped. + unsafe { commands.add(written as usize).write(Some(command)) }; + self.next.set(self.next.get() + 1); + written += 1; + } + if !fetched.is_null() { + unsafe { *fetched = written }; + } + if written == count { S_OK } else { S_FALSE } + } + + fn Skip(&self, count: u32) -> Result<()> { + let next = self.next.get().saturating_add(count as usize); + self.next.set(next.min(self.items.len())); + Ok(()) + } + + fn Reset(&self) -> Result<()> { + self.next.set(0); + Ok(()) + } + + fn Clone(&self) -> Result<IEnumExplorerCommand> { + Ok(Commands::create( + self.items.clone(), + self.next.get(), + self.shared.clone(), + )) + } +} + +/// Start `just.exe context run <id>` in its own console window. +/// +/// The selection travels in a temporary list file: a command line holds +/// about 32,000 characters and a selection can hold far more than that. +fn launch(id: &str, paths: &[String]) -> std::result::Result<(), String> { + let library = module_path().ok_or("JustTools could not locate its own files.")?; + let executable = library.parent().unwrap_or(Path::new(".")).join("just.exe"); + if !executable.is_file() { + return Err(format!( + "JustTools is not installed beside its context menu.\n\nMissing: {}\n\nRun “just install” and then “just context install”.", + executable.display() + )); + } + let list = std::env::temp_dir().join(format!( + "justtools-menu-{}-{}.txt", + unsafe { GetCurrentProcessId() }, + LAUNCHES.fetch_add(1, Ordering::Relaxed) + )); + std::fs::write(&list, paths.join("\n")) + .map_err(|error| format!("JustTools could not pass on the selection: {error}"))?; + let mut command = wide(&format!( + "\"{}\" context run {id} --list \"{}\"", + executable.display(), + list.display() + )); + let startup = STARTUPINFOW { + cb: size_of::<STARTUPINFOW>() as u32, + ..Default::default() + }; + let mut process = PROCESS_INFORMATION::default(); + let started = unsafe { + CreateProcessW( + &HSTRING::from(executable.as_os_str()), + Some(PWSTR(command.as_mut_ptr())), + None, + None, + false, + CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT, + None, + PCWSTR::null(), + &startup, + &mut process, + ) + }; + match started { + Ok(()) => { + unsafe { + CloseHandle(process.hThread).ok(); + CloseHandle(process.hProcess).ok(); + } + Ok(()) + } + Err(error) => { + std::fs::remove_file(&list).ok(); + Err(format!("JustTools could not start: {}", error.message())) + } + } +} + +#[implement(IClassFactory)] +struct Factory; + +impl IClassFactory_Impl for Factory_Impl { + fn CreateInstance( + &self, + outer: Ref<'_, IUnknown>, + interface: *const GUID, + result: *mut *mut c_void, + ) -> Result<()> { + if result.is_null() { + return Err(E_POINTER.into()); + } + unsafe { *result = std::ptr::null_mut() }; + if outer.is_some() { + return Err(CLASS_E_NOAGGREGATION.into()); + } + let command = Command::create(None, Rc::new(Shared::default())); + unsafe { command.query(interface, result).ok() } + } + + fn LockServer(&self, lock: BOOL) -> Result<()> { + if lock.as_bool() { + OBJECTS.fetch_add(1, Ordering::Relaxed); + } else { + OBJECTS.fetch_sub(1, Ordering::Relaxed); + } + Ok(()) + } +} + +#[unsafe(no_mangle)] +extern "system" fn DllMain(instance: HINSTANCE, reason: u32, _reserved: *mut c_void) -> BOOL { + if reason == DLL_PROCESS_ATTACH { + MODULE.store(instance.0 as usize, Ordering::Relaxed); + } + true.into() +} + +/// # Safety +/// Called by COM with valid pointers for the class, interface, and result. +#[unsafe(no_mangle)] +pub unsafe extern "system" fn DllGetClassObject( + class: *const GUID, + interface: *const GUID, + result: *mut *mut c_void, +) -> HRESULT { + if result.is_null() { + return E_POINTER; + } + unsafe { *result = std::ptr::null_mut() }; + if class.is_null() || interface.is_null() || unsafe { *class } != CLASS_ID { + return CLASS_E_CLASSNOTAVAILABLE; + } + let factory: IClassFactory = Factory.into(); + unsafe { factory.query(interface, result) } +} + +#[unsafe(no_mangle)] +pub extern "system" fn DllCanUnloadNow() -> HRESULT { + if OBJECTS.load(Ordering::Relaxed) == 0 { + S_OK + } else { + S_FALSE + } +} diff --git a/skills/justtools/SKILL.md b/skills/justtools/SKILL.md index f16a077..5af67d5 100644 --- a/skills/justtools/SKILL.md +++ b/skills/justtools/SKILL.md @@ -1,7 +1,7 @@ --- name: justtools description: Use JustTools whenever a request names `just`, a `just*` command, JustReady, JustCommit, or bunt, or needs local software setup, AI-assisted Git commits, process cleanup, safe image or media conversion, JSON/PDF/SVG/QR work, link extraction from documents, port inspection, background removal, or Git-aware ZIP archives. Prefer the matching installed JustTools command over an ad-hoc script. -compatibility: Requires a local shell and JustTools on PATH. Individual commands may also require Git, OpenRouter, FFmpeg, image codecs, ONNX Runtime, or an RMBG model. +compatibility: Requires a local shell and JustTools on PATH. Individual commands may also require Git, OpenRouter, FFmpeg, yt-dlp, image codecs, ONNX Runtime, or an RMBG model. --- # JustTools @@ -47,9 +47,21 @@ Claude-only or Codex-only tool name when a normal shell operation is sufficient. ## Dependency consent -Some media commands need FFmpeg, pngquant, cwebp, or Git. RMBG may need ONNX -Runtime and its model. JustTools discovers these only when needed and asks for -interactive confirmation before installing or downloading them. JustRMBG's +Some media commands need FFmpeg, pngquant, cwebp, or Git, and `justpaste` and +an `http(s)` input to `justvideo`, `justaudio`, `justmp3`, or `justwav` also +need yt-dlp. RMBG may need ONNX Runtime and its model. JustTools discovers +these only when needed. + +**yt-dlp and FFmpeg download themselves.** When either is missing from `PATH`, +the first tool that needs it fetches the vendor's build into a per-user +JustTools folder, verifies its published SHA-256, and uses it from there. This +happens without a prompt, in interactive and non-interactive runs alike; it +changes nothing system-wide and never edits `PATH`. Set +`JUSTTOOLS_NO_DOWNLOAD=1` when the user does not want that, and tell the user +when a first run will download (FFmpeg is roughly 35 to 115 MB). + +Every other dependency still asks for interactive confirmation before it is +installed or downloaded. JustRMBG's launcher is explicit about the exception: its one-run **Install dependencies** row emits `--download`, so choosing Run grants that verified managed download without a second prompt. A headless run must pass `--download` explicitly. @@ -65,9 +77,9 @@ installer and may surface UAC or `sudo` prompts. `--download` only when the user has authorized its pinned runtime/model. - `--yes` approves the requested file operation; it does not approve third-party dependency installation. -- An agent's non-interactive process will intentionally refuse acquisition - unless the user explicitly authorized JustRMBG's `--download`. If another - dependency is missing, show the exact command/source JustTools reports and +- Apart from yt-dlp and FFmpeg, an agent's non-interactive process will + intentionally refuse acquisition unless the user explicitly authorized + JustRMBG's `--download`. If another dependency is missing, show the exact command/source JustTools reports and ask the user to run or approve it in an interactive terminal. - Explicit `*_BIN`, `RMBG_MODEL`, and `ORT_DYLIB_PATH` overrides are resolve-only; do not replace them without checking the user's environment. `ORT_DYLIB_PATH` @@ -88,6 +100,12 @@ installer and may surface UAC or `sudo` prompts. only when the user requested them; never substitute them for ordinary CLI invocations just to avoid an approval prompt. All additional arguments pass through, and neither shortcut stores a permission bypass in JustTools defaults. +- An `http(s)` input to `justvideo`, `justaudio`, `justmp3`, or `justwav` + reaches the network: it downloads the media with yt-dlp. Every run of those + tools and of `justpaste` also runs `yt-dlp --update` once twelve hours have + passed since the last update. Pass only a URL the user supplied, + and use `--dry-run` to show the plan without downloading. `--playlist` + downloads every entry of a playlist link, so add it only when asked. - Prefer `--output DIR` when the user wants copies. - Use `--replace` only with clear authorization; outputs are installed atomically. - Keep `justresize`'s no-upscale default unless enlargement is explicitly wanted. @@ -100,6 +118,11 @@ installer and may surface UAC or `sudo` prompts. - Do not kill a port owner without identifying it first. `justport --kill` intentionally limits termination to same-user processes and revalidates the process identity. +- `justip` contacts a third-party echo service and therefore discloses the + machine's public address to it. It is read-only and writes nothing, but do + not run it on a user's behalf when they have not asked where they appear + from. Both families are reported without a switch, so add `-4` or `-6` only + to narrow the result. - `justports` discovery is read-only until the user explicitly opens, starts, or stops a selection. Review remembered start recipes before launching them. `K` must remain confirmation-gated and revalidate PID, start time, same-user @@ -145,7 +168,8 @@ the shared file. tables, keep the source, and write `image-optimized.jpg`. - `justjpg assets --recursive --output assets-jpg --dry-run`: preview recursive JPEG copies in a separate directory while keeping every source file. -- `just video clip.mov`: streaming-ready 720p H.264 MP4. +- `just video clip.mov`: streaming-ready 720p H.264 MP4; `--resolution` takes + `480p`, `720p`, `1080p`, `1440p`, `4k`, or `source` and never upscales. - `just audio clip.mov`: AAC-LC M4A at 160 kb/s. - `just qr TEXT`: 1024 px error-Q PNG. - `bunt`: interactively inspect, protect, filter, and stop Node/Bun/Python @@ -166,6 +190,11 @@ the shared file. pinned managed runtime/model to install without a second prompt. - `justrmbg --check`: test runtime/provider session creation and tiny inference without resolving or downloading the BRIA model. +- `justpaste <url>` / `justpaste --clipboard`: download whatever a link points + at, unconverted; pages go through yt-dlp. Never overwrites. +- `justip`: report the public IPv4 and IPv6 address together; `--plain` and + `--json` keep stdout free of anything but the answer, and a family with no + public route is reported as unavailable rather than failing the run. - `just zip`: archive Git's exact tracked and unignored working-tree files. Read [references/commands.md](references/commands.md) for the full command map diff --git a/skills/justtools/references/commands.md b/skills/justtools/references/commands.md index 053597f..236d95c 100644 --- a/skills/justtools/references/commands.md +++ b/skills/justtools/references/commands.md @@ -14,23 +14,26 @@ | Optimize PNG | `justpng` | pngquant quality 65-90; same path only when smaller | | Convert to WebP | `justwebp` | Blank output removes source only after a smaller WebP is safe | | Convert to AVIF | `justavif` | Blank output removes source only after a smaller AVIF is safe | -| Optimize video | `justvideo` | 720p H.264 MP4, CRF 28, AAC 128 kb/s | -| Extract/convert audio | `justaudio` | AAC-LC M4A, 160 kb/s, 48 kHz | -| Create MP3 | `justmp3` | LAME VBR quality 2, 48 kHz | +| Optimize video | `justvideo` | 720p H.264 MP4, CRF 28, AAC 128 kb/s; `--resolution` 480p to 4k or source; `http(s)` URLs download with yt-dlp | +| Extract/convert audio | `justaudio` | AAC-LC M4A, 160 kb/s, 48 kHz; `http(s)` URLs download with yt-dlp | +| Create MP3 | `justmp3` | LAME VBR quality 2, 48 kHz; `http(s)` URLs download with yt-dlp | +| Download any link | `justpaste` | A file link is saved as-is; a page goes through yt-dlp at the highest resolution as MP4; never overwrites | | Choose the best web image | `justoptimize` | Measure PNG/WebP/JPEG; preserve alpha; keep source | -| Create WAV | `justwav` | Stereo 16-bit PCM, 48 kHz | +| Create WAV | `justwav` | Stereo 16-bit PCM, 48 kHz; `http(s)` URLs download with yt-dlp | | Work with JSON | `justjson` | Format, validate, query, or minify | | Work with PDF | `justpdf` | Inspect, merge, split, extract, rotate, save images, or list unique links | | Extract links | `justlinks` | Unique links from PDF, Office, and text files to `links.txt`; `--csv` adds title, file, location, and count | | Optimize SVG | `justsvg` | Conservative SVGOMG-style OXVG optimization | | Generate QR | `justqr` | 1024 px PNG, error correction Q, four-module margin | | Inspect ports | `justport` | Show listener/process ownership; guarded kill is optional | +| Show the public IP address | `justip` | Report the public IPv4 and IPv6 address together; `-4`/`-6` narrow it | | Browse development servers | `justports` | Live smart TUI, automatic saving, and one-key Launch Again recipes | | Remove backgrounds | `justrmbg` / `rmbg` | Local BRIA RMBG-2.0 inference to `<name>-nobg.png`; Auto visibly falls back to CPU | | Archive a repository | `justzip` | ZIP Git's tracked and unignored file set | | Create and enter a directory | `justmkcd` / `mkcd` | Create one directory; enter it through `just init` shell integration | | Claude permission-bypass shortcut | `claude_` | Shell function for `claude --dangerously-skip-permissions`, forwarding arguments | | Codex permission-bypass shortcut | `codex_` | Shell function for `codex --yolo`, forwarding arguments | +| Windows right-click menu | `just context install` | Per-user File Explorer menu; `status` and `uninstall` manage it | Every direct alias also works through short dispatch: `just resize`, `just pdf`, `just rmbg`, and so on. @@ -128,6 +131,28 @@ opaque tokens are not cached. Use `justport` instead when exact-port ownership from scripts is the goal; `K` provides confirmation-gated termination for the selected Running Now service. +## Public IP examples + +```sh +justip +justip -4 +justip -6 +justip --plain +justip --json +justip --timeout 15 +just ip +``` + +Both families are reported without a switch, so `-4` and `-6` are only needed +to narrow the result. The address is echoed back by a public lookup service, so +it is what the internet sees rather than a local interface address; each family +is pinned by hostname and an answer in the wrong family is discarded. A family +with no globally routable source address is reported as unavailable immediately +instead of waiting out the timeout, and one family answering still succeeds. +The run fails, with exit status 1 and nothing on stdout, only when no requested +family answers. `--plain` and `--json` keep stdout free of anything but the +answer. + ## Commit examples ```sh @@ -240,6 +265,76 @@ Use the command-specific help because not every option applies to every tool. The launchers keep the resolved output pattern and overwrite/source policy visible above the Headless command. +## Video resolution + +```sh +justvideo clip.mov # 720p +justvideo clip.mov --resolution 1080p +justvideo clip.mov --resolution 4k # 2160p +justvideo clip.mov --resolution source # keep the source size +``` + +`--resolution` accepts `480p`, `720p`, `1080p`, `1440p`, `4k`, or `source` and +bounds the frame without ever upscaling. The output name stays `<name>-web.mp4`. + +## Windows context menu + +```powershell +just context install +just context status +just context uninstall +``` + +Adds a per-user **JustTools** entry to File Explorer for supported files and +folders. Entries run built-in defaults in a console window that prints the +Headless command; `…` entries open the launcher with the selection filled in. +The top-level Windows 11 menu needs a signed `justtools-shell.msix` or Developer +Mode; `--classic` registers under "Show more options". `just context run` is +the entry point Explorer uses and is not meant to be typed. See +`docs/context-menu.md`. + +## Media download examples + +```sh +just video https://example.com/watch?v=ID +just audio https://example.com/watch?v=ID --output podcasts +just mp3 --playlist https://example.com/list=ID +just video --dry-run https://example.com/watch?v=ID +``` + +`justvideo`, `justaudio`, `justmp3`, and `justwav` accept an `http(s)` URL +wherever they accept a file. yt-dlp downloads it to a temporary folder (best +video plus audio at 1080p or lower, or at a larger `--resolution`, for video; best audio-only stream otherwise) +and the tool then encodes it with its usual settings into the current folder, or +`--output`, as `<title> [<id>].<ext>`. The download is never kept, so `--replace` +has nothing to remove. A playlist link downloads one entry unless `--playlist` +is passed, and `--dry-run` reports the plan without any network access. yt-dlp +runs with `--ignore-config`. Every run of these tools and of `justpaste` runs +`yt-dlp --update` once twelve hours have passed; an update failure is a +warning, never a failed run. A missing yt-dlp or FFmpeg is downloaded +automatically into a per-user folder and verified against the vendor's SHA-256 +(`JUSTTOOLS_NO_DOWNLOAD=1` disables this; `just deps fetch yt-dlp ffmpeg` +does it up front). See `docs/downloads.md`. + +## Paste a link + +```sh +justpaste https://example.com/photo.jpg +justpaste https://www.youtube.com/watch?v=ID +justpaste --clipboard +justpaste -o downloads --dry-run https://example.com/a.pdf +``` + +`justpaste` saves what a link points at into the current folder or `--output`. +A file answer is saved unconverted under the server's name; a page goes to +yt-dlp (YouTube, TikTok, and most other sites), and if that finds nothing the +page's declared `og:video`/`og:image` is saved. A taken name becomes +`name (2).ext`; nothing is overwritten and partial downloads leave nothing +behind. `--clipboard` takes every link in the copied text, `--playlist` opts +into multi-entry links, and `--dry-run` makes no request. Use `justvideo` or +`justmp3` with a URL instead when the result should be converted. See +`docs/paste.md`. + ## Structured and document examples ```sh diff --git a/src/commands/download.rs b/src/commands/download.rs new file mode 100644 index 0000000..a917673 --- /dev/null +++ b/src/commands/download.rs @@ -0,0 +1,352 @@ +//! Fetching media URLs with yt-dlp before the normal encode pipeline runs. +//! +//! A downloaded file is only ever an intermediate: it lands in a temporary +//! workspace, is converted with the calling tool's own settings, and is removed +//! with that workspace. yt-dlp refreshes itself at most once every twelve hours. + +use std::ffi::{OsStr, OsString}; +use std::fs; +use std::io::Write; +use std::path::{Path, PathBuf}; +use std::process::Command; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; + +use atomic_write_file::AtomicWriteFile; + +use crate::deps; +use crate::error::{ToolError, ToolResult}; + +const UPDATE_INTERVAL: Duration = Duration::from_secs(12 * 60 * 60); +const STAMP_NAME: &str = "yt-dlp-update"; +const OUTPUT_TEMPLATE: &str = "%(title)s [%(id)s].%(ext)s"; + +/// What the calling tool needs out of a URL. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum Kind { + /// `max_height` is the tallest stream worth fetching; `None` takes the best. + Video { + max_height: Option<u32>, + }, + Audio, + /// The best version of whatever the page offers, kept as downloaded. + Original, +} + +impl Kind { + fn format(self) -> String { + match self { + // The encode scales down to its own target, so a taller source + // than that only costs time. + Self::Video { + max_height: Some(height), + } => format!("bv*[height<={height}]+ba/b[height<={height}]/bv*+ba/b"), + Self::Video { max_height: None } => "bv*+ba/b".into(), + Self::Audio => "ba/b".into(), + Self::Original => "bv*+ba/b".into(), + } + } +} + +/// Whether an input names a downloadable address rather than a path. +pub fn is_url(value: &OsStr) -> bool { + value.to_str().is_some_and(|text| { + let lower = text.trim().to_ascii_lowercase(); + lower.starts_with("http://") || lower.starts_with("https://") + }) +} + +/// Resolve yt-dlp, honoring `YTDLP_BIN`. +pub fn executable(tool: &str) -> ToolResult<PathBuf> { + deps::require_override(tool, "YTDLP_BIN", "yt-dlp") +} + +fn stamp_path() -> Option<PathBuf> { + let defaults = crate::preferences::path().ok()?; + Some(defaults.parent()?.join(STAMP_NAME)) +} + +fn due(now: SystemTime, stamp: &Path) -> bool { + let Ok(text) = fs::read_to_string(stamp) else { + return true; + }; + let Ok(seconds) = text.trim().parse::<u64>() else { + return true; + }; + match now.duration_since(UNIX_EPOCH + Duration::from_secs(seconds)) { + Ok(elapsed) => elapsed >= UPDATE_INTERVAL, + // A stamp from the future only costs one extra check; recording the + // current time immediately afterwards repairs the clock skew. + Err(_) => true, + } +} + +fn record(stamp: &Path, now: SystemTime) { + let Ok(since) = now.duration_since(UNIX_EPOCH) else { + return; + }; + if let Some(parent) = stamp.parent() { + fs::create_dir_all(parent).ok(); + } + if let Ok(mut file) = AtomicWriteFile::open(stamp) + && file + .write_all(since.as_secs().to_string().as_bytes()) + .is_ok() + { + file.commit().ok(); + } +} + +fn last_line(text: &str) -> Option<&str> { + text.lines().map(str::trim).rfind(|line| !line.is_empty()) +} + +/// Run `yt-dlp --update` unless it already ran within the last twelve hours. +/// +/// Updating is best-effort: a package-managed yt-dlp refuses to replace itself, +/// and an offline machine cannot reach the release feed. Either way the +/// download still proceeds with the installed version. +pub fn update(tool: &str, executable: &Path) { + let now = SystemTime::now(); + let stamp = stamp_path(); + if let Some(path) = &stamp + && !due(now, path) + { + return; + } + println!("{tool}: checking for a newer yt-dlp"); + match Command::new(executable).arg("--update").output() { + Ok(output) => { + let text = format!( + "{}\n{}", + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr) + ); + let summary = last_line(&text) + .unwrap_or("yt-dlp reported nothing") + .to_owned(); + if output.status.success() { + println!("{tool}: {summary}"); + } else { + eprintln!("{tool}: yt-dlp could not update itself: {summary}"); + } + } + Err(error) => eprintln!("{tool}: cannot run yt-dlp --update: {error}"), + } + if let Some(path) = &stamp { + record(path, now); + } +} + +/// Keep an installed yt-dlp current even when this run downloads nothing. +/// +/// Sites change faster than yt-dlp releases reach package managers, so every +/// run of a tool that can download checks whether twelve hours have passed. +/// A machine without yt-dlp is left alone; it is fetched when first needed. +pub fn refresh(tool: &str) { + if let Some(executable) = deps::installed_yt_dlp() { + update(tool, &executable); + } +} + +fn arguments( + kind: Kind, + ffmpeg: &Path, + directory: &Path, + url: &str, + playlist: bool, +) -> Vec<OsString> { + let mut args: Vec<OsString> = Vec::new(); + // A personal yt-dlp configuration could redirect the output or re-encode + // behind our back, which headless runs must stay free of. + args.push(OsString::from("--ignore-config")); + args.push(OsString::from(if playlist { + "--yes-playlist" + } else { + "--no-playlist" + })); + args.extend([OsString::from("-f"), OsString::from(kind.format())]); + if matches!(kind, Kind::Video { .. }) { + args.extend([ + OsString::from("--merge-output-format"), + OsString::from("mkv"), + ]); + } + if kind == Kind::Original { + // Nothing re-encodes this file afterwards: take the highest + // resolution, and at that resolution the streams that play + // everywhere, in an MP4. + args.extend( + [ + "-S", + "res,vcodec:h264,ext:mp4:m4a", + "--merge-output-format", + "mp4", + ] + .map(OsString::from), + ); + } + args.extend([OsString::from("--trim-filenames"), OsString::from("120")]); + args.extend([ + OsString::from("--ffmpeg-location"), + ffmpeg.as_os_str().to_owned(), + ]); + args.extend([OsString::from("-P"), directory.as_os_str().to_owned()]); + args.extend([OsString::from("-o"), OsString::from(OUTPUT_TEMPLATE)]); + args.extend([OsString::from("--"), OsString::from(url)]); + args +} + +fn downloaded_files(directory: &Path) -> Vec<PathBuf> { + let mut files: Vec<_> = walkdir::WalkDir::new(directory) + .sort_by_file_name() + .into_iter() + .filter_map(Result::ok) + .filter(|entry| entry.file_type().is_file()) + .map(|entry| entry.into_path()) + .collect(); + files.sort(); + files +} + +/// A downloaded file and the URL it came from. +#[derive(Clone, Debug)] +pub struct Fetched { + pub url: String, + pub file: PathBuf, +} + +/// Download every URL into its own folder below `workspace`. +/// +/// yt-dlp keeps the terminal so its progress stays visible; a failure is +/// reported after it has already explained itself. +pub fn fetch( + tool: &str, + kind: Kind, + executable: &Path, + ffmpeg: &Path, + urls: &[String], + playlist: bool, + workspace: &Path, +) -> ToolResult<Vec<Fetched>> { + let mut downloaded = Vec::new(); + for (index, url) in urls.iter().enumerate() { + let directory = workspace.join(index.to_string()); + fs::create_dir_all(&directory).map_err(|error| { + ToolError::new(tool, format!("cannot prepare a download folder: {error}")) + })?; + println!("{tool}: downloading {url}"); + let status = Command::new(executable) + .args(arguments(kind, ffmpeg, &directory, url, playlist)) + .status() + .map_err(|error| ToolError::new(tool, format!("cannot run yt-dlp: {error}")))?; + if !status.success() { + return Err(ToolError::new( + tool, + format!("yt-dlp could not download {url}"), + )); + } + let files = downloaded_files(&directory); + if files.is_empty() { + return Err(ToolError::new( + tool, + format!("yt-dlp reported success but saved nothing for {url}"), + )); + } + downloaded.extend(files.into_iter().map(|file| Fetched { + url: url.clone(), + file, + })); + } + Ok(downloaded) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn only_http_addresses_are_treated_as_urls() { + assert!(is_url(OsStr::new("https://example.test/clip"))); + assert!(is_url(OsStr::new("HTTP://EXAMPLE.TEST/clip"))); + assert!(is_url(OsStr::new(" https://example.test/clip "))); + assert!(!is_url(OsStr::new("clip.mp4"))); + assert!(!is_url(OsStr::new("ftp://example.test/clip"))); + assert!(!is_url(OsStr::new("C:/videos/https_clip.mp4"))); + } + + #[test] + fn updates_run_once_per_twelve_hours() { + let temp = tempfile::tempdir().unwrap(); + let stamp = temp.path().join(STAMP_NAME); + let now = UNIX_EPOCH + Duration::from_secs(1_800_000_000); + assert!(due(now, &stamp), "a missing stamp must update"); + record(&stamp, now); + assert!(!due(now + Duration::from_secs(11 * 60 * 60), &stamp)); + assert!(due(now + UPDATE_INTERVAL, &stamp)); + // A damaged or future stamp updates once and is then rewritten. + fs::write(&stamp, "not a timestamp").unwrap(); + assert!(due(now, &stamp)); + record(&stamp, now + Duration::from_secs(60 * 60 * 24)); + assert!(due(now, &stamp)); + } + + #[test] + fn video_downloads_are_capped_and_merged_while_audio_skips_video() { + let video = arguments( + Kind::Video { + max_height: Some(1080), + }, + Path::new("/opt/ffmpeg"), + Path::new("/work/0"), + "https://example.test/watch?v=1", + false, + ); + let rendered: Vec<_> = video + .iter() + .map(|value| value.to_string_lossy().into_owned()) + .collect(); + assert!(rendered.contains(&"--ignore-config".to_owned())); + assert!(rendered.contains(&"--no-playlist".to_owned())); + assert!(rendered.contains(&"bv*[height<=1080]+ba/b[height<=1080]/bv*+ba/b".to_owned())); + assert!(rendered.contains(&"mkv".to_owned())); + assert_eq!(rendered.last().unwrap(), "https://example.test/watch?v=1"); + assert_eq!(rendered[rendered.len() - 2], "--"); + + let audio = arguments( + Kind::Audio, + Path::new("/opt/ffmpeg"), + Path::new("/work/0"), + "https://example.test/watch?v=1", + true, + ); + let rendered: Vec<_> = audio + .iter() + .map(|value| value.to_string_lossy().into_owned()) + .collect(); + assert!(rendered.contains(&"ba/b".to_owned())); + assert_eq!( + Kind::Video { + max_height: Some(2160) + } + .format(), + "bv*[height<=2160]+ba/b[height<=2160]/bv*+ba/b" + ); + assert_eq!(Kind::Video { max_height: None }.format(), "bv*+ba/b"); + + let original: Vec<_> = arguments( + Kind::Original, + Path::new("/opt/ffmpeg"), + Path::new("/work/0"), + "https://example.test/watch?v=1", + false, + ) + .iter() + .map(|value| value.to_string_lossy().into_owned()) + .collect(); + assert!(original.contains(&"res,vcodec:h264,ext:mp4:m4a".to_owned())); + assert!(original.contains(&"mp4".to_owned())); + assert!(!original.contains(&"mkv".to_owned())); + assert!(rendered.contains(&"--yes-playlist".to_owned())); + assert!(!rendered.contains(&"--merge-output-format".to_owned())); + } +} diff --git a/src/commands/ip.rs b/src/commands/ip.rs new file mode 100644 index 0000000..b5f9aa6 --- /dev/null +++ b/src/commands/ip.rs @@ -0,0 +1,457 @@ +//! Reporting the public IP address this machine presents to the internet. +//! +//! Both families are looked up at once so a bare run answers the question +//! without a switch. Each family is pinned by hostname rather than by socket +//! option: a name that publishes records for one family can only be reached +//! over that family, so the address the service echoes back is the one it +//! actually saw. A machine with no public route for a family is reported +//! straight away instead of waiting out a connection that cannot complete. + +use std::ffi::OsString; +use std::net::{IpAddr, SocketAddr, UdpSocket}; +use std::time::Duration; + +use serde_json::{Map, Value}; + +use crate::common; +use crate::error::{ToolError, ToolResult}; + +const TOOL: &str = "justip"; + +const HELP: &str = r#"justip — Show the public IP address this machine presents. + +Usage: + justip [options] + +Both IPv4 and IPv6 are reported by default. The address is echoed back by a +public lookup service, so it is what the internet sees rather than a local +interface address. Only the request itself is sent. + +Options: + -4, --ipv4 Report only the public IPv4 address + -6, --ipv6 Report only the public IPv6 address + --plain Print bare addresses only, one per line + --json Print machine-readable JSON + -t, --timeout SECONDS Seconds to wait for each lookup (1-60, default: 5) + -h, --help Show this help + +Run bare to open the interactive launcher; explicit arguments bypass the UI. +A family this machine cannot reach is reported as unavailable, and the run +fails only when no requested family answers."#; + +/// Public echo services, tried in order until one answers usefully. +/// +/// Each hostname publishes records for a single family, and that is what pins +/// the request to that family. Later entries are independent operators so one +/// outage does not take the tool down with it. +const IPV4_SERVICES: &[&str] = &[ + "https://api.ipify.org", + "https://ipv4.icanhazip.com", + "https://v4.ident.me", +]; +const IPV6_SERVICES: &[&str] = &[ + "https://api6.ipify.org", + "https://ipv6.icanhazip.com", + "https://v6.ident.me", +]; + +/// An echoed address is one short line, so anything longer is not an answer. +const MAX_RESPONSE_BYTES: u64 = 128; +const DEFAULT_TIMEOUT: u32 = 5; +const MAX_REASON_CHARS: usize = 160; + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +enum Family { + V4, + V6, +} + +impl Family { + fn label(self) -> &'static str { + match self { + Self::V4 => "IPv4", + Self::V6 => "IPv6", + } + } + + fn key(self) -> &'static str { + match self { + Self::V4 => "ipv4", + Self::V6 => "ipv6", + } + } + + fn matches(self, address: IpAddr) -> bool { + matches!( + (self, address), + (Self::V4, IpAddr::V4(_)) | (Self::V6, IpAddr::V6(_)) + ) + } + + /// The services to ask, in the order they are tried. + /// + /// An environment override replaces the whole list, semicolons between + /// entries, so a test can point at local servers instead of reaching the + /// network and still exercise the fallback chain. + fn services(self) -> Services { + let variable = match self { + Self::V4 => "JUSTIP_IPV4_URL", + Self::V6 => "JUSTIP_IPV6_URL", + }; + if let Ok(overridden) = std::env::var(variable) { + let urls: Vec<String> = overridden + .split(';') + .map(str::trim) + .filter(|url| !url.is_empty()) + .map(str::to_owned) + .collect(); + if !urls.is_empty() { + return Services { + urls, + overridden: true, + }; + } + } + Services { + urls: match self { + Self::V4 => IPV4_SERVICES, + Self::V6 => IPV6_SERVICES, + } + .iter() + .map(|url| (*url).to_owned()) + .collect(), + overridden: false, + } + } + + /// Where to bind and which address to route towards when asking the + /// routing table for a source address. + /// + /// Both destinations are documentation prefixes. Connecting a UDP socket + /// only selects a route and a source address; no packet is ever sent, so + /// the address chosen here is never contacted. + fn probe(self) -> (&'static str, &'static str) { + match self { + Self::V4 => ("0.0.0.0:0", "192.0.2.1:53"), + Self::V6 => ("[::]:0", "[2001:db8::1]:53"), + } + } +} + +struct Services { + urls: Vec<String>, + /// An override points somewhere other than the public internet, so the + /// public-route check does not describe it. + overridden: bool, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +enum Format { + Labeled, + Plain, + Json, +} + +#[derive(Debug)] +struct Options { + ipv4: bool, + ipv6: bool, + format: Format, + timeout: u32, + help: bool, +} + +impl Options { + /// Neither flag and both flags mean the same thing: report everything. + fn families(&self) -> Vec<Family> { + match (self.ipv4, self.ipv6) { + (true, false) => vec![Family::V4], + (false, true) => vec![Family::V6], + _ => vec![Family::V4, Family::V6], + } + } +} + +fn parse(args: Vec<OsString>) -> ToolResult<Options> { + let mut options = Options { + ipv4: false, + ipv6: false, + format: Format::Labeled, + timeout: DEFAULT_TIMEOUT, + help: false, + }; + let mut index = 0; + while index < args.len() { + let original = common::os_to_string(TOOL, &args[index], "option")?; + let (option, inline) = original + .split_once('=') + .filter(|_| original.starts_with("--")) + .map_or((original.as_str(), None), |(key, value)| { + (key, Some(value.to_owned())) + }); + match option { + "-h" | "--help" => options.help = true, + "-4" | "--ipv4" => options.ipv4 = true, + "-6" | "--ipv6" => options.ipv6 = true, + "--plain" => options.format = Format::Plain, + "--json" => options.format = Format::Json, + "-t" | "--timeout" => { + let value = match inline { + Some(value) => value, + None => common::option_value(TOOL, &args, &mut index, option)?, + }; + options.timeout = common::integer(TOOL, &value, "timeout", 1, 60)?; + } + _ if option.starts_with('-') => { + return Err(ToolError::usage(TOOL, format!("unknown option: {option}"))); + } + _ => { + return Err(ToolError::usage( + TOOL, + format!("justip takes no arguments: {option}"), + )); + } + } + index += 1; + } + Ok(options) +} + +/// Whether the routing table offers a source address that can reach a public +/// service for `family`. +/// +/// Waiting out a connection to an unreachable family is the slowest part of a +/// bare run, and an IPv6 stack limited to link-local or unique-local addresses +/// never had a path to begin with. Reading the source address a UDP connect +/// selects costs nothing and sends nothing. +fn reachable(family: Family) -> bool { + let (bind, probe) = family.probe(); + let (Ok(socket), Ok(probe)) = (UdpSocket::bind(bind), probe.parse::<SocketAddr>()) else { + return false; + }; + if socket.connect(probe).is_err() { + return false; + } + match socket.local_addr() { + // Behind NAT the IPv4 source is private, which says nothing about + // reachability; only loopback and an unassigned socket rule it out. + Ok(SocketAddr::V4(local)) => !local.ip().is_loopback() && !local.ip().is_unspecified(), + // Global unicast is 2000::/3. A unique-local or link-local source + // cannot reach a public service however the route is configured. + Ok(SocketAddr::V6(local)) => local.ip().segments()[0] & 0xE000 == 0x2000, + Err(_) => false, + } +} + +fn shorten(reason: &str) -> String { + let mut text = reason.replace(['\r', '\n', '\0'], " "); + if text.chars().count() > MAX_REASON_CHARS { + let boundary = text + .char_indices() + .nth(MAX_REASON_CHARS) + .map_or(text.len(), |(index, _)| index); + text.truncate(boundary); + text.push_str("..."); + } + text +} + +fn fetch(url: &str, timeout: Duration) -> Result<IpAddr, String> { + let agent: ureq::Agent = ureq::Agent::config_builder() + .timeout_global(Some(timeout)) + .build() + .into(); + let mut response = agent.get(url).call().map_err(|error| error.to_string())?; + let body = response + .body_mut() + .with_config() + .limit(MAX_RESPONSE_BYTES) + .read_to_string() + .map_err(|error| error.to_string())?; + body.trim() + .parse::<IpAddr>() + .map_err(|_| "answer was not an IP address".to_owned()) +} + +fn lookup(family: Family, timeout: Duration) -> Result<IpAddr, String> { + let services = family.services(); + if !services.overridden && !reachable(family) { + return Err(format!( + "this machine has no public {} route", + family.label() + )); + } + let mut failure = format!("no {} service was reachable", family.label()); + for url in services.urls { + match fetch(&url, timeout) { + Ok(address) if family.matches(address) => return Ok(address), + // A service answering with the other family cannot be trusted for + // this one, so move on rather than report the wrong address. + Ok(_) => failure = format!("{url} answered with the wrong address family"), + Err(error) => failure = format!("{url}: {error}"), + } + } + Err(shorten(&failure)) +} + +struct Report { + family: Family, + result: Result<IpAddr, String>, +} + +fn emit(reports: &[Report], format: Format) { + match format { + Format::Labeled => { + for report in reports { + match &report.result { + Ok(address) => println!("{}: {address}", report.family.label()), + Err(reason) => { + println!("{}: unavailable ({reason})", report.family.label()); + } + } + } + } + // Plain and JSON are consumed by other programs, so stdout carries only + // the answer and every explanation goes to stderr. + Format::Plain => { + for report in reports { + match &report.result { + Ok(address) => println!("{address}"), + Err(reason) => { + eprintln!("{TOOL}: {} unavailable: {reason}", report.family.label()); + } + } + } + } + Format::Json => { + let mut object = Map::new(); + for report in reports { + let value = match &report.result { + Ok(address) => Value::String(address.to_string()), + Err(reason) => { + eprintln!("{TOOL}: {} unavailable: {reason}", report.family.label()); + Value::Null + } + }; + object.insert(report.family.key().to_owned(), value); + } + println!("{}", Value::Object(object)); + } + } +} + +pub fn run(args: Vec<OsString>) -> ToolResult { + let options = parse(args)?; + if options.help { + println!("{HELP}"); + return Ok(()); + } + let timeout = Duration::from_secs(u64::from(options.timeout)); + // Both families are looked up together so reporting both costs one + // timeout rather than two. + let reports: Vec<Report> = std::thread::scope(|scope| { + let handles: Vec<_> = options + .families() + .into_iter() + .map(|family| (family, scope.spawn(move || lookup(family, timeout)))) + .collect(); + handles + .into_iter() + .map(|(family, handle)| Report { + family, + result: handle + .join() + .unwrap_or_else(|_| Err("the lookup did not finish".to_owned())), + }) + .collect() + }); + let failures: Vec<String> = reports + .iter() + .filter_map(|report| { + report + .result + .as_ref() + .err() + .map(|reason| format!("{}: {reason}", report.family.label())) + }) + .collect(); + if failures.len() == reports.len() { + return Err(ToolError::new( + TOOL, + format!("no public address available ({})", failures.join("; ")), + )); + } + emit(&reports, options.format); + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn parse_args(args: &[&str]) -> ToolResult<Options> { + parse(args.iter().map(OsString::from).collect()) + } + + #[test] + fn both_families_are_reported_without_a_switch() { + let options = parse_args(&[]).unwrap(); + assert_eq!(options.families(), vec![Family::V4, Family::V6]); + assert_eq!(options.format, Format::Labeled); + assert_eq!(options.timeout, DEFAULT_TIMEOUT); + // Asking for both explicitly is the same request as asking for neither. + assert_eq!( + parse_args(&["-4", "-6"]).unwrap().families(), + vec![Family::V4, Family::V6] + ); + assert_eq!(parse_args(&["-4"]).unwrap().families(), vec![Family::V4]); + assert_eq!( + parse_args(&["--ipv6"]).unwrap().families(), + vec![Family::V6] + ); + } + + #[test] + fn output_and_timeout_options_parse_in_both_forms() { + assert_eq!(parse_args(&["--plain"]).unwrap().format, Format::Plain); + assert_eq!(parse_args(&["--json"]).unwrap().format, Format::Json); + assert_eq!(parse_args(&["--timeout=12"]).unwrap().timeout, 12); + assert_eq!(parse_args(&["-t", "30"]).unwrap().timeout, 30); + for rejected in [ + vec!["--timeout", "0"], + vec!["--timeout", "61"], + vec!["--timeout"], + vec!["--timeout="], + vec!["--nope"], + vec!["8.8.8.8"], + ] { + let error = parse_args(&rejected).unwrap_err(); + assert_eq!(error.exit_code(), 2, "{rejected:?} should be a usage error"); + } + } + + #[test] + fn an_answer_is_only_accepted_for_the_family_it_was_asked_for() { + assert!(Family::V4.matches("203.0.113.7".parse().unwrap())); + assert!(!Family::V4.matches("2001:db8::7".parse().unwrap())); + assert!(Family::V6.matches("2001:db8::7".parse().unwrap())); + assert!(!Family::V6.matches("203.0.113.7".parse().unwrap())); + } + + #[test] + fn a_long_failure_is_trimmed_to_one_line() { + assert_eq!(shorten("dns failed\nfor host"), "dns failed for host"); + let long = shorten(&"x".repeat(MAX_REASON_CHARS + 50)); + assert_eq!(long.chars().count(), MAX_REASON_CHARS + 3); + assert!(long.ends_with("...")); + // A message that already fits is returned unchanged. + assert_eq!(shorten("short"), "short"); + } + + #[test] + fn an_ipv4_route_exists_wherever_tests_run() { + // Every test host can reach its own loopback-free IPv4 stack; IPv6 is + // deliberately not asserted because runners differ. + assert!(reachable(Family::V4)); + } +} diff --git a/src/commands/media.rs b/src/commands/media.rs index 710b72e..b592c43 100644 --- a/src/commands/media.rs +++ b/src/commands/media.rs @@ -7,6 +7,7 @@ use std::time::{Duration, Instant}; use rayon::prelude::*; +use crate::commands::download; use crate::common::{self, CollectedPaths, InputOptions, Plan}; use crate::deps; use crate::error::{ToolError, ToolResult}; @@ -91,6 +92,15 @@ impl MediaMode { fn is_audio(self) -> bool { matches!(self, Self::Audio | Self::Mp3 | Self::Wav) } + fn download_kind(self) -> Option<download::Kind> { + match self { + Self::Video => Some(download::Kind::Video { + max_height: Some(1080), + }), + Self::Audio | Self::Mp3 | Self::Wav => Some(download::Kind::Audio), + Self::Png | Self::Webp | Self::Avif => None, + } + } } #[derive(Clone, Debug)] @@ -109,8 +119,11 @@ struct Options { crf: u32, preset: String, audio_bitrate: String, + /// Tallest frame the video encode may produce; `None` keeps the source size. + resolution: Option<u32>, sample_rate: u32, bits: u32, + playlist: bool, inputs: Vec<OsString>, help: bool, } @@ -164,20 +177,29 @@ Options: mode.default_jobs() ), MediaMode::Video => format!( - r#"justvideo — Optimize videos as streaming-ready 720p H.264 MP4. + r#"justvideo — Optimize videos as streaming-ready H.264 MP4. Usage: - justvideo [options] [file-or-folder ...] + justvideo [options] [file-or-folder-or-url ...] + +Default output is <name>-web.mp4 at 720p using CRF 28, x264 medium, AAC 128k. +--resolution sets the largest frame; smaller sources are never upscaled. -Default output is <name>-web.mp4 using CRF 28, x264 medium, AAC 128k. +An http(s) URL is downloaded with yt-dlp (source height capped at 1080p, or at +a larger --resolution) and then encoded with these same settings to +`<title> [<id>].mp4` in the current folder, or in --output. The download itself +is temporary and is never kept. A missing yt-dlp or FFmpeg is downloaded +automatically, and yt-dlp is updated whenever twelve hours have passed. Options: -f, --replace Replace sources; non-MP4 sources become <name>.mp4 + --playlist Download every entry when a URL is a playlist -o, --output DIR Write outputs to DIR and keep sources -j, --jobs N Parallel encodes (default: {}) -r, --recursive Include nested folders -y, --yes Skip folder-scan confirmation -n, --dry-run Preview without changing files + --resolution SIZE 480p, 720p, 1080p, 1440p, 4k, or source (default: 720p) --crf N H.264 quality, 0-51 (default: 28) --preset NAME x264 preset (default: medium) --audio-bitrate N AAC bitrate (default: 128k) @@ -228,12 +250,18 @@ Options: r#"{} — Convert audio or extract it from video. Usage: - {} [options] [file-or-folder ...] + {} [options] [file-or-folder-or-url ...] Default: {description}. Sources are kept. +An http(s) URL is downloaded with yt-dlp and converted with these same settings +to `<title> [<id>]{}` in the current folder, or in --output. The download itself +is temporary and is never kept. A missing yt-dlp or FFmpeg is downloaded +automatically, and yt-dlp is updated whenever twelve hours have passed. + Options: -f, --replace Remove source after output is safely installed + --playlist Download every entry when a URL is a playlist -o, --output DIR Write outputs to DIR and keep sources -j, --jobs N Parallel conversions (default: {}) -r, --recursive Include nested folders @@ -245,6 +273,7 @@ Options: -h, --help Show this help"#, mode.tool(), mode.tool(), + mode.target_extension(), mode.default_jobs() ) } @@ -294,8 +323,10 @@ fn parse(mode: MediaMode, args: Vec<OsString>) -> ToolResult<Options> { "128k".into() } }), + resolution: Some(720), sample_rate: 48_000, bits: 16, + playlist: false, inputs: Vec::new(), help: false, }; @@ -412,6 +443,10 @@ fn parse(mode: MediaMode, args: Vec<OsString>) -> ToolResult<Options> { flag(&inline)?; options.include_target = true; } + "--playlist" if mode.download_kind().is_some() => { + flag(&inline)?; + options.playlist = true; + } "--reencode" if mode.is_audio() => { flag(&inline)?; options.include_target = true; @@ -430,6 +465,9 @@ fn parse(mode: MediaMode, args: Vec<OsString>) -> ToolResult<Options> { options.audio_bitrate = value(&mut index)?; validate_bitrate(tool, &options.audio_bitrate)?; } + "--resolution" if mode == MediaMode::Video => { + options.resolution = parse_resolution(tool, &value(&mut index)?)? + } "--crf" if mode == MediaMode::Video => { options.crf = common::integer(tool, &value(&mut index)?, "CRF", 0, 51)? } @@ -524,6 +562,48 @@ fn parse(mode: MediaMode, args: Vec<OsString>) -> ToolResult<Options> { Ok(options) } +/// Frame heights `justvideo --resolution` accepts, smallest first. +const RESOLUTIONS: [u32; 5] = [480, 720, 1080, 1440, 2160]; + +fn parse_resolution(tool: &str, value: &str) -> ToolResult<Option<u32>> { + let lower = value.trim().to_ascii_lowercase(); + let height = match lower.as_str() { + "source" | "original" => return Ok(None), + "4k" | "uhd" => Some(2160), + "qhd" => Some(1440), + other => other.strip_suffix('p').unwrap_or(other).parse::<u32>().ok(), + }; + height + .filter(|height| RESOLUTIONS.contains(height)) + .map(Some) + .ok_or_else(|| { + ToolError::usage( + tool, + "resolution must be 480p, 720p, 1080p, 1440p, 4k, or source", + ) + }) +} + +/// Scale into a 16:9 box of the requested height without ever upscaling; +/// H.264 4:2:0 needs even dimensions either way. +fn video_filter(resolution: Option<u32>) -> String { + match resolution { + Some(height) => { + let width = (height * 16 / 9 + 1) & !1; + format!( + "scale='min({width},iw)':'min({height},ih)':force_original_aspect_ratio=decrease:force_divisible_by=2,format=yuv420p" + ) + } + None => "scale=trunc(iw/2)*2:trunc(ih/2)*2,format=yuv420p".into(), + } +} + +/// Downloading more than the encode keeps only costs time, but 1080p is the +/// floor so smaller targets still downscale from a clean source. +fn download_height(resolution: Option<u32>) -> Option<u32> { + resolution.map(|height| height.max(1080)) +} + fn validate_quality_range(tool: &str, value: &str) -> ToolResult<String> { if let Ok(maximum) = value.parse::<u32>() && maximum <= 100 @@ -763,23 +843,7 @@ fn dependency_executable(mode: MediaMode) -> ToolResult<PathBuf> { MediaMode::Webp => "CWEBP_BIN", _ => "FFMPEG_BIN", }; - let Some(requested) = std::env::var_os(variable).filter(|value| !value.is_empty()) else { - return deps::require(mode.tool(), mode.dependency()); - }; - let path = PathBuf::from(&requested); - if path.is_file() { - return Ok(path); - } - let text = requested.to_str().ok_or_else(|| { - ToolError::new( - mode.tool(), - format!( - "{variable} points to a missing non-UTF-8 path: {}", - path.to_string_lossy() - ), - ) - })?; - deps::require(mode.tool(), text) + deps::require_override(mode.tool(), variable, mode.dependency()) } pub(crate) fn animated_png(path: &Path) -> bool { @@ -1061,27 +1125,154 @@ fn encode(mode: MediaMode, options: &Options, executable: &Path, plan: &Plan) -> let source = plan.source.as_os_str().to_owned(); let target = temporary.as_os_str().to_owned(); let args: Vec<OsString> = match mode { - MediaMode::Png => ["--quality", &options.quality_range, "--speed", &options.speed.to_string(), "--strip", "--skip-if-larger", "--force", "--output"] - .into_iter().map(OsString::from).chain([target.clone(), OsString::from("--"), source.clone()]).collect(), - MediaMode::Webp => ["-quiet", "-q", &options.quality.to_string(), "-m", &options.method.to_string(), "-mt", "-sharp_yuv", "-metadata", "none"] - .into_iter().map(OsString::from).chain([source.clone(), OsString::from("-o"), target.clone()]).collect(), - MediaMode::Video => vec!["-hide_banner", "-loglevel", "error", "-nostdin", "-y", "-i"].into_iter().map(OsString::from).chain([source.clone()]).chain([ - "-map", "0:v:0", "-map", "0:a:0?", "-map_metadata", "-1", "-sn", "-dn", "-vf", "scale='min(1280,iw)':'min(720,ih)':force_original_aspect_ratio=decrease:force_divisible_by=2,format=yuv420p", "-c:v", "libx264", "-preset" - ].into_iter().map(OsString::from)).chain([OsString::from(&options.preset), OsString::from("-crf"), OsString::from(options.crf.to_string()), OsString::from("-c:a"), OsString::from("aac"), OsString::from("-b:a"), OsString::from(&options.audio_bitrate), OsString::from("-movflags"), OsString::from("+faststart"), target.clone()]).collect(), + MediaMode::Png => [ + "--quality", + &options.quality_range, + "--speed", + &options.speed.to_string(), + "--strip", + "--skip-if-larger", + "--force", + "--output", + ] + .into_iter() + .map(OsString::from) + .chain([target.clone(), OsString::from("--"), source.clone()]) + .collect(), + MediaMode::Webp => [ + "-quiet", + "-q", + &options.quality.to_string(), + "-m", + &options.method.to_string(), + "-mt", + "-sharp_yuv", + "-metadata", + "none", + ] + .into_iter() + .map(OsString::from) + .chain([source.clone(), OsString::from("-o"), target.clone()]) + .collect(), + MediaMode::Video => vec!["-hide_banner", "-loglevel", "error", "-nostdin", "-y", "-i"] + .into_iter() + .map(OsString::from) + .chain([source.clone()]) + .chain( + [ + "-map", + "0:v:0", + "-map", + "0:a:0?", + "-map_metadata", + "-1", + "-sn", + "-dn", + "-vf", + ] + .into_iter() + .map(OsString::from), + ) + .chain([ + OsString::from(video_filter(options.resolution)), + OsString::from("-c:v"), + OsString::from("libx264"), + OsString::from("-preset"), + OsString::from(&options.preset), + OsString::from("-crf"), + OsString::from(options.crf.to_string()), + OsString::from("-c:a"), + OsString::from("aac"), + OsString::from("-b:a"), + OsString::from(&options.audio_bitrate), + OsString::from("-movflags"), + OsString::from("+faststart"), + target.clone(), + ]) + .collect(), MediaMode::Avif => { let crf = (63.0 - options.quality as f64 * 0.63).round() as u32; - vec!["-hide_banner", "-loglevel", "error", "-nostdin", "-y", "-i"].into_iter().map(OsString::from).chain([source.clone()]).chain([ - "-frames:v", "1", "-map_metadata", "-1", "-an", "-sn", "-dn", "-c:v", "libaom-av1", "-still-picture", "1", "-crf" - ].into_iter().map(OsString::from)).chain([OsString::from(crf.to_string()), OsString::from("-cpu-used"), OsString::from(options.speed.to_string()), OsString::from("-row-mt"), OsString::from("1"), OsString::from("-b:v"), OsString::from("0"), OsString::from("-pix_fmt"), OsString::from("yuv420p"), target.clone()]).collect() + vec!["-hide_banner", "-loglevel", "error", "-nostdin", "-y", "-i"] + .into_iter() + .map(OsString::from) + .chain([source.clone()]) + .chain( + [ + "-frames:v", + "1", + "-map_metadata", + "-1", + "-an", + "-sn", + "-dn", + "-c:v", + "libaom-av1", + "-still-picture", + "1", + "-crf", + ] + .into_iter() + .map(OsString::from), + ) + .chain([ + OsString::from(crf.to_string()), + OsString::from("-cpu-used"), + OsString::from(options.speed.to_string()), + OsString::from("-row-mt"), + OsString::from("1"), + OsString::from("-b:v"), + OsString::from("0"), + OsString::from("-pix_fmt"), + OsString::from("yuv420p"), + target.clone(), + ]) + .collect() } MediaMode::Audio | MediaMode::Mp3 | MediaMode::Wav => { - let mut values: Vec<OsString> = ["-hide_banner", "-loglevel", "error", "-nostdin", "-y", "-i"].into_iter().map(OsString::from).collect(); + let mut values: Vec<OsString> = + ["-hide_banner", "-loglevel", "error", "-nostdin", "-y", "-i"] + .into_iter() + .map(OsString::from) + .collect(); values.push(source.clone()); - values.extend(["-map", "0:a:0", "-vn", "-sn", "-dn", "-map_metadata", "-1"].into_iter().map(OsString::from)); + values.extend( + ["-map", "0:a:0", "-vn", "-sn", "-dn", "-map_metadata", "-1"] + .into_iter() + .map(OsString::from), + ); match mode { - MediaMode::Audio => values.extend([OsString::from("-c:a"), OsString::from("aac"), OsString::from("-profile:a"), OsString::from("aac_low"), OsString::from("-b:a"), OsString::from(&options.audio_bitrate), OsString::from("-ar"), OsString::from(options.sample_rate.to_string()), OsString::from("-movflags"), OsString::from("+faststart")]), - MediaMode::Mp3 => values.extend([OsString::from("-c:a"), OsString::from("libmp3lame"), OsString::from("-q:a"), OsString::from(options.quality.to_string()), OsString::from("-ar"), OsString::from(options.sample_rate.to_string())]), - MediaMode::Wav => values.extend([OsString::from("-c:a"), OsString::from(if options.bits == 24 { "pcm_s24le" } else { "pcm_s16le" }), OsString::from("-ar"), OsString::from(options.sample_rate.to_string()), OsString::from("-ac"), OsString::from("2")]), + MediaMode::Audio => values.extend([ + OsString::from("-c:a"), + OsString::from("aac"), + OsString::from("-profile:a"), + OsString::from("aac_low"), + OsString::from("-b:a"), + OsString::from(&options.audio_bitrate), + OsString::from("-ar"), + OsString::from(options.sample_rate.to_string()), + OsString::from("-movflags"), + OsString::from("+faststart"), + ]), + MediaMode::Mp3 => values.extend([ + OsString::from("-c:a"), + OsString::from("libmp3lame"), + OsString::from("-q:a"), + OsString::from(options.quality.to_string()), + OsString::from("-ar"), + OsString::from(options.sample_rate.to_string()), + ]), + MediaMode::Wav => values.extend([ + OsString::from("-c:a"), + OsString::from(if options.bits == 24 { + "pcm_s24le" + } else { + "pcm_s16le" + }), + OsString::from("-ar"), + OsString::from(options.sample_rate.to_string()), + OsString::from("-ac"), + OsString::from("2"), + ]), _ => unreachable!(), } values.push(target.clone()); @@ -1140,6 +1331,84 @@ fn encode(mode: MediaMode, options: &Options, executable: &Path, plan: &Plan) -> Status::Done { before, after } } +fn split_inputs(mode: MediaMode, inputs: &[OsString]) -> ToolResult<(Vec<String>, Vec<OsString>)> { + let mut urls = Vec::new(); + let mut paths = Vec::new(); + for input in inputs { + if download::is_url(input) { + if mode.download_kind().is_none() { + return Err(ToolError::usage( + mode.tool(), + format!( + "{} reads local files; download a URL with justvideo, justaudio, justmp3, or justwav", + mode.tool() + ), + )); + } + urls.push(input.to_string_lossy().trim().to_owned()); + } else { + paths.push(input.clone()); + } + } + Ok((urls, paths)) +} + +fn download_directory(options: &Options) -> PathBuf { + options + .output + .clone() + .unwrap_or_else(|| std::env::current_dir().unwrap_or_else(|_| PathBuf::from("."))) +} + +/// Downloads carry no source folder to write beside, so they land in the +/// current folder (or --output) under the title yt-dlp saved them as. Each +/// plan is reported against its URL rather than its temporary file. +fn download_plans( + mode: MediaMode, + options: &Options, + files: Vec<download::Fetched>, +) -> Vec<(Plan, String)> { + let parent = download_directory(options); + files + .into_iter() + .map(|fetched| { + let stem = fetched + .file + .file_stem() + .unwrap_or_default() + .to_string_lossy() + .into_owned(); + ( + Plan { + output: parent.join(format!("{stem}{}", mode.target_extension())), + source: fetched.file, + output_exists: false, + overwrites_source: false, + removes_source: false, + }, + fetched.url, + ) + }) + .collect() +} + +fn print_download_dry_run(mode: MediaMode, options: &Options, urls: &[String]) { + let parent = download_directory(options); + println!( + "{}: dry run — {} download(s) with yt-dlp", + mode.tool(), + urls.len() + ); + for url in urls { + println!( + " {url} -> {}", + common::display_path( + &parent.join(format!("<title> [<id>]{}", mode.target_extension())) + ) + ); + } +} + fn print_dry_run(mode: MediaMode, plans: &[Plan]) { println!("{}: dry run — {} file(s)", mode.tool(), plans.len()); for plan in plans.iter().take(100) { @@ -1182,26 +1451,40 @@ pub fn run(mode: MediaMode, args: Vec<OsString>) -> ToolResult { inputs = common::parse_input_lines(&common::read_stdin()?); piped = !inputs.is_empty(); } - if inputs.is_empty() { + let (urls, mut inputs) = split_inputs(mode, &inputs)?; + if inputs.is_empty() && urls.is_empty() { inputs.push( std::env::current_dir() .unwrap_or_else(|_| PathBuf::from(".")) .into_os_string(), ); } - let collected = collect(mode, &options, &inputs)?; + let collected = if inputs.is_empty() { + CollectedPaths { + files: Vec::new(), + used_directory: false, + warnings: Vec::new(), + } + } else { + collect(mode, &options, &inputs)? + }; for warning in &collected.warnings { eprintln!("{}: {warning}", mode.tool()); } - if collected.files.is_empty() { + if collected.files.is_empty() && urls.is_empty() { return Err(ToolError::new(mode.tool(), "no supported files found")); } for file in &collected.files { assert_safe(mode, file)?; } - let plans = plans(mode, &options, collected.files)?; + let mut plans = plans(mode, &options, collected.files)?; if options.dry_run { - print_dry_run(mode, &plans); + if !plans.is_empty() { + print_dry_run(mode, &plans); + } + if !urls.is_empty() { + print_download_dry_run(mode, &options, &urls); + } return Ok(()); } let destructive = plans @@ -1222,6 +1505,9 @@ pub fn run(mode: MediaMode, args: Vec<OsString>) -> ToolResult { { return Err(ToolError::cancelled(mode.tool())); } + if mode.download_kind().is_some() { + download::refresh(mode.tool()); + } let executable = dependency_executable(mode)?; verify_ffmpeg_encoder(mode, &options, &executable)?; if mode == MediaMode::Avif { @@ -1231,6 +1517,47 @@ pub fn run(mode: MediaMode, args: Vec<OsString>) -> ToolResult { } } } + let mut labels: Vec<String> = plans + .iter() + .map(|plan| common::display_path(&plan.source)) + .collect(); + // The workspace holds every download and is removed with this run. + let _workspace = if urls.is_empty() { + None + } else { + let kind = match mode + .download_kind() + .expect("URLs are rejected for modes that cannot download") + { + download::Kind::Video { .. } => download::Kind::Video { + max_height: download_height(options.resolution), + }, + kind => kind, + }; + let downloader = download::executable(mode.tool())?; + download::update(mode.tool(), &downloader); + let workspace = tempfile::tempdir().map_err(|error| { + ToolError::new( + mode.tool(), + format!("cannot create a download folder: {error}"), + ) + })?; + let files = download::fetch( + mode.tool(), + kind, + &downloader, + &executable, + &urls, + options.playlist, + workspace.path(), + )?; + for (plan, url) in download_plans(mode, &options, files) { + plans.push(plan); + labels.push(url); + } + common::validate_plans(mode.tool(), &mut plans)?; + Some(workspace) + }; let started = Instant::now(); println!( "{}: {} file(s), {} job(s)", @@ -1258,15 +1585,11 @@ pub fn run(mode: MediaMode, args: Vec<OsString>) -> ToolResult { let mut kept = 0; let mut failed = 0; let mut warnings = 0; - for (plan, status) in plans.iter().zip(&results) { + for ((plan, status), source) in plans.iter().zip(&results).zip(&labels) { let mapping = if common::same_path(&plan.source, &plan.output) { - common::display_path(&plan.source) + source.clone() } else { - format!( - "{} -> {}", - common::display_path(&plan.source), - common::display_path(&plan.output) - ) + format!("{source} -> {}", common::display_path(&plan.output)) }; match status { Status::Done { before, after } => { @@ -1279,10 +1602,7 @@ pub fn run(mode: MediaMode, args: Vec<OsString>) -> ToolResult { } Status::Kept(reason) => { kept += 1; - println!( - " kept {} ({reason})", - common::display_path(&plan.source) - ); + println!(" kept {source} ({reason})"); } Status::Warning(error) => { warnings += 1; @@ -1290,7 +1610,7 @@ pub fn run(mode: MediaMode, args: Vec<OsString>) -> ToolResult { } Status::Failed(error) => { failed += 1; - eprintln!(" failed {}: {error}", common::display_path(&plan.source)); + eprintln!(" failed {source}: {error}"); } } } @@ -1342,6 +1662,35 @@ mod tests { } } + #[test] + fn video_resolution_bounds_the_frame_and_the_download() { + let parsed = |value: &str| { + parse(MediaMode::Video, vec!["--resolution".into(), value.into()]) + .map(|options| options.resolution) + }; + assert_eq!( + parse(MediaMode::Video, vec![]).unwrap().resolution, + Some(720) + ); + assert_eq!(parsed("1080p").unwrap(), Some(1080)); + assert_eq!(parsed("480").unwrap(), Some(480)); + assert_eq!(parsed("4K").unwrap(), Some(2160)); + assert_eq!(parsed("source").unwrap(), None); + assert!(parsed("900").unwrap_err().message().contains("resolution")); + assert!(parse(MediaMode::Mp3, vec!["--resolution".into(), "720".into()]).is_err()); + + assert!(video_filter(Some(480)).starts_with("scale='min(854,iw)':'min(480,ih)'")); + assert!(video_filter(Some(720)).starts_with("scale='min(1280,iw)':'min(720,ih)'")); + assert!(video_filter(Some(2160)).starts_with("scale='min(3840,iw)':'min(2160,ih)'")); + assert_eq!( + video_filter(None), + "scale=trunc(iw/2)*2:trunc(ih/2)*2,format=yuv420p" + ); + assert_eq!(download_height(Some(480)), Some(1080)); + assert_eq!(download_height(Some(2160)), Some(2160)); + assert_eq!(download_height(None), None); + } + #[test] fn rejects_invalid_quality() { let error = parse(MediaMode::Png, vec!["--quality".into(), "90-20".into()]).unwrap_err(); @@ -1356,6 +1705,40 @@ mod tests { assert!(!encoder_available(listing, "x264")); } + #[test] + fn urls_are_separated_from_paths_and_refused_by_image_modes() { + let inputs = vec![ + OsString::from("https://example.test/watch?v=1"), + OsString::from("clip.mkv"), + ]; + let (urls, paths) = split_inputs(MediaMode::Video, &inputs).unwrap(); + assert_eq!(urls, vec!["https://example.test/watch?v=1".to_owned()]); + assert_eq!(paths, vec![OsString::from("clip.mkv")]); + let error = split_inputs(MediaMode::Png, &inputs).unwrap_err(); + assert_eq!(error.exit_code(), 2); + } + + #[test] + fn downloads_keep_their_saved_title_and_never_remove_a_source() { + let options = parse(MediaMode::Video, Vec::new()).unwrap(); + let plans = download_plans( + MediaMode::Video, + &options, + vec![download::Fetched { + url: "https://example.test/watch?v=1".into(), + file: PathBuf::from("Great Clip [abc123].mkv"), + }], + ); + let (plan, url) = &plans[0]; + assert_eq!( + plan.output.file_name().unwrap(), + OsStr::new("Great Clip [abc123].mp4") + ); + assert_eq!(url, "https://example.test/watch?v=1"); + assert!(!plan.removes_source); + assert!(!plan.overwrites_source); + } + #[test] fn encoder_output_path_stays_reserved() { let directory = tempfile::tempdir().unwrap(); diff --git a/src/commands/mod.rs b/src/commands/mod.rs index 9f862c9..43cd468 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -8,13 +8,16 @@ pub mod bunt; pub mod commit; mod core_port; pub mod crop; +mod download; mod image_ops; +pub mod ip; pub mod jpg; pub mod json; pub mod links; mod media; pub mod mkcd; pub mod optimize; +pub mod paste; pub mod pdf; pub mod png; pub mod port; @@ -55,6 +58,10 @@ pub const COMMANDS: &[CommandInfo] = &[ name: "justcrop", description: "trim transparent image borders to their alpha bounds", }, + CommandInfo { + name: "justip", + description: "show the public IPv4 and IPv6 address this machine presents", + }, CommandInfo { name: "justjpg", description: "create optimized progressive JPEG files", @@ -79,6 +86,10 @@ pub const COMMANDS: &[CommandInfo] = &[ name: "justoptimize", description: "choose the smallest web-ready PNG, WebP, or JPEG safely", }, + CommandInfo { + name: "justpaste", + description: "download whatever a link points at into the current folder", + }, CommandInfo { name: "justpdf", description: "inspect, merge, split, extract, or rotate PDFs, or save their images and links", @@ -117,7 +128,7 @@ pub const COMMANDS: &[CommandInfo] = &[ }, CommandInfo { name: "justvideo", - description: "optimize videos as streaming-ready 720p H.264 MP4", + description: "optimize videos as streaming-ready H.264 MP4 at 480p to 4K", }, CommandInfo { name: "justwav", @@ -151,7 +162,7 @@ pub fn dispatch(command: &str, args: Vec<OsString>) -> ToolResult { dispatch_headless(command, args) } -fn dispatch_headless(command: &str, args: Vec<OsString>) -> ToolResult { +pub(crate) fn dispatch_headless(command: &str, args: Vec<OsString>) -> ToolResult { match command { "justaudio" => audio::run(audio::Mode::Aac, args), "justmp3" => audio::run(audio::Mode::Mp3, args), @@ -161,6 +172,7 @@ fn dispatch_headless(command: &str, args: Vec<OsString>) -> ToolResult { "justbunt" => bunt::run(args), "justcommit" => commit::run(args), "justcrop" => crop::run(args), + "justip" => ip::run(args), "justjpg" => jpg::run(args), "justmkcd" => mkcd::run(args), "justpng" => png::run(args), @@ -169,6 +181,7 @@ fn dispatch_headless(command: &str, args: Vec<OsString>) -> ToolResult { "justzip" => zip::run(args), "justjson" => json::run(args), "justlinks" => links::run(args), + "justpaste" => paste::run(args), "justpdf" => pdf::run(args), "justport" => port::run(args), "justports" => ports::run(args), diff --git a/src/commands/paste.rs b/src/commands/paste.rs new file mode 100644 index 0000000..a7963da --- /dev/null +++ b/src/commands/paste.rs @@ -0,0 +1,845 @@ +//! `justpaste` — turn a link into a file in the current folder. +//! +//! A link that answers with a file (an image, a video, a PDF, an archive) is +//! saved as that file. A link that answers with a web page is handed to +//! yt-dlp, which knows YouTube, TikTok, and thousands of other sites; when +//! yt-dlp finds nothing, the media the page itself declares is saved instead. +//! Nothing is ever overwritten: a taken name gets " (2)", " (3)", and so on. + +use std::ffi::OsString; +use std::fs; +use std::io::{Read, Write}; +use std::path::{Path, PathBuf}; +use std::time::Duration; + +use ureq::ResponseExt; + +use crate::commands::download; +use crate::common; +use crate::deps; +use crate::error::{ToolError, ToolResult}; + +const TOOL: &str = "justpaste"; +/// Many hosts refuse clients that do not look like a browser. +const USER_AGENT: &str = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36"; +/// Enough of a page to find the media it declares in its head. +const MAX_PAGE_BYTES: u64 = 4 * 1024 * 1024; +const MAX_NAME_CHARS: usize = 150; + +struct Options { + output: Option<PathBuf>, + clipboard: bool, + playlist: bool, + dry_run: bool, + inputs: Vec<String>, + help: bool, +} + +fn help() { + println!( + r#"justpaste — Download whatever a link points at into this folder. + +Usage: + justpaste [options] [url ...] + justpaste --clipboard + +A link to a file (image, video, audio, PDF, archive, anything) is saved as that +file, named as the server names it. A link to a page is downloaded with yt-dlp, +which handles YouTube, TikTok, and most other video and social sites, at the +highest resolution, as an MP4. When yt-dlp finds nothing, the video or image +the page itself declares is saved instead. + +Files land in the current folder, or in --output. Nothing is overwritten: a +taken name becomes "name (2).ext". Partial downloads never appear under their +final name. Several links can be given, and --clipboard takes every link in +the copied text. + +Options: + -c, --clipboard Use the links in the clipboard + -o, --output DIR Save into DIR instead of the current folder + --playlist Download every entry when a link is a playlist + -n, --dry-run Show what would be fetched without any network access + -h, --help Show this help + +Page links need yt-dlp and FFmpeg, which are downloaded automatically when +missing; direct file links need nothing. yt-dlp is updated whenever twelve +hours have passed since its last update. + +Run justpaste with no arguments to open the interactive launcher. Its Headless +footer shows the equivalent direct command; explicit arguments and pipes bypass +the UI."# + ); +} + +fn parse(args: Vec<OsString>) -> ToolResult<Options> { + let mut options = Options { + output: None, + clipboard: false, + playlist: false, + dry_run: false, + inputs: Vec::new(), + help: false, + }; + let mut index = 0; + while index < args.len() { + let argument = common::os_to_string(TOOL, &args[index], "argument")?; + match argument.as_str() { + "-h" | "--help" => options.help = true, + "-c" | "--clipboard" => options.clipboard = true, + "--playlist" => options.playlist = true, + "-n" | "--dry-run" => options.dry_run = true, + "-o" | "--output" => { + index += 1; + let value = args + .get(index) + .filter(|value| !value.is_empty()) + .ok_or_else(|| ToolError::usage(TOOL, "--output needs a value"))?; + options.output = Some(PathBuf::from(value)); + } + _ if argument.starts_with("--output=") => { + options.output = Some(PathBuf::from(argument.trim_start_matches("--output="))); + } + _ if argument.starts_with('-') && argument != "-" => { + return Err(ToolError::usage( + TOOL, + format!("unknown option: {argument}"), + )); + } + _ => options.inputs.push(argument), + } + index += 1; + } + Ok(options) +} + +/// Every link in a piece of text, in order, without repeats. +/// +/// Copied text often wraps a link in quotes, brackets, or a trailing full +/// stop, so those are trimmed; a bare `www.` address is taken as HTTPS. +fn links(text: &str) -> Vec<String> { + let mut found: Vec<String> = Vec::new(); + for token in text.split(|character: char| { + character.is_whitespace() || matches!(character, '<' | '>' | '"' | '\'' | '`') + }) { + let token = token + .trim_start_matches(['(', '[', '{']) + .trim_end_matches(['.', ',', ';', '!', ')', ']', '}']); + let lower = token.to_ascii_lowercase(); + let link = if lower.starts_with("http://") || lower.starts_with("https://") { + token.to_owned() + } else if lower.starts_with("www.") && token.len() > 4 { + format!("https://{token}") + } else { + continue; + }; + if !found.contains(&link) { + found.push(link); + } + } + found +} + +#[cfg(windows)] +fn clipboard_text() -> Result<String, String> { + use windows_sys::Win32::System::DataExchange::{ + CloseClipboard, GetClipboardData, OpenClipboard, + }; + use windows_sys::Win32::System::Memory::{GlobalLock, GlobalUnlock}; + const UNICODE_TEXT: u32 = 13; + + // Another program may hold the clipboard for a moment while it copies. + let mut opened = false; + for _ in 0..10 { + if unsafe { OpenClipboard(std::ptr::null_mut()) } != 0 { + opened = true; + break; + } + std::thread::sleep(Duration::from_millis(40)); + } + if !opened { + return Err("the clipboard is in use by another program".into()); + } + let mut text = String::new(); + unsafe { + let handle = GetClipboardData(UNICODE_TEXT); + if !handle.is_null() { + let data = GlobalLock(handle) as *const u16; + if !data.is_null() { + let mut length = 0; + while *data.add(length) != 0 { + length += 1; + } + text = String::from_utf16_lossy(std::slice::from_raw_parts(data, length)); + GlobalUnlock(handle); + } + } + CloseClipboard(); + } + Ok(text) +} + +#[cfg(not(windows))] +fn clipboard_text() -> Result<String, String> { + let readers: &[(&str, &[&str])] = if cfg!(target_os = "macos") { + &[("pbpaste", &[])] + } else { + &[ + ("wl-paste", &["--no-newline"]), + ("xclip", &["-selection", "clipboard", "-o"]), + ("xsel", &["--clipboard", "--output"]), + ] + }; + for (program, args) in readers { + if let Ok(output) = std::process::Command::new(program).args(*args).output() + && output.status.success() + { + return Ok(String::from_utf8_lossy(&output.stdout).into_owned()); + } + } + Err("no clipboard reader was found (install wl-clipboard, xclip, or xsel)".into()) +} + +fn percent_decode(value: &str) -> String { + let bytes = value.as_bytes(); + let mut decoded = Vec::with_capacity(bytes.len()); + let mut index = 0; + while index < bytes.len() { + let hex = |offset: usize| { + bytes + .get(index + offset) + .and_then(|byte| (*byte as char).to_digit(16)) + }; + match (bytes[index], hex(1), hex(2)) { + (b'%', Some(high), Some(low)) => { + decoded.push((high * 16 + low) as u8); + index += 3; + } + (byte, _, _) => { + decoded.push(byte); + index += 1; + } + } + } + String::from_utf8_lossy(&decoded).into_owned() +} + +/// Make a server-supplied name safe to create on every platform. +fn sanitize(name: &str) -> String { + let cleaned: String = name + .chars() + .map(|character| match character { + '<' | '>' | ':' | '"' | '/' | '\\' | '|' | '?' | '*' => '_', + character if character.is_control() => '_', + character => character, + }) + .collect(); + let cleaned = cleaned.trim().trim_end_matches(['.', ' ']).to_owned(); + let (stem, extension) = match cleaned.rsplit_once('.') { + Some((stem, extension)) if !stem.is_empty() && extension.len() <= 10 => { + (stem.to_owned(), format!(".{extension}")) + } + _ => (cleaned, String::new()), + }; + let stem: String = stem.chars().take(MAX_NAME_CHARS).collect(); + let reserved = [ + "con", "prn", "aux", "nul", "com1", "com2", "com3", "com4", "lpt1", "lpt2", "lpt3", + ]; + if reserved.contains(&stem.to_ascii_lowercase().as_str()) { + format!("_{stem}{extension}") + } else { + format!("{stem}{extension}") + } +} + +/// The file name a `Content-Disposition` header asks for. +fn disposition_name(header: &str) -> Option<String> { + let parameter = |key: &str| { + header.split(';').map(str::trim).find_map(|part| { + let (name, value) = part.split_once('=')?; + name.trim() + .eq_ignore_ascii_case(key) + .then(|| value.trim().trim_matches('"').to_owned()) + }) + }; + if let Some(encoded) = parameter("filename*") { + // RFC 5987: charset'language'percent-encoded-name + let value = encoded.rsplit('\'').next().unwrap_or(&encoded); + return Some(percent_decode(value)); + } + parameter("filename") +} + +fn extension_for(content_type: &str) -> Option<&'static str> { + Some(match content_type { + "image/jpeg" | "image/jpg" => "jpg", + "image/png" => "png", + "image/gif" => "gif", + "image/webp" => "webp", + "image/avif" => "avif", + "image/svg+xml" => "svg", + "image/bmp" => "bmp", + "image/tiff" => "tif", + "image/x-icon" | "image/vnd.microsoft.icon" => "ico", + "video/mp4" => "mp4", + "video/webm" => "webm", + "video/quicktime" => "mov", + "video/x-matroska" => "mkv", + "audio/mpeg" => "mp3", + "audio/mp4" | "audio/x-m4a" => "m4a", + "audio/wav" | "audio/x-wav" => "wav", + "audio/ogg" => "ogg", + "audio/flac" => "flac", + "application/pdf" => "pdf", + "application/zip" => "zip", + "application/json" => "json", + "application/gzip" => "gz", + "text/plain" => "txt", + "text/csv" => "csv", + "text/markdown" => "md", + _ => return None, + }) +} + +/// The media type without its parameters, in lowercase. +fn media_type(content_type: &str) -> String { + content_type + .split(';') + .next() + .unwrap_or_default() + .trim() + .to_ascii_lowercase() +} + +fn is_page(content_type: &str) -> bool { + matches!( + media_type(content_type).as_str(), + "text/html" | "application/xhtml+xml" + ) +} + +/// Choose the saved name: what the server asks for, else the last segment of +/// the address, else the host, with an extension from the content type when +/// the name has none. +fn file_name(url: &str, disposition: Option<&str>, content_type: &str) -> String { + let without_query = url.split(['?', '#']).next().unwrap_or(url); + let after_scheme = without_query + .split_once("://") + .map_or(without_query, |(_, rest)| rest); + let (host, path) = after_scheme.split_once('/').unwrap_or((after_scheme, "")); + let segment = path.rsplit('/').find(|segment| !segment.is_empty()); + let mut name = disposition + .and_then(disposition_name) + .or_else(|| segment.map(percent_decode)) + .map(|name| sanitize(&name)) + .filter(|name| !name.is_empty()) + .unwrap_or_else(|| sanitize(host.split(':').next().unwrap_or("download"))); + if name.is_empty() { + name = "download".into(); + } + let has_extension = name + .rsplit_once('.') + .is_some_and(|(stem, extension)| !stem.is_empty() && !extension.is_empty()); + // A host name's dots are not an extension. + let named_by_host = disposition.is_none() && segment.is_none(); + if (!has_extension || named_by_host) + && let Some(extension) = extension_for(&media_type(content_type)) + { + name = format!("{name}.{extension}"); + } + name +} + +/// A name in `directory` that is not taken, numbering like a file manager. +fn free_path(directory: &Path, name: &str) -> PathBuf { + let candidate = directory.join(name); + if !candidate.exists() { + return candidate; + } + let (stem, extension) = match name.rsplit_once('.') { + Some((stem, extension)) if !stem.is_empty() => (stem, format!(".{extension}")), + _ => (name, String::new()), + }; + (2_u32..) + .map(|number| directory.join(format!("{stem} ({number}){extension}"))) + .find(|path| !path.exists()) + .expect("an unused number always exists") +} + +fn attribute(tag: &str, name: &str) -> Option<String> { + let lower = tag.to_ascii_lowercase(); + let mut search = 0; + while let Some(found) = lower[search..].find(name) { + let start = search + found; + let rest = tag[start + name.len()..].trim_start(); + let preceded = start == 0 + || lower[..start] + .chars() + .next_back() + .is_some_and(char::is_whitespace); + if preceded && let Some(value) = rest.strip_prefix('=') { + let value = value.trim_start(); + let quote = value.chars().next()?; + return if quote == '"' || quote == '\'' { + value[1..] + .split_once(quote) + .map(|(inner, _)| inner.to_owned()) + } else { + Some( + value + .split(|character: char| character.is_whitespace() || character == '>') + .next() + .unwrap_or_default() + .to_owned(), + ) + }; + } + search = start + name.len(); + } + None +} + +/// The media a page declares for link previews, video before image. +fn declared_media(html: &str, page: &str) -> Vec<String> { + const KEYS: [&str; 7] = [ + "og:video:secure_url", + "og:video:url", + "og:video", + "twitter:player:stream", + "og:image:secure_url", + "og:image", + "twitter:image", + ]; + let mut found: Vec<(usize, String)> = Vec::new(); + let lower = html.to_ascii_lowercase(); + let mut search = 0; + while let Some(offset) = lower[search..].find("<meta") { + let start = search + offset; + let end = lower[start..] + .find('>') + .map_or(html.len(), |end| start + end); + let tag = &html[start..end]; + search = end; + let key = attribute(tag, "property").or_else(|| attribute(tag, "name")); + let (Some(key), Some(content)) = (key, attribute(tag, "content")) else { + continue; + }; + let Some(rank) = KEYS + .iter() + .position(|known| key.eq_ignore_ascii_case(known)) + else { + continue; + }; + let content = content.replace("&", "&"); + let link = if content.starts_with("//") { + format!("https:{content}") + } else if content.starts_with('/') { + let origin: String = page.splitn(4, '/').take(3).collect::<Vec<_>>().join("/"); + format!("{origin}{content}") + } else { + content + }; + if (link.starts_with("http://") || link.starts_with("https://")) + && !found.iter().any(|(_, known)| *known == link) + { + found.push((rank, link)); + } + } + found.sort_by_key(|(rank, _)| *rank); + found.into_iter().map(|(_, link)| link).collect() +} + +/// What a link answered with. +enum Answer { + Saved(PathBuf, u64), + /// A web page, with as much of it as the head is likely to need. + Page { + html: String, + url: String, + }, +} + +fn agent() -> ureq::Agent { + ureq::Agent::config_builder() + .timeout_connect(Some(Duration::from_secs(20))) + .timeout_recv_response(Some(Duration::from_secs(45))) + .user_agent(USER_AGENT) + .build() + .into() +} + +/// Fetch a link, saving it when it is a file and returning it when it is a +/// page. The body streams into a hidden temporary file beside its +/// destination, so an interrupted download leaves nothing behind. +fn retrieve(agent: &ureq::Agent, url: &str, directory: &Path) -> Result<Answer, String> { + let mut response = agent.get(url).call().map_err(|error| error.to_string())?; + let header = |name: &str| { + response + .headers() + .get(name) + .and_then(|value| value.to_str().ok()) + .map(str::to_owned) + }; + let content_type = header("content-type").unwrap_or_default(); + let disposition = header("content-disposition"); + let final_url = response.get_uri().to_string(); + if is_page(&content_type) && disposition.is_none() { + let html = response + .body_mut() + .with_config() + .limit(MAX_PAGE_BYTES) + .read_to_string() + .unwrap_or_default(); + return Ok(Answer::Page { + html, + url: final_url, + }); + } + let name = file_name(&final_url, disposition.as_deref(), &content_type); + let mut temporary = tempfile::Builder::new() + .prefix(".justpaste-") + .suffix(".part") + .tempfile_in(directory) + .map_err(|error| format!("cannot write in {}: {error}", directory.display()))?; + let mut reader = response.body_mut().as_reader(); + let mut buffer = vec![0_u8; 256 * 1024]; + let mut written = 0_u64; + loop { + if common::interrupted() { + return Err("interrupted".into()); + } + let count = reader + .read(&mut buffer) + .map_err(|error| format!("the download stopped: {error}"))?; + if count == 0 { + break; + } + temporary + .write_all(&buffer[..count]) + .map_err(|error| format!("cannot write the download: {error}"))?; + written += count as u64; + } + if written == 0 { + return Err("the server sent an empty file".into()); + } + temporary + .flush() + .map_err(|error| format!("cannot write the download: {error}"))?; + let destination = free_path(directory, &name); + temporary + .persist_noclobber(&destination) + .map_err(|error| format!("cannot save {}: {}", destination.display(), error.error))?; + Ok(Answer::Saved(destination, written)) +} + +/// yt-dlp and FFmpeg, resolved once and only when a page link needs them. +struct Downloader { + resolved: Option<Result<(PathBuf, PathBuf), String>>, +} + +impl Downloader { + fn get(&mut self) -> Result<(PathBuf, PathBuf), String> { + self.resolved + .get_or_insert_with(|| { + let downloader = + download::executable(TOOL).map_err(|error| error.message().to_owned())?; + let ffmpeg = deps::require_override(TOOL, "FFMPEG_BIN", "ffmpeg") + .map_err(|error| error.message().to_owned())?; + download::update(TOOL, &downloader); + Ok((downloader, ffmpeg)) + }) + .clone() + } +} + +/// Download a page link with yt-dlp into a hidden folder inside the +/// destination, then move the results out under unused names. +fn with_downloader( + downloader: &mut Downloader, + url: &str, + playlist: bool, + directory: &Path, +) -> Result<Vec<(PathBuf, u64)>, String> { + let (executable, ffmpeg) = downloader.get()?; + let workspace = tempfile::Builder::new() + .prefix(".justpaste-") + .tempdir_in(directory) + .map_err(|error| format!("cannot write in {}: {error}", directory.display()))?; + let fetched = download::fetch( + TOOL, + download::Kind::Original, + &executable, + &ffmpeg, + &[url.to_owned()], + playlist, + workspace.path(), + ) + .map_err(|error| error.message().to_owned())?; + let mut saved = Vec::new(); + for file in fetched { + let name = file + .file + .file_name() + .map(|name| sanitize(&name.to_string_lossy())) + .filter(|name| !name.is_empty()) + .unwrap_or_else(|| "download".into()); + let destination = free_path(directory, &name); + let size = fs::metadata(&file.file).map_or(0, |metadata| metadata.len()); + fs::rename(&file.file, &destination) + .map_err(|error| format!("cannot save {}: {error}", destination.display()))?; + saved.push((destination, size)); + } + Ok(saved) +} + +/// Bring one link into `directory` by whichever route works. +fn paste( + agent: &ureq::Agent, + downloader: &mut Downloader, + url: &str, + playlist: bool, + directory: &Path, +) -> Result<Vec<(PathBuf, u64)>, String> { + let page = match retrieve(agent, url, directory) { + Ok(Answer::Saved(path, size)) => return Ok(vec![(path, size)]), + Ok(Answer::Page { html, url }) => Some((html, url)), + // Sites that refuse a plain request often still work through yt-dlp. + Err(_) if !common::interrupted() => None, + Err(error) => return Err(error), + }; + let reason = match with_downloader(downloader, url, playlist, directory) { + Ok(saved) => return Ok(saved), + Err(reason) => reason, + }; + if let Some((html, page_url)) = &page { + let candidates = declared_media(html, page_url); + if !candidates.is_empty() { + println!("{TOOL}: yt-dlp found nothing; trying the media the page declares"); + } + for candidate in candidates { + if let Ok(Answer::Saved(path, size)) = retrieve(agent, &candidate, directory) { + return Ok(vec![(path, size)]); + } + } + } + Err(match page { + Some(_) => format!("nothing downloadable was found on that page ({reason})"), + None => format!("the link could not be fetched ({reason})"), + }) +} + +pub fn run(args: Vec<OsString>) -> ToolResult { + common::init_signals(); + let options = parse(args)?; + if options.help { + help(); + return Ok(()); + } + let mut urls = links(&options.inputs.join("\n")); + if urls.len() < options.inputs.len() { + return Err(ToolError::usage( + TOOL, + "every input must be an http(s) link", + )); + } + if options.clipboard { + let text = clipboard_text().map_err(|message| ToolError::new(TOOL, message))?; + let copied = links(&text); + if copied.is_empty() { + return Err(ToolError::new( + TOOL, + "the clipboard holds no http(s) link; copy a link and try again", + )); + } + for link in copied { + if !urls.contains(&link) { + urls.push(link); + } + } + } else if urls.is_empty() && !common::stdin_is_terminal() { + urls = links(&common::read_stdin()?); + } + if urls.is_empty() { + return Err(ToolError::usage( + TOOL, + "give a link, or use --clipboard to paste the copied one", + )); + } + let directory = match &options.output { + Some(output) => output.clone(), + None => std::env::current_dir().unwrap_or_else(|_| PathBuf::from(".")), + }; + if options.dry_run { + println!("{TOOL}: dry run — {} link(s)", urls.len()); + for url in &urls { + println!( + " {url} -> {} (the file itself, or yt-dlp for a page)", + common::display_path(&directory) + ); + } + return Ok(()); + } + fs::create_dir_all(&directory).map_err(|error| { + ToolError::new( + TOOL, + format!("cannot create {}: {error}", directory.display()), + ) + })?; + download::refresh(TOOL); + let agent = agent(); + let mut downloader = Downloader { resolved: None }; + let mut saved = 0; + let mut failed = 0; + for url in &urls { + if common::interrupted() { + break; + } + println!("{TOOL}: {url}"); + match paste(&agent, &mut downloader, url, options.playlist, &directory) { + Ok(files) => { + for (path, size) in files { + saved += 1; + println!( + " saved {} {}", + common::display_path(&path), + common::format_bytes(size) + ); + } + } + Err(reason) => { + failed += 1; + eprintln!(" failed {url}: {reason}"); + } + } + } + println!( + "{TOOL}: {saved} saved{}", + if failed > 0 { + format!(", {failed} failed") + } else { + String::new() + } + ); + if failed > 0 { + Err(ToolError::new(TOOL, "some links could not be downloaded")) + } else { + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn links_are_found_in_copied_text_without_their_wrapping() { + assert_eq!( + links( + "Watch (https://youtu.be/abc123), then <https://example.test/a.jpg>.\nwww.example.test/page https://youtu.be/abc123" + ), + [ + "https://youtu.be/abc123", + "https://example.test/a.jpg", + "https://www.example.test/page", + ] + ); + assert!(links("no links here, ftp://example.test/file").is_empty()); + } + + #[test] + fn names_come_from_the_server_then_the_address_then_the_host() { + assert_eq!( + file_name( + "https://example.test/a/b/Photo%20One.JPG?size=large", + None, + "image/jpeg" + ), + "Photo One.JPG" + ); + assert_eq!( + file_name( + "https://example.test/download?id=7", + Some("attachment; filename=\"report: final?.pdf\""), + "application/pdf" + ), + "report_ final_.pdf" + ); + assert_eq!( + file_name( + "https://example.test/get", + Some("attachment; filename*=UTF-8''na%C3%AFve%20file.txt"), + "text/plain" + ), + "naïve file.txt" + ); + assert_eq!( + file_name("https://cdn.example.test/image/12345", None, "image/webp"), + "12345.webp" + ); + assert_eq!( + file_name("https://example.test/", None, "image/png"), + "example.test.png" + ); + assert_eq!( + file_name("https://example.test/blob", None, "application/x-unknown"), + "blob" + ); + assert_eq!(sanitize("con.txt"), "_con.txt"); + assert_eq!(sanitize("trailing. "), "trailing"); + } + + #[test] + fn taken_names_are_numbered_and_never_overwritten() { + let directory = tempfile::tempdir().unwrap(); + assert_eq!( + free_path(directory.path(), "clip.mp4"), + directory.path().join("clip.mp4") + ); + fs::write(directory.path().join("clip.mp4"), b"first").unwrap(); + fs::write(directory.path().join("clip (2).mp4"), b"second").unwrap(); + assert_eq!( + free_path(directory.path(), "clip.mp4"), + directory.path().join("clip (3).mp4") + ); + fs::write(directory.path().join("README"), b"x").unwrap(); + assert_eq!( + free_path(directory.path(), "README"), + directory.path().join("README (2)") + ); + } + + #[test] + fn pages_are_recognized_and_their_declared_media_ranks_video_first() { + assert!(is_page("text/html; charset=utf-8")); + assert!(!is_page("image/jpeg")); + assert!(!is_page("")); + let html = r#"<html><head> + <meta property="og:image" content="//cdn.example.test/cover.jpg?a=1&b=2"> + <META content='/media/clip.mp4' property='og:video'> + <meta name="twitter:image" content="https://cdn.example.test/cover.jpg?a=1&b=2"> + <meta name="description" content="https://example.test/not-media"> + </head></html>"#; + assert_eq!( + declared_media(html, "https://example.test/post/1"), + [ + "https://example.test/media/clip.mp4", + "https://cdn.example.test/cover.jpg?a=1&b=2", + ] + ); + } + + #[test] + fn options_parse_and_reject_unknown_switches() { + let options = parse(vec![ + "--clipboard".into(), + "-o".into(), + "downloads".into(), + "--playlist".into(), + "https://example.test/a".into(), + ]) + .unwrap(); + assert!(options.clipboard && options.playlist); + assert_eq!(options.output, Some(PathBuf::from("downloads"))); + assert_eq!(options.inputs, ["https://example.test/a"]); + assert!(parse(vec!["--replace".into()]).is_err()); + } +} diff --git a/src/context.rs b/src/context.rs new file mode 100644 index 0000000..36e83c0 --- /dev/null +++ b/src/context.rs @@ -0,0 +1,829 @@ +//! `just context` — the Windows File Explorer context menu. +//! +//! `install`, `uninstall`, and `status` manage the registration. `run` is what +//! Explorer starts when an entry is chosen: it turns the entry's ID and the +//! selected paths into the same headless command a terminal user would type, +//! shows that command, runs it, and keeps the window readable afterwards. + +use std::ffi::OsString; +use std::io::{self, Write}; +use std::path::{Path, PathBuf}; +use std::time::{Duration, Instant}; + +use crossterm::event::{self, Event, KeyCode, KeyEventKind}; +use crossterm::style::Stylize; +use justtools_menu::{self as menu, Action, Output, Run, Tool}; + +use crate::common; +use crate::error::{ToolError, ToolResult}; + +mod package; +#[cfg(windows)] +mod register; + +/// How long a successful run stays on screen before its window closes. +const CLOSE_DELAY: Duration = Duration::from_secs(3); +/// How long a failure, or a result meant to be read, stays on screen. +const READ_DELAY: Duration = Duration::from_secs(30); +/// File arguments shown in the Headless line before it is abbreviated. +const SHOWN_INPUTS: usize = 4; + +fn help() { + println!( + r#"just context — Put JustTools in the Windows File Explorer context menu. + +Usage: + just context install [--classic] + just context uninstall + just context status + +Right-click a video, audio file, image, PDF, SVG, JSON file, document, or +folder and choose JustTools. Every entry opens a console window that shows the +equivalent Headless command, runs it, and then closes by itself; any key keeps +it open. Entries ending in "…" open the tool's console launcher instead. + +install Register the menu for the current user; no elevation is needed. + On Windows 11 the top-level menu is used when a signed + justtools-shell.msix sits beside just.exe or Developer Mode is on. + Otherwise, and on Windows 10, the menu is registered under + "Show more options". + --classic Always register under "Show more options". +uninstall Remove every registration made by install. +status Show which registration is active. + +Sources are kept unless an entry says "in place". JustWebP and JustAVIF write +beside the source and keep it. Nothing is saved between runs."# + ); +} + +fn usage(message: impl Into<String>) -> ToolError { + ToolError::usage("just", message) +} + +pub fn run(args: Vec<OsString>) -> ToolResult { + let mut args = args.into_iter(); + let command = args + .next() + .map(|value| value.to_string_lossy().into_owned()); + let rest: Vec<OsString> = args.collect(); + match command.as_deref() { + None | Some("-h" | "--help" | "help") => { + help(); + Ok(()) + } + Some("run") => run_entry(rest), + Some("package") => write_package(rest), + Some("install") => { + let classic = match rest.as_slice() { + [] => false, + [flag] if flag == "--classic" => true, + _ => return Err(usage("context install accepts only --classic")), + }; + install(classic) + } + Some(name @ ("uninstall" | "status" | "refresh")) => { + if !rest.is_empty() { + return Err(usage(format!("context {name} does not take arguments"))); + } + match name { + "status" => status(), + "uninstall" => uninstall(), + _ => refresh(), + } + } + Some(other) => Err(usage(format!("unknown context command: {other}"))), + } +} + +/// Write the package layout a release signs: `just context package --output +/// DIR [--publisher SUBJECT]`. The publisher must equal the certificate's +/// subject, so the release workflow supplies it. +fn write_package(args: Vec<OsString>) -> ToolResult { + let mut output = None; + let mut publisher = package::DEFAULT_PUBLISHER.to_owned(); + let mut index = 0; + while index < args.len() { + match args[index].to_string_lossy().as_ref() { + "-o" | "--output" => { + index += 1; + output = args.get(index).map(PathBuf::from); + } + "--publisher" => { + publisher = common::option_value("just", &args, &mut index, "--publisher")?; + } + other => return Err(usage(format!("unknown context package option: {other}"))), + } + index += 1; + } + let output = output.ok_or_else(|| usage("context package needs --output DIR"))?; + package::write_layout(&output, &publisher)?; + println!( + "just: wrote the context-menu package layout to {}", + output.display() + ); + Ok(()) +} + +#[cfg(not(windows))] +fn windows_only() -> ToolError { + ToolError::new( + "just", + "the context menu is a Windows File Explorer feature", + ) +} + +#[cfg(not(windows))] +fn install(_classic: bool) -> ToolResult { + Err(windows_only()) +} + +#[cfg(not(windows))] +fn uninstall() -> ToolResult { + Err(windows_only()) +} + +#[cfg(not(windows))] +fn status() -> ToolResult { + Err(windows_only()) +} + +#[cfg(windows)] +const TOP_LEVEL_HINT: &str = "For the top-level Windows 11 menu, turn on Developer Mode (Settings > System > For developers) and run `just context install` again."; + +#[cfg(windows)] +fn install(classic: bool) -> ToolResult { + let (tier, reason) = register::install(classic)?; + match tier { + register::Tier::Package => { + println!("just: JustTools is in the Windows 11 context menu."); + } + register::Tier::Classic => { + let status = register::status()?; + if status.windows_11 { + println!( + "just: JustTools is in the context menu under \"Show more options\" (or Shift+right-click)." + ); + } else { + println!("just: JustTools is in the context menu."); + } + if let Some(reason) = reason { + println!("just: {reason}."); + if status.windows_11 && !status.developer_mode && !status.signed_package { + println!("just: {TOP_LEVEL_HINT}"); + } + } + } + } + println!("just: right-click a video, image, PDF, or folder to use it."); + Ok(()) +} + +#[cfg(windows)] +fn uninstall() -> ToolResult { + register::uninstall()?; + println!("just: JustTools was removed from the context menu."); + Ok(()) +} + +#[cfg(windows)] +fn status() -> ToolResult { + let status = register::status()?; + match (&status.package, status.classic) { + (Some(version), _) => { + println!("Context menu: installed in the Windows 11 menu (package {version})") + } + (None, true) if status.windows_11 => { + println!("Context menu: installed under \"Show more options\"") + } + (None, true) => println!("Context menu: installed"), + (None, false) => println!("Context menu: not installed (run `just context install`)"), + } + if let Some(owner) = status.owner.as_deref().filter(|_| !status.owned) { + println!( + "Registered by: {} (another JustTools copy)", + owner.display() + ); + } + println!( + "Extension: {}{}", + status.library.display(), + if status.library.is_file() { + "" + } else { + " (missing)" + } + ); + if status.windows_11 { + println!( + "Top-level: {}", + if status.signed_package { + "available (signed package present)" + } else if status.developer_mode { + "available (Developer Mode is on)" + } else { + "needs a signed justtools-shell.msix or Developer Mode" + } + ); + } + Ok(()) +} + +/// Re-register a menu that is already installed so it matches the build now +/// on disk; a menu that was never installed stays absent. `just install` runs +/// this after replacing the files. +#[cfg(windows)] +fn refresh() -> ToolResult { + match register::ownership()? { + None => { + if register::library_present() { + println!( + "just: add the File Explorer right-click menu with `just context install`." + ); + } + return Ok(()); + } + // Another copy of JustTools registered the menu; it is not ours to move. + Some(false) => return Ok(()), + Some(true) => {} + } + let status = register::status()?; + if status.package.is_none() && !status.classic { + return Ok(()); + } + if !status.library.is_file() { + // The new build ships no extension, so the old entry would point at + // nothing. + register::uninstall()?; + println!("just: removed the File Explorer context menu; this build has no extension."); + return Ok(()); + } + register::install(status.package.is_none())?; + println!("just: refreshed the File Explorer context menu."); + Ok(()) +} + +#[cfg(not(windows))] +fn refresh() -> ToolResult { + Ok(()) +} + +/// One headless run of a tool. +#[derive(Clone, Debug, Eq, PartialEq)] +struct Invocation { + directory: PathBuf, + args: Vec<OsString>, +} + +fn parent_of(path: &Path) -> PathBuf { + path.parent() + .filter(|parent| !parent.as_os_str().is_empty()) + .map_or_else(|| PathBuf::from("."), Path::to_path_buf) +} + +/// A path as the tool should receive it when running inside `directory`. +/// +/// Files in that folder go by name, which keeps the tool's own progress lines +/// short; a name that could be mistaken for an option is anchored with `.`. +fn argument(path: &Path, directory: &Path) -> OsString { + match path.file_name() { + Some(name) if parent_of(path) == directory => { + if name.to_string_lossy().starts_with('-') { + Path::new(".").join(name).into_os_string() + } else { + name.to_owned() + } + } + _ => path.as_os_str().to_owned(), + } +} + +/// Group paths by parent folder, keeping first-seen order. +fn by_folder(paths: &[PathBuf]) -> Vec<(PathBuf, Vec<PathBuf>)> { + let mut groups: Vec<(PathBuf, Vec<PathBuf>)> = Vec::new(); + for path in paths { + let parent = parent_of(path); + match groups.iter_mut().find(|(folder, _)| *folder == parent) { + Some((_, files)) => files.push(path.clone()), + None => groups.push((parent, vec![path.clone()])), + } + } + groups +} + +fn accepted(tool: Tool, paths: &[PathBuf]) -> Vec<PathBuf> { + paths + .iter() + .filter(|path| { + if matches!(tool, Tool::Zip | Tool::Paste) { + path.is_dir() + } else { + menu::extension(&path.to_string_lossy()) + .is_some_and(|extension| tool.accepts(&extension)) + } + }) + .cloned() + .collect() +} + +/// Turn a headless entry and the selection into the runs it stands for. +fn plan(action: &Action, tool: Tool, paths: &[PathBuf]) -> Result<Vec<Invocation>, String> { + let inputs = accepted(tool, paths); + if inputs.len() < action.minimum.max(1) as usize { + return Err(if inputs.is_empty() { + format!( + "nothing in the selection is something {} reads", + tool.name() + ) + } else { + format!( + "{} needs at least {} files here", + tool.name(), + action.minimum + ) + }); + } + let preset = || action.args.iter().map(OsString::from); + let invocation = |directory: &Path, files: &[PathBuf], output: bool| Invocation { + directory: directory.to_path_buf(), + args: preset() + .chain( + output + .then(|| ["--output", "."].map(OsString::from)) + .into_iter() + .flatten(), + ) + .chain(files.iter().map(|file| argument(file, directory))) + .collect(), + }; + if tool == Tool::Paste { + // The folder is where the download lands, not something to read. + return Ok(inputs + .iter() + .map(|folder| Invocation { + directory: folder.clone(), + args: preset().collect(), + }) + .collect()); + } + Ok(if action.per_file || tool == Tool::Zip { + inputs + .iter() + .map(|file| invocation(&parent_of(file), std::slice::from_ref(file), false)) + .collect() + } else if action.output == Output::SourceFolder { + by_folder(&inputs) + .iter() + .map(|(folder, files)| invocation(folder, files, true)) + .collect() + } else { + vec![invocation(&parent_of(&inputs[0]), &inputs, false)] + }) +} + +/// The command as a terminal user would type it, abbreviated once the file +/// list stops being readable. +fn headless_line(tool: Tool, action: &Action, invocation: &Invocation) -> String { + let fixed = invocation.args.len().min( + action.args.len() + + if action.output == Output::SourceFolder { + 2 + } else { + 0 + }, + ); + let (options, inputs) = invocation.args.split_at(fixed); + let mut parts = vec![tool.command().to_owned()]; + parts.extend( + options + .iter() + .chain(inputs.iter().take(SHOWN_INPUTS)) + .map(|value| crate::launcher::quote(&value.to_string_lossy())), + ); + if inputs.len() > SHOWN_INPUTS { + parts.push(format!("… (+{} more)", inputs.len() - SHOWN_INPUTS)); + } + parts.join(" ") +} + +fn interactive() -> bool { + common::stdin_is_terminal() && common::stdout_is_terminal() +} + +fn set_title(title: &str) { + if interactive() { + crossterm::execute!(io::stdout(), crossterm::terminal::SetTitle(title)).ok(); + } +} + +fn enter(directory: &Path) -> ToolResult { + std::env::set_current_dir(directory).map_err(|error| { + ToolError::new( + "just", + format!("cannot open {}: {error}", directory.display()), + ) + }) +} + +/// What a finished entry leaves for the window to do. +enum Outcome { + /// Nothing ran, or a full-screen console already had the last word. + Closed, + Ran { + failed: bool, + }, +} + +fn report(error: &ToolError) { + eprintln!("{}: {}", error.tool(), error.message()); +} + +fn run_headless(action: &Action, tool: Tool, paths: &[PathBuf]) -> ToolResult<Outcome> { + let invocations = + plan(action, tool, paths).map_err(|message| ToolError::new("just", message))?; + set_title(&format!("JustTools · {}", tool.name())); + let mut failed = false; + let mut cancelled = 0; + for (index, invocation) in invocations.iter().enumerate() { + if index > 0 { + println!(); + } + let command = headless_line(tool, action, invocation); + let folder = invocation.directory.display(); + if interactive() { + println!("{} {}", "Headless:".dark_grey(), command.magenta().bold()); + println!( + "{} {folder} +", + "Folder: ".dark_grey() + ); + } else { + println!( + "Headless: {command} +Folder: {folder} +" + ); + } + enter(&invocation.directory)?; + match crate::commands::dispatch_headless(tool.command(), invocation.args.clone()) { + Ok(()) => {} + Err(error) if error.exit_code() == 130 => cancelled += 1, + Err(error) => { + report(&error); + failed = true; + } + } + } + Ok(if !failed && cancelled == invocations.len() { + Outcome::Closed + } else { + Outcome::Ran { failed } + }) +} + +/// Run what a launcher or the tool browser configured. +fn run_configured(command: &str, args: Option<Vec<OsString>>) -> Outcome { + let Some(args) = args else { + return Outcome::Closed; + }; + match crate::commands::dispatch_headless(command, args) { + Ok(()) => Outcome::Ran { failed: false }, + Err(error) if error.exit_code() == 130 => Outcome::Closed, + Err(error) => { + report(&error); + Outcome::Ran { failed: true } + } + } +} + +fn needs_terminal() -> ToolError { + ToolError::new( + "just", + "this context-menu entry opens a console and needs a terminal", + ) +} + +fn folder_of(paths: &[PathBuf]) -> PathBuf { + match paths.first() { + Some(path) if path.is_dir() => path.clone(), + Some(path) => parent_of(path), + None => PathBuf::from("."), + } +} + +/// The launcher's input row for a selection: names inside the working folder, +/// quoted wherever the row's `;` separator or quote handling would split them. +fn launcher_inputs(paths: &[PathBuf], directory: &Path) -> String { + paths + .iter() + .map(|path| { + let text = argument(path, directory).to_string_lossy().into_owned(); + if text.contains([';', '\'', ' ']) { + format!("\"{text}\"") + } else { + text + } + }) + .collect::<Vec<_>>() + .join("; ") +} + +fn perform(action: &Action, paths: &[PathBuf]) -> ToolResult<Outcome> { + let Some(tool) = action.tool else { + if !interactive() { + return Err(needs_terminal()); + } + enter(&folder_of(paths))?; + set_title("JustTools"); + let Some(command) = crate::selector::pick()? else { + return Ok(Outcome::Closed); + }; + if !crate::launcher::supports(command) { + // Live dashboards own the screen until they exit. + crate::commands::dispatch(command, Vec::new())?; + return Ok(Outcome::Closed); + } + return Ok(run_configured(command, crate::launcher::run(command)?)); + }; + match action.run { + Run::Headless => run_headless(action, tool, paths), + Run::Launcher | Run::LauncherHere => { + if !interactive() { + return Err(needs_terminal()); + } + let directory = folder_of(paths); + enter(&directory)?; + set_title(&format!("JustTools · {}", tool.name())); + let configured = if action.run == Run::Launcher { + let inputs = launcher_inputs(&accepted(tool, paths), &directory); + crate::launcher::run_with_input(tool.command(), &inputs)? + } else { + crate::launcher::run(tool.command())? + }; + Ok(run_configured(tool.command(), configured)) + } + Run::Browse => unreachable!("browse entries carry no tool"), + } +} + +fn read_list(path: &Path) -> ToolResult<Vec<PathBuf>> { + let text = std::fs::read_to_string(path).map_err(|error| { + ToolError::new( + "just", + format!("cannot read the selection {}: {error}", path.display()), + ) + })?; + Ok(text + .trim_start_matches('\u{feff}') + .lines() + .map(|line| line.trim_end_matches('\r')) + .filter(|line| !line.is_empty()) + .map(PathBuf::from) + .collect()) +} + +/// `just context run <entry> [--list FILE] [path ...]` +fn run_entry(args: Vec<OsString>) -> ToolResult { + let mut id = None; + let mut list = None; + let mut paths = Vec::new(); + let mut index = 0; + while index < args.len() { + if args[index] == "--list" { + index += 1; + list = Some( + args.get(index) + .map(PathBuf::from) + .ok_or_else(|| usage("--list needs a file"))?, + ); + } else if id.is_none() { + id = Some(args[index].to_string_lossy().into_owned()); + } else { + paths.push(PathBuf::from(&args[index])); + } + index += 1; + } + let id = id.ok_or_else(|| usage("context run needs a menu entry"))?; + if let Some(list) = list { + let listed = read_list(&list); + // The list is a one-run handover from Explorer, not user data. + std::fs::remove_file(&list).ok(); + paths.extend(listed?); + } + let action = + menu::action(&id).ok_or_else(|| usage(format!("unknown context-menu entry: {id}")))?; + let outcome = perform(&action, &paths); + if !interactive() { + return match outcome? { + Outcome::Ran { failed: true } => { + Err(ToolError::new("just", "the context-menu entry failed")) + } + _ => Ok(()), + }; + } + let failed = match outcome { + Ok(Outcome::Closed) => return Ok(()), + Ok(Outcome::Ran { failed }) => failed, + Err(error) if error.exit_code() == 130 => return Ok(()), + Err(error) => { + report(&error); + true + } + }; + hold(failed, action.hold); + // The failure has been shown and acknowledged. A nonzero exit status + // would only make Windows Terminal keep the finished tab open. + Ok(()) +} + +fn key_pressed(timeout: Duration) -> Option<KeyCode> { + if !event::poll(timeout).unwrap_or(false) { + return None; + } + match event::read() { + Ok(Event::Key(key)) if key.kind == KeyEventKind::Press => Some(key.code), + _ => None, + } +} + +fn closes(key: KeyCode) -> bool { + matches!(key, KeyCode::Enter | KeyCode::Esc | KeyCode::Char('q')) +} + +/// Keep the result readable, then close the window without being asked. +/// +/// A plain success closes after a moment. A failure, or a result meant to be +/// read, gets longer. Enter closes at once and any other key stops the +/// countdown, so nothing disappears while it is being read. +fn hold(failed: bool, keep: bool) { + let mut out = io::stdout(); + if crossterm::terminal::enable_raw_mode().is_err() { + return; + } + let verdict = if failed { + "Finished with errors.".red().bold() + } else { + "Done.".green().bold() + }; + let delay = if failed || keep { + READ_DELAY + } else { + CLOSE_DELAY + }; + let deadline = Instant::now() + delay; + let mut pinned = false; + write!(out, "\r\n").ok(); + loop { + let left = deadline.saturating_duration_since(Instant::now()); + if left.is_zero() { + break; + } + let hint = format!( + "Closing in {} s · Enter closes now · any other key keeps this window open", + left.as_secs() + 1 + ); + write!(out, "\r{verdict} {} ", hint.dark_grey()).ok(); + out.flush().ok(); + match key_pressed(left.min(Duration::from_millis(200))) { + Some(key) if closes(key) => break, + Some(_) => { + pinned = true; + break; + } + None => {} + } + } + if pinned { + let hint = format!("Press Enter to close this window.{:44}", ""); + write!(out, "\r{verdict} {}", hint.dark_grey()).ok(); + out.flush().ok(); + while !key_pressed(Duration::from_secs(3600)).is_some_and(closes) {} + } + crossterm::terminal::disable_raw_mode().ok(); + writeln!(out).ok(); +} + +#[cfg(test)] +mod tests { + use super::*; + + fn strings(invocation: &Invocation) -> Vec<String> { + invocation + .args + .iter() + .map(|value| value.to_string_lossy().into_owned()) + .collect() + } + + fn paths(values: &[&str]) -> Vec<PathBuf> { + values.iter().map(PathBuf::from).collect() + } + + fn planned(id: &str, values: &[&str]) -> Vec<Invocation> { + let action = menu::action(id).unwrap(); + plan(&action, action.tool.unwrap(), &paths(values)).unwrap() + } + + #[test] + fn a_resolution_entry_becomes_one_run_named_from_the_source_folder() { + let runs = planned( + "video.1080", + &["clips/a.mov", "clips/b.mp4", "clips/notes.txt"], + ); + assert_eq!(runs.len(), 1); + assert_eq!(runs[0].directory, PathBuf::from("clips")); + assert_eq!( + strings(&runs[0]), + ["--resolution", "1080p", "a.mov", "b.mp4"] + ); + let action = menu::action("video.1080").unwrap(); + assert_eq!( + headless_line(Tool::Video, &action, &runs[0]), + "justvideo --resolution 1080p a.mov b.mp4" + ); + } + + #[test] + fn source_consuming_converters_write_beside_each_source_and_keep_it() { + let runs = planned("webp", &["one/a.png", "two/b.jpg", "one/c.png"]); + assert_eq!(runs.len(), 2); + assert_eq!(runs[0].directory, PathBuf::from("one")); + assert_eq!(strings(&runs[0]), ["--output", ".", "a.png", "c.png"]); + assert_eq!(runs[1].directory, PathBuf::from("two")); + assert_eq!(strings(&runs[1]), ["--output", ".", "b.jpg"]); + } + + #[test] + fn single_input_operations_run_once_per_file_and_merge_runs_once() { + let split = planned("pdf.split", &["docs/a.pdf", "docs/b.pdf"]); + assert_eq!(split.len(), 2); + assert_eq!(strings(&split[1]), ["split", "b.pdf"]); + let merge = planned("pdf.merge", &["docs/a.pdf", "docs/b.pdf"]); + assert_eq!(merge.len(), 1); + assert_eq!(strings(&merge[0]), ["merge", "a.pdf", "b.pdf"]); + + let action = menu::action("pdf.merge").unwrap(); + let error = plan(&action, Tool::Pdf, &paths(&["docs/a.pdf"])).unwrap_err(); + assert!(error.contains("at least 2")); + } + + #[test] + fn pasting_runs_inside_the_folder_that_was_clicked() { + let folder = tempfile::tempdir().unwrap(); + let action = menu::action("paste").unwrap(); + let runs = plan(&action, Tool::Paste, &[folder.path().to_path_buf()]).unwrap(); + assert_eq!(runs.len(), 1); + assert_eq!(runs[0].directory, folder.path()); + assert_eq!(strings(&runs[0]), ["--clipboard"]); + assert_eq!( + headless_line(Tool::Paste, &action, &runs[0]), + "justpaste --clipboard" + ); + } + + #[test] + fn option_like_names_are_anchored_and_other_folders_stay_absolute() { + let runs = planned("mp3", &["music/-intro.wav", "other/b.flac"]); + let args = strings(&runs[0]); + assert_eq!(PathBuf::from(&args[0]), Path::new(".").join("-intro.wav")); + assert_eq!(PathBuf::from(&args[1]), PathBuf::from("other/b.flac")); + } + + #[test] + fn unreadable_selections_are_refused_and_long_ones_are_abbreviated() { + let action = menu::action("optimize").unwrap(); + let error = plan(&action, Tool::Optimize, &paths(&["a.mp4"])).unwrap_err(); + assert!(error.contains("JustOptimize")); + + let many: Vec<String> = (0..9).map(|index| format!("p/{index}.png")).collect(); + let many: Vec<&str> = many.iter().map(String::as_str).collect(); + let runs = planned("resize.2560", &many); + assert_eq!( + headless_line( + Tool::Resize, + &menu::action("resize.2560").unwrap(), + &runs[0] + ), + "justresize --max 2560 0.png 1.png 2.png 3.png … (+5 more)" + ); + } + + #[test] + fn launcher_input_quotes_names_the_row_would_split() { + let row = launcher_inputs( + &paths(&["clips/plain.mov", "clips/my clip.mov", "clips/a;b.mov"]), + Path::new("clips"), + ); + assert_eq!(row, r#"plain.mov; "my clip.mov"; "a;b.mov""#); + } + + #[test] + fn selection_lists_ignore_blank_lines_and_a_byte_order_mark() { + let directory = tempfile::tempdir().unwrap(); + let list = directory.path().join("list.txt"); + std::fs::write(&list, "\u{feff}C:\\a b\\one.png\r\n\r\nC:\\two.png\n").unwrap(); + assert_eq!( + read_list(&list).unwrap(), + paths(&["C:\\a b\\one.png", "C:\\two.png"]) + ); + } +} diff --git a/src/context/package.rs b/src/context/package.rs new file mode 100644 index 0000000..b7f2257 --- /dev/null +++ b/src/context/package.rs @@ -0,0 +1,177 @@ +//! The package identity that puts JustTools in the Windows 11 context menu. +//! +//! Windows 11 only shows entries in its top-level menu for apps that have a +//! package identity. JustTools stays a portable folder, so it registers a +//! "sparse" package: a manifest plus logos that point back at the installed +//! folder as their external location. + +use std::fs; +use std::path::Path; + +use justtools_menu as menu; + +use crate::error::{ToolError, ToolResult}; + +pub const NAME: &str = "JustGains.JustTools"; +/// The subject used when no signing certificate dictates one. +pub const DEFAULT_PUBLISHER: &str = "CN=JustGains"; +pub const MANIFEST: &str = "AppxManifest.xml"; + +const LOGOS: [(&str, &[u8]); 3] = [ + ( + "logo-44.png", + include_bytes!("../../explorer/icons/logo-44.png"), + ), + ( + "logo-150.png", + include_bytes!("../../explorer/icons/logo-150.png"), + ), + ( + "logo-store.png", + include_bytes!("../../explorer/icons/logo-store.png"), + ), +]; + +fn architecture() -> &'static str { + if cfg!(target_arch = "aarch64") { + "arm64" + } else if cfg!(target_arch = "x86") { + "x86" + } else { + "x64" + } +} + +fn escape(value: &str) -> String { + value + .replace('&', "&") + .replace('"', """) + .replace('<', "<") + .replace('>', ">") +} + +/// Every Explorer item type the menu attaches to. +pub fn item_types() -> Vec<String> { + let mut types = vec!["Directory".to_owned(), r"Directory\Background".to_owned()]; + types.extend( + menu::extensions() + .into_iter() + .map(|extension| format!(".{extension}")), + ); + types +} + +/// The package manifest for this build, signed or registered as `publisher`. +pub fn manifest(publisher: &str) -> String { + let class = menu::CLASS_ID; + let version = format!("{}.0", env!("CARGO_PKG_VERSION")); + let verbs: String = item_types() + .iter() + .map(|kind| { + format!( + " <desktop5:ItemType Type=\"{}\">\n <desktop5:Verb Id=\"JustTools\" Clsid=\"{class}\" />\n </desktop5:ItemType>\n", + escape(kind) + ) + }) + .collect(); + format!( + r#"<?xml version="1.0" encoding="utf-8"?> +<Package + xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" + xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" + xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10" + xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" + xmlns:desktop4="http://schemas.microsoft.com/appx/manifest/desktop/windows10/4" + xmlns:desktop5="http://schemas.microsoft.com/appx/manifest/desktop/windows10/5" + xmlns:com="http://schemas.microsoft.com/appx/manifest/com/windows10" + IgnorableNamespaces="uap uap10 rescap desktop4 desktop5 com"> + <Identity Name="{NAME}" Publisher="{publisher}" Version="{version}" ProcessorArchitecture="{architecture}" /> + <Properties> + <DisplayName>JustTools</DisplayName> + <PublisherDisplayName>JustGains</PublisherDisplayName> + <Logo>Assets\logo-store.png</Logo> + <uap10:AllowExternalContent>true</uap10:AllowExternalContent> + </Properties> + <Resources> + <Resource Language="en-us" /> + </Resources> + <Dependencies> + <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.22000.0" MaxVersionTested="10.0.26100.0" /> + </Dependencies> + <Capabilities> + <rescap:Capability Name="runFullTrust" /> + <rescap:Capability Name="unvirtualizedResources" /> + </Capabilities> + <Applications> + <Application Id="JustTools" Executable="just.exe" uap10:TrustLevel="mediumIL" uap10:RuntimeBehavior="win32App"> + <uap:VisualElements AppListEntry="none" DisplayName="JustTools" Description="JustTools File Explorer context menu" BackgroundColor="transparent" Square150x150Logo="Assets\logo-150.png" Square44x44Logo="Assets\logo-44.png" /> + <Extensions> + <desktop4:Extension Category="windows.fileExplorerContextMenus"> + <desktop4:FileExplorerContextMenus> +{verbs} </desktop4:FileExplorerContextMenus> + </desktop4:Extension> + <com:Extension Category="windows.comServer"> + <com:ComServer> + <com:SurrogateServer DisplayName="JustTools context menu"> + <com:Class Id="{class}" Path="{library}" ThreadingModel="STA" /> + </com:SurrogateServer> + </com:ComServer> + </com:Extension> + </Extensions> + </Application> + </Applications> +</Package> +"#, + publisher = escape(publisher), + architecture = architecture(), + library = menu::SHELL_LIBRARY, + ) +} + +/// Write the manifest and its logos as the layout `makeappx pack` and +/// `Add-AppxPackage -Register` both read. +pub fn write_layout(directory: &Path, publisher: &str) -> ToolResult { + let failed = |path: &Path, error: std::io::Error| { + ToolError::new("just", format!("cannot write {}: {error}", path.display())) + }; + let assets = directory.join("Assets"); + fs::create_dir_all(&assets).map_err(|error| failed(&assets, error))?; + for (name, bytes) in LOGOS { + let path = assets.join(name); + fs::write(&path, bytes).map_err(|error| failed(&path, error))?; + } + let path = directory.join(MANIFEST); + fs::write(&path, manifest(publisher)).map_err(|error| failed(&path, error)) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn manifest_registers_every_item_type_for_the_shared_class() { + let manifest = manifest("CN=Example & Co"); + assert!(manifest.contains(r#"Publisher="CN=Example & Co""#)); + assert!(manifest.contains(&format!(r#"Version="{}.0""#, env!("CARGO_PKG_VERSION")))); + assert!(manifest.contains(r#"<desktop5:ItemType Type=".mp4">"#)); + assert!(manifest.contains(r#"<desktop5:ItemType Type="Directory\Background">"#)); + assert!(!manifest.contains(r#"Type=".ts""#)); + assert_eq!( + manifest.matches(menu::CLASS_ID).count(), + item_types().len() + 1 + ); + assert!(manifest.contains(r#"Path="justtools_shell.dll""#)); + } + + #[test] + fn layout_holds_the_manifest_and_every_logo_it_names() { + let directory = tempfile::tempdir().unwrap(); + write_layout(directory.path(), DEFAULT_PUBLISHER).unwrap(); + let manifest = fs::read_to_string(directory.path().join(MANIFEST)).unwrap(); + for (name, _) in LOGOS { + assert!(manifest.contains(&format!(r"Assets\{name}"))); + let logo = fs::read(directory.path().join("Assets").join(name)).unwrap(); + assert!(logo.starts_with(b"\x89PNG")); + } + } +} diff --git a/src/context/register.rs b/src/context/register.rs new file mode 100644 index 0000000..90de095 --- /dev/null +++ b/src/context/register.rs @@ -0,0 +1,382 @@ +//! Adding and removing the File Explorer entry on Windows. +//! +//! Two registrations exist, and at most one is active: +//! +//! * **Package** — a sparse package identity, which is the only way into the +//! top-level Windows 11 menu. It needs either a signed `justtools-shell.msix` +//! beside `just.exe` or Developer Mode for an unsigned registration. +//! * **Classic** — per-user registry verbs, which need nothing but appear +//! under "Show more options" on Windows 11. +//! +//! Both are per-user, need no elevation, and are fully undone by `uninstall`. + +use std::io::ErrorKind; +use std::path::{Path, PathBuf}; +use std::process::Command; + +use justtools_menu as menu; +use winreg::RegKey; +use winreg::enums::{HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE}; + +use super::package; +use crate::error::{ToolError, ToolResult}; + +const VERB: &str = "JustTools"; +const CLASSES: &str = r"Software\Classes"; +/// The signed package a release ships beside `just.exe`. +const SIGNED_PACKAGE: &str = "justtools-shell.msix"; +/// Where an unsigned Developer Mode registration keeps its manifest. +const LAYOUT_DIRECTORY: &str = "context-menu"; +const WINDOWS_11_BUILD: u32 = 22_000; +/// Where the folder that owns the registration is remembered, so another +/// copy of JustTools never refreshes or removes a menu it did not install. +const STATE_KEY: &str = r"Software\JustGains\JustTools"; +const STATE_VALUE: &str = "ContextMenuDirectory"; + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum Tier { + Package, + Classic, +} + +pub struct Status { + /// The registered package version, when the package is present. + pub package: Option<String>, + pub classic: bool, + /// The JustTools folder the active registration points at. + pub owner: Option<PathBuf>, + /// Whether that folder is the one this executable runs from. + pub owned: bool, + pub library: PathBuf, + pub windows_11: bool, + pub developer_mode: bool, + pub signed_package: bool, +} + +fn error(message: impl Into<String>) -> ToolError { + ToolError::new("just", message) +} + +fn class_key() -> String { + format!(r"{CLASSES}\CLSID\{{{}}}", menu::CLASS_ID) +} + +fn verb_parent(item_type: &str) -> String { + if item_type.starts_with('.') { + format!(r"{CLASSES}\SystemFileAssociations\{item_type}\shell") + } else { + format!(r"{CLASSES}\{item_type}\shell") + } +} + +fn bin_directory() -> ToolResult<PathBuf> { + let executable = std::env::current_exe() + .map_err(|error| self::error(format!("cannot locate just.exe: {error}")))?; + executable + .parent() + .map(Path::to_path_buf) + .ok_or_else(|| error("cannot locate the JustTools folder")) +} + +fn windows_build() -> u32 { + RegKey::predef(HKEY_LOCAL_MACHINE) + .open_subkey(r"SOFTWARE\Microsoft\Windows NT\CurrentVersion") + .and_then(|key| key.get_value::<String, _>("CurrentBuildNumber")) + .ok() + .and_then(|build| build.parse().ok()) + .unwrap_or(0) +} + +fn developer_mode() -> bool { + RegKey::predef(HKEY_LOCAL_MACHINE) + .open_subkey(r"SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock") + .and_then(|key| key.get_value::<u32, _>("AllowDevelopmentWithoutDevLicense")) + .is_ok_and(|value| value == 1) +} + +fn quote(path: &Path) -> String { + format!("'{}'", path.to_string_lossy().replace('\'', "''")) +} + +/// Run a Windows PowerShell script, returning its trimmed output or its error. +/// +/// Windows PowerShell 5.1 ships with every supported Windows and carries the +/// Appx cmdlets; PowerShell 7 only reaches them through a compatibility shim. +fn powershell(script: &str) -> Result<String, String> { + let root = std::env::var_os("SystemRoot").unwrap_or_else(|| r"C:\Windows".into()); + let shell = Path::new(&root).join(r"System32\WindowsPowerShell\v1.0\powershell.exe"); + let output = Command::new(shell) + .args([ + "-NoProfile", + "-NonInteractive", + "-ExecutionPolicy", + "Bypass", + "-Command", + ]) + .arg(format!( + "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue'; {script}" + )) + .output() + .map_err(|error| format!("cannot run Windows PowerShell: {error}"))?; + let text = |bytes: &[u8]| String::from_utf8_lossy(bytes).trim().to_owned(); + if output.status.success() { + Ok(text(&output.stdout)) + } else { + let message = text(&output.stderr); + // The first line names the failure; the rest is PowerShell's position + // and category detail. + Err(message + .lines() + .map(str::trim) + .find(|line| !line.is_empty()) + .unwrap_or("Windows PowerShell reported a failure") + .to_owned()) + } +} + +fn package_version() -> Option<String> { + powershell(&format!( + "(Get-AppxPackage -Name '{}').Version", + package::NAME + )) + .ok() + .filter(|version| !version.is_empty()) +} + +fn classic_registered() -> bool { + RegKey::predef(HKEY_CURRENT_USER) + .open_subkey(class_key()) + .is_ok() +} + +fn owner() -> Option<PathBuf> { + RegKey::predef(HKEY_CURRENT_USER) + .open_subkey(STATE_KEY) + .and_then(|key| key.get_value::<String, _>(STATE_VALUE)) + .ok() + .filter(|directory| !directory.is_empty()) + .map(PathBuf::from) +} + +fn remember_owner(bin: &Path) -> std::io::Result<()> { + let (key, _) = RegKey::predef(HKEY_CURRENT_USER).create_subkey(STATE_KEY)?; + key.set_value(STATE_VALUE, &bin.to_string_lossy().as_ref()) +} + +fn forget_owner() -> std::io::Result<()> { + let hkcu = RegKey::predef(HKEY_CURRENT_USER); + if let Ok(key) = hkcu.open_subkey_with_flags(STATE_KEY, winreg::enums::KEY_SET_VALUE) { + ignore_missing(key.delete_value(STATE_VALUE))?; + } + Ok(()) +} + +/// Whether the registration, if any, belongs to this copy of JustTools. +/// `None` means this user has no JustTools menu at all. Unlike [`status`], +/// this reads only the registry, so it is cheap enough for every install. +pub fn ownership() -> ToolResult<Option<bool>> { + let bin = bin_directory()?; + Ok(owner().map(|owner| crate::common::same_path(&owner, &bin))) +} + +pub fn library_present() -> bool { + bin_directory().is_ok_and(|bin| bin.join(menu::SHELL_LIBRARY).is_file()) +} + +pub fn status() -> ToolResult<Status> { + let bin = bin_directory()?; + let owner = owner(); + Ok(Status { + package: package_version(), + classic: classic_registered(), + owned: owner + .as_deref() + .is_some_and(|owner| crate::common::same_path(owner, &bin)), + owner, + library: bin.join(menu::SHELL_LIBRARY), + windows_11: windows_build() >= WINDOWS_11_BUILD, + developer_mode: developer_mode(), + signed_package: bin.join(SIGNED_PACKAGE).is_file(), + }) +} + +fn notify_shell() { + use windows_sys::Win32::UI::Shell::{SHCNE_ASSOCCHANGED, SHCNF_IDLIST, SHChangeNotify}; + // Explorer caches verbs per file type until it is told they changed. + unsafe { + SHChangeNotify( + SHCNE_ASSOCCHANGED as i32, + SHCNF_IDLIST, + std::ptr::null(), + std::ptr::null(), + ); + } +} + +fn remove_package() -> Result<(), String> { + powershell(&format!( + "Get-AppxPackage -Name '{}' | Remove-AppxPackage", + package::NAME + )) + .map(drop) +} + +fn register_package(bin: &Path) -> Result<(), String> { + // A signed package and a Developer Mode registration cannot replace each + // other in place, so any earlier registration is removed first. + remove_package()?; + let signed = bin.join(SIGNED_PACKAGE); + if signed.is_file() { + return powershell(&format!( + "Add-AppxPackage -Path {} -ExternalLocation {}", + quote(&signed), + quote(bin) + )) + .map(drop); + } + let layout = bin.join(LAYOUT_DIRECTORY); + package::write_layout(&layout, package::DEFAULT_PUBLISHER) + .map_err(|error| error.message().to_owned())?; + powershell(&format!( + "Add-AppxPackage -Register {} -ExternalLocation {}", + quote(&layout.join(package::MANIFEST)), + quote(bin) + )) + .map(drop) +} + +fn register_classic(library: &Path) -> std::io::Result<()> { + let hkcu = RegKey::predef(HKEY_CURRENT_USER); + let class_id = format!("{{{}}}", menu::CLASS_ID); + let (class, _) = hkcu.create_subkey(class_key())?; + class.set_value("", &"JustTools context menu")?; + let (server, _) = class.create_subkey("InprocServer32")?; + server.set_value("", &library.to_string_lossy().as_ref())?; + server.set_value("ThreadingModel", &"Apartment")?; + let icon = format!("{},-{}", library.display(), menu::Icon::Brand.resource_id()); + for item_type in package::item_types() { + let (verb, _) = hkcu.create_subkey(format!(r"{}\{VERB}", verb_parent(&item_type)))?; + verb.set_value("", &menu::ROOT_TITLE)?; + verb.set_value("MUIVerb", &menu::ROOT_TITLE)?; + verb.set_value("Icon", &icon)?; + verb.set_value("ExplorerCommandHandler", &class_id)?; + } + Ok(()) +} + +fn ignore_missing(result: std::io::Result<()>) -> std::io::Result<()> { + match result { + Err(error) if error.kind() != ErrorKind::NotFound => Err(error), + _ => Ok(()), + } +} + +/// Remove one verb and any parent keys it was the only reason for. +fn remove_verb(hkcu: &RegKey, parent: &str) -> std::io::Result<()> { + ignore_missing(hkcu.delete_subkey_all(format!(r"{parent}\{VERB}")))?; + // Only keys left with nothing in them go, so other software's verbs and + // values stay exactly where they were. + let unused = |key: &str| { + hkcu.open_subkey(key) + .and_then(|key| key.query_info()) + .is_ok_and(|info| info.sub_keys == 0 && info.values == 0) + }; + let mut key = parent; + while key.len() > CLASSES.len() && unused(key) && hkcu.delete_subkey(key).is_ok() { + match key.rsplit_once('\\') { + Some((up, _)) if !up.ends_with("SystemFileAssociations") => key = up, + _ => break, + } + } + Ok(()) +} + +fn remove_classic() -> std::io::Result<()> { + let hkcu = RegKey::predef(HKEY_CURRENT_USER); + let mut parents: Vec<String> = package::item_types() + .iter() + .map(|item_type| verb_parent(item_type)) + .collect(); + // An older build may have registered types this one no longer lists. + let associations = format!(r"{CLASSES}\SystemFileAssociations"); + if let Ok(key) = hkcu.open_subkey(&associations) { + parents.extend( + key.enum_keys() + .filter_map(Result::ok) + .map(|name| format!(r"{associations}\{name}\shell")), + ); + } + parents.sort_unstable(); + parents.dedup(); + let class_id = format!("{{{}}}", menu::CLASS_ID); + for parent in parents { + let ours = hkcu + .open_subkey(format!(r"{parent}\{VERB}")) + .and_then(|verb| verb.get_value::<String, _>("ExplorerCommandHandler")) + .is_ok_and(|handler| handler.eq_ignore_ascii_case(&class_id)); + if ours { + remove_verb(&hkcu, &parent)?; + } + } + ignore_missing(hkcu.delete_subkey_all(class_key())) +} + +/// Register the menu and report which tier ended up active, with the reason +/// the package tier was not used when it was not. +pub fn install(classic_only: bool) -> ToolResult<(Tier, Option<String>)> { + let bin = bin_directory()?; + let library = bin.join(menu::SHELL_LIBRARY); + if !library.is_file() { + return Err(error(format!( + "{} is not beside just.exe in {}; it ships in the Windows release archive and is copied by `just install`", + menu::SHELL_LIBRARY, + bin.display() + ))); + } + let registry = + |error: std::io::Error| self::error(format!("cannot update the registry: {error}")); + let reason = if classic_only { + None + } else if windows_build() < WINDOWS_11_BUILD { + Some("this is Windows 10, which has a single context menu".to_owned()) + } else if !bin.join(SIGNED_PACKAGE).is_file() && !developer_mode() { + Some(format!( + "the top-level Windows 11 menu needs a signed {SIGNED_PACKAGE} beside just.exe or Developer Mode" + )) + } else { + match register_package(&bin) { + Ok(()) => { + // Windows also lists packaged verbs under "Show more + // options", so the classic verbs would only duplicate them. + remove_classic().map_err(registry)?; + remember_owner(&bin).map_err(registry)?; + notify_shell(); + return Ok((Tier::Package, None)); + } + Err(message) => Some(format!("Windows declined the package: {message}")), + } + }; + if classic_only { + remove_package().map_err(error)?; + } + remove_classic().map_err(registry)?; + register_classic(&library).map_err(registry)?; + remember_owner(&bin).map_err(registry)?; + notify_shell(); + Ok((Tier::Classic, reason)) +} + +pub fn uninstall() -> ToolResult { + let bin = bin_directory()?; + remove_package().map_err(|message| error(format!("cannot remove the package: {message}")))?; + remove_classic() + .and_then(|()| forget_owner()) + .map_err(|error| self::error(format!("cannot update the registry: {error}")))?; + let layout = bin.join(LAYOUT_DIRECTORY); + if layout.join(package::MANIFEST).is_file() { + std::fs::remove_dir_all(&layout) + .map_err(|error| self::error(format!("cannot remove {}: {error}", layout.display())))?; + } + notify_shell(); + Ok(()) +} diff --git a/src/deps.rs b/src/deps.rs index 9367f1e..071f9fb 100644 --- a/src/deps.rs +++ b/src/deps.rs @@ -101,6 +101,7 @@ enum Dependency { Pngquant, Cwebp, Git, + YtDlp, } impl Dependency { @@ -110,6 +111,7 @@ impl Dependency { "pngquant" => Some(Self::Pngquant), "cwebp" => Some(Self::Cwebp), "git" => Some(Self::Git), + "yt-dlp" => Some(Self::YtDlp), _ => None, } } @@ -120,6 +122,7 @@ impl Dependency { Self::Pngquant => "pngquant", Self::Cwebp => "cwebp", Self::Git => "Git", + Self::YtDlp => "yt-dlp", } } @@ -129,6 +132,7 @@ impl Dependency { Self::Pngquant => &["pngquant"], Self::Cwebp => &["cwebp"], Self::Git => &["git"], + Self::YtDlp => &["yt-dlp"], } } } @@ -344,7 +348,8 @@ struct SystemRunner; impl DependencyRunner for SystemRunner { fn find(&mut self, program: &str) -> Option<PathBuf> { - find_executable(program) + // A copy on PATH always wins over the one JustTools downloaded. + find_executable(program).or_else(|| crate::managed::find(program)) } fn run(&mut self, command: &CommandSpec) -> io::Result<Option<i32>> { @@ -394,7 +399,13 @@ enum RequestPolicy { ResolveOnly(String), } -const DEPENDENCY_OVERRIDES: [&str; 4] = ["FFMPEG_BIN", "PNGQUANT_BIN", "CWEBP_BIN", "GIT_BIN"]; +const DEPENDENCY_OVERRIDES: [&str; 5] = [ + "FFMPEG_BIN", + "PNGQUANT_BIN", + "CWEBP_BIN", + "GIT_BIN", + "YTDLP_BIN", +]; fn request_policy(requested: &str) -> RequestPolicy { request_policy_with(requested, |name| env::var_os(name)) @@ -470,6 +481,7 @@ fn windows_plan<R: DependencyRunner>( Dependency::Ffmpeg => "Gyan.FFmpeg", Dependency::Cwebp => "Google.Libwebp", Dependency::Git => "Git.Git", + Dependency::YtDlp => "yt-dlp.yt-dlp", Dependency::Pngquant => unreachable!(), }; let winget = runner @@ -614,18 +626,22 @@ fn package_for(installer: Installer, dependency: Dependency) -> &'static str { (Installer::Homebrew, Dependency::Pngquant) => "pngquant", (Installer::Homebrew, Dependency::Cwebp) => "webp", (Installer::Homebrew, Dependency::Git) => "git", + (Installer::Homebrew, Dependency::YtDlp) => "yt-dlp", (Installer::Apt, Dependency::Ffmpeg) => "ffmpeg", (Installer::Apt, Dependency::Pngquant) => "pngquant", (Installer::Apt, Dependency::Cwebp) => "webp", (Installer::Apt, Dependency::Git) => "git", + (Installer::Apt, Dependency::YtDlp) => "yt-dlp", (Installer::Dnf, Dependency::Ffmpeg) => "ffmpeg-free", (Installer::Dnf, Dependency::Pngquant) => "pngquant", (Installer::Dnf, Dependency::Cwebp) => "libwebp-tools", (Installer::Dnf, Dependency::Git) => "git", + (Installer::Dnf, Dependency::YtDlp) => "yt-dlp", (Installer::Pacman, Dependency::Ffmpeg) => "ffmpeg", (Installer::Pacman, Dependency::Pngquant) => "pngquant", (Installer::Pacman, Dependency::Cwebp) => "libwebp-utils", (Installer::Pacman, Dependency::Git) => "git", + (Installer::Pacman, Dependency::YtDlp) => "yt-dlp", _ => unreachable!("package requested for an installer without package names"), } } @@ -701,8 +717,78 @@ fn ensure_dependency<R: DependencyRunner, I: DependencyInteraction>( } } -/// Resolve a dependency, offering a confirmed native installation only for the -/// canonical names `ffmpeg`, `pngquant`, `cwebp`, and `git`. +/// Resolve a dependency, honoring an explicit `*_BIN` override before falling +/// back to the standard executable name. +/// +/// An override that names an existing file is used as-is; any other value is +/// resolved on `PATH` without offering an installation. +pub fn require_override(tool: &str, variable: &str, standard: &str) -> ToolResult<PathBuf> { + let Some(requested) = env::var_os(variable).filter(|value| !value.is_empty()) else { + return require(tool, standard); + }; + let path = PathBuf::from(&requested); + if path.is_file() { + return Ok(path); + } + let text = requested.to_str().ok_or_else(|| { + ToolError::new( + tool, + format!( + "{variable} points to a missing non-UTF-8 path: {}", + path.to_string_lossy() + ), + ) + })?; + require(tool, text) +} + +/// Find yt-dlp wherever it already is, without installing or downloading it. +pub fn installed_yt_dlp() -> Option<PathBuf> { + match env::var_os("YTDLP_BIN").filter(|value| !value.is_empty()) { + Some(explicit) => { + let path = PathBuf::from(&explicit); + if path.is_file() { + Some(path) + } else { + explicit.to_str().and_then(find_executable) + } + } + None => find_executable("yt-dlp").or_else(|| crate::managed::find("yt-dlp")), + } +} + +/// Download yt-dlp or FFmpeg into the per-user folder when it is missing. +/// +/// These two are fetched without asking: both ship as self-contained vendor +/// builds, nothing outside JustTools' own folder changes, and every download is +/// verified. A failure is reported and resolution falls back to the platform +/// package manager, which still asks first. +fn download_if_missing<R: DependencyRunner>( + tool: &str, + requested: &str, + dependency: Dependency, + runner: &mut R, +) { + let program = match dependency { + Dependency::Ffmpeg => crate::managed::Program::Ffmpeg, + Dependency::YtDlp => crate::managed::Program::YtDlp, + _ => return, + }; + if !crate::managed::enabled() + || inspect_dependency(dependency, requested, runner) + .1 + .is_empty() + { + return; + } + if let Err(message) = crate::managed::fetch(tool, program) { + eprintln!("{tool}: automatic download failed: {message}"); + } +} + +/// Resolve a dependency. Missing yt-dlp and FFmpeg are downloaded +/// automatically; otherwise a confirmed native installation is offered for the +/// canonical names `ffmpeg`, `pngquant`, `cwebp`, `git`, and `yt-dlp`. /// /// Explicit paths, custom executable names, and values supplied through a /// `*_BIN` override are resolve-only and never launch an installer. @@ -723,6 +809,7 @@ pub fn require(tool: &str, requested: &str) -> ToolResult<PathBuf> { let RequestPolicy::Install(dependency) = policy else { unreachable!(); }; + download_if_missing(tool, requested, dependency, &mut runner); let platform = Platform::current().map_err(|error| error.into_tool_error(tool))?; let mut interaction = SystemInteraction::new(); match ensure_dependency( @@ -968,6 +1055,13 @@ mod tests { (Platform::Windows, Dependency::Ffmpeg, "Gyan.FFmpeg"), (Platform::Windows, Dependency::Cwebp, "Google.Libwebp"), (Platform::Windows, Dependency::Git, "Git.Git"), + (Platform::Windows, Dependency::YtDlp, "yt-dlp.yt-dlp"), + (Platform::MacOs, Dependency::YtDlp, "brew install yt-dlp"), + ( + Platform::Linux, + Dependency::YtDlp, + "apt-get install -y yt-dlp", + ), (Platform::MacOs, Dependency::Cwebp, "brew install webp"), ( Platform::Linux, diff --git a/src/install.rs b/src/install.rs index 0d52e9d..4306fcb 100644 --- a/src/install.rs +++ b/src/install.rs @@ -51,7 +51,8 @@ replaced. On Windows, also installs PowerShell launchers for mkcd, justmkcd, just, claude_, and codex_. Shell integration loads automatically; no init or profile -edit is needed. +edit is needed. The File Explorer context-menu extension is installed when it +sits beside the executable; `just context install` then adds the menu. Options: --bin-dir DIR Installation directory @@ -147,6 +148,25 @@ fn native_names() -> Vec<String> { command_names().into_iter().map(executable_name).collect() } +/// Files a Windows release ships beside `just.exe` for the File Explorer +/// context menu: the shell extension and, when the release is signed, its +/// package. Either may be absent, so they are installed only when present. +const COMPANION_FILES: [&str; 2] = [justtools_menu::SHELL_LIBRARY, "justtools-shell.msix"]; + +fn companion_files(source: &Path) -> Vec<(&'static str, PathBuf)> { + if !cfg!(windows) { + return Vec::new(); + } + let Some(directory) = source.parent() else { + return Vec::new(); + }; + COMPANION_FILES + .into_iter() + .map(|name| (name, directory.join(name))) + .filter(|(_, path)| path.is_file()) + .collect() +} + fn installed_names() -> Vec<String> { let mut names = native_names(); names.extend( @@ -157,6 +177,18 @@ fn installed_names() -> Vec<String> { names } +/// Everything this installation writes: the fixed names plus the companions +/// found beside `source`. +fn installed_names_from(source: &Path) -> Vec<String> { + let mut names = installed_names(); + names.extend( + companion_files(source) + .into_iter() + .map(|(name, _)| name.to_owned()), + ); + names +} + fn legacy_candidate_names() -> BTreeSet<String> { let mut names = BTreeSet::new(); for command in command_names() { @@ -248,9 +280,9 @@ fn files_identical(left: &Path, right: &Path) -> bool { } } -fn manifest_contents() -> String { +fn manifest_contents(source: &Path) -> String { let mut contents = format!("{MANIFEST_HEADER}\n"); - for name in installed_names() { + for name in installed_names_from(source) { contents.push_str(&name); contents.push('\n'); } @@ -258,7 +290,12 @@ fn manifest_contents() -> String { } fn discover_managed_files(source: &Path, bin: &Path) -> ToolResult<Vec<PathBuf>> { - let allowed_names: HashSet<_> = installed_names().into_iter().collect(); + // Companions are always recognized, so an upgrade from a build that had + // them to one that lacks them still moves the old ones aside. + let allowed_names: HashSet<_> = installed_names() + .into_iter() + .chain(COMPANION_FILES.map(str::to_owned)) + .collect(); let manifest = bin.join(MANIFEST_NAME); let mut managed = legacy_files(bin); @@ -290,7 +327,12 @@ fn discover_managed_files(source: &Path, bin: &Path) -> ToolResult<Vec<PathBuf>> } for name in lines.filter(|name| allowed_names.contains(*name)) { let path = bin.join(name); - if path.is_file() && !common::same_path(source, &path) { + if path.is_file() + && !common::same_path(source, &path) + && !companion_files(source) + .iter() + .any(|(_, companion)| common::same_path(companion, &path)) + { managed.push(path); } } @@ -315,11 +357,15 @@ fn discover_managed_files(source: &Path, bin: &Path) -> ToolResult<Vec<PathBuf>> } let managed_keys: HashSet<_> = managed.iter().map(|path| path_key(path)).collect(); - for name in &allowed_names { + let incoming: HashSet<_> = installed_names_from(source).into_iter().collect(); + for name in &incoming { let path = bin.join(name); if path.exists() && !managed_keys.contains(&path_key(&path)) && !common::same_path(source, &path) + && !companion_files(source) + .iter() + .any(|(_, companion)| common::same_path(companion, &path)) { return Err(ToolError::new( "just", @@ -462,7 +508,18 @@ fn stage_installation(source: &Path, bin: &Path) -> ToolResult<tempfile::TempDir ) })?; } - fs::write(stage.path().join(MANIFEST_NAME), manifest_contents()) + for (name, companion) in companion_files(source) { + if common::same_path(&companion, &bin.join(name)) { + continue; + } + fs::copy(&companion, stage.path().join(name)).map_err(|error| { + ToolError::new( + "just", + format!("cannot stage {}: {error}", companion.display()), + ) + })?; + } + fs::write(stage.path().join(MANIFEST_NAME), manifest_contents(source)) .map_err(|error| ToolError::new("just", format!("cannot stage manifest: {error}")))?; Ok(stage) } @@ -514,14 +571,19 @@ fn install_transaction( } let main_name = executable_name("just"); - let mut targets = installed_names(); + let mut targets = installed_names_from(source); targets.retain(|name| name != &main_name); targets.insert(0, main_name.clone()); targets.push(MANIFEST_NAME.to_owned()); let mut committed = Vec::new(); for name in targets { let destination = bin.join(&name); - if name == main_name && common::same_path(source, &destination) { + if common::same_path(source, &destination) + || companion_files(source) + .iter() + .any(|(_, companion)| common::same_path(companion, &destination)) + { + // Reinstalling from the destination leaves the running files alone. continue; } if fail_after_for_test.is_some_and(|limit| committed.len() >= limit) { @@ -592,6 +654,17 @@ pub fn run(args: Vec<OsString>) -> ToolResult { "just: enable shell helpers with just init <powershell|bash|zsh|fish>; see docs/mkcd.md" ); } + #[cfg(windows)] + { + // The registration belongs to the installed copy, which also knows + // whether a menu is registered at all. + let refreshed = std::process::Command::new(bin.join(executable_name("just"))) + .args(["context", "refresh"]) + .status(); + if !refreshed.is_ok_and(|status| status.success()) { + eprintln!("just: run `just context install` to refresh the File Explorer menu"); + } + } if options.add_path && !crate::pathing::contains(&bin) { let add = options.yes || common::confirm("just", &format!("just: add {} to PATH", bin.display()))?; @@ -609,7 +682,11 @@ mod tests { use super::*; fn write_manifest(bin: &Path) { - fs::write(bin.join(MANIFEST_NAME), manifest_contents()).unwrap(); + fs::write( + bin.join(MANIFEST_NAME), + manifest_contents(Path::new("downloaded")), + ) + .unwrap(); } #[test] @@ -701,6 +778,39 @@ mod tests { assert!(bin.join(MANIFEST_NAME).is_file()); } + #[test] + #[cfg(windows)] + fn context_menu_companions_install_and_are_retired_with_the_build_that_had_them() { + let directory = tempfile::tempdir().unwrap(); + let release = directory.path().join("release"); + let bin = directory.path().join("bin"); + fs::create_dir(&release).unwrap(); + fs::create_dir(&bin).unwrap(); + let source = release.join("just.exe"); + fs::write(&source, b"native suite").unwrap(); + fs::write(release.join(justtools_menu::SHELL_LIBRARY), b"extension").unwrap(); + + let managed = discover_managed_files(&source, &bin).unwrap(); + install_transaction(&source, &bin, &managed, None).unwrap(); + let library = bin.join(justtools_menu::SHELL_LIBRARY); + assert_eq!(fs::read(&library).unwrap(), b"extension"); + assert!( + fs::read_to_string(bin.join(MANIFEST_NAME)) + .unwrap() + .contains(justtools_menu::SHELL_LIBRARY) + ); + + // A later build without the extension must not leave a stale one + // serving a menu the new executable no longer matches. + let plain = directory.path().join("plain.exe"); + fs::write(&plain, b"newer suite").unwrap(); + let managed = discover_managed_files(&plain, &bin).unwrap(); + assert!(managed.iter().any(|path| common::same_path(path, &library))); + install_transaction(&plain, &bin, &managed, None).unwrap(); + assert!(!library.exists()); + assert_eq!(fs::read(bin.join("just.exe")).unwrap(), b"newer suite"); + } + #[test] fn reinstall_from_destination_never_moves_running_main() { let directory = tempfile::tempdir().unwrap(); diff --git a/src/launcher.rs b/src/launcher.rs index 4702083..d1601e7 100644 --- a/src/launcher.rs +++ b/src/launcher.rs @@ -95,12 +95,27 @@ pub fn supports(command: &str) -> bool { } pub fn run(command: &str) -> ToolResult<Option<Vec<OsString>>> { + run_with_input(command, "") +} + +/// Open the launcher with its input row already filled in, as the File +/// Explorer context menu does for the selected files. The row stays editable +/// and, like every input, is never saved. +pub fn run_with_input(command: &str, input: &str) -> ToolResult<Option<Vec<OsString>>> { let tool = spec(command) .ok_or_else(|| ToolError::usage("just", format!("unknown tool: {command}")))?; let store = preferences::Store::load().map_err(|error| { ToolError::new(command, format!("could not load saved defaults: {error:#}")) })?; let mut app = App::new(tool, store); + if !input.is_empty() + && let Some(entry) = app + .values + .iter_mut() + .find(|entry| matches!(entry.field.kind, Kind::Input { .. })) + { + entry.value = input.to_owned(); + } ratatui::run(|terminal| app.run(terminal)) .map_err(|error| ToolError::new(command, format!("terminal UI failed: {error}")))?; if !app.run { @@ -544,6 +559,31 @@ impl App { format!("{}/{}", absolute.display(), pattern) } + fn has_url(&self) -> bool { + split_inputs(self.value("input")).iter().any(|value| { + let lower = value.trim().to_ascii_lowercase(); + lower.starts_with("http://") || lower.starts_with("https://") + }) + } + + /// Downloads have no source folder, so they land in --output or the + /// current folder under the title yt-dlp saved. + fn download_note(&self, pattern: &str) -> String { + if !self.has_url() { + return String::new(); + } + let output = self.value("output").trim().to_owned(); + let directory = if output.is_empty() { + std::env::current_dir().unwrap_or_else(|_| PathBuf::from(".")) + } else { + absolute_path(&output) + }; + format!( + " | URL downloads -> {}/{pattern} (yt-dlp)", + directory.display() + ) + } + fn output_policy(&self) -> (String, String) { let separate_output = !self.value("output").trim().is_empty(); match self.tool.name { @@ -676,14 +716,23 @@ impl App { .into(), ) } - "justvideo" => ( + "justpaste" => ( format!( "Output: {}", + self.destination("<the name the link's server gives the file>") + .replace("beside each source as", "the current folder as") + ), + "Overwrite: never; a taken name is saved as \"name (2).ext\".".into(), + ), + "justvideo" => ( + format!( + "Output: {}{}", self.destination(if self.enabled("replace") { "<name>.mp4" } else { "<name>-web.mp4" - }) + }), + self.download_note("<title> [<id>].mp4") ), if self.enabled("replace") && !separate_output { "Overwrite: source replaced/removed only after the MP4 is safely installed." @@ -700,8 +749,9 @@ impl App { }; ( format!( - "Output: {}", - self.destination(&format!("<name>.{extension}")) + "Output: {}{}", + self.destination(&format!("<name>.{extension}")), + self.download_note(&format!("<title> [<id>].{extension}")) ), if self.enabled("replace") && !separate_output { "Overwrite: source replaced/removed only after safe output installation." @@ -1011,7 +1061,7 @@ fn split_inputs(value: &str) -> Vec<String> { result } -fn quote(value: &str) -> String { +pub(crate) fn quote(value: &str) -> String { if !value.is_empty() && value .chars() @@ -1295,12 +1345,26 @@ fn media_spec(name: &'static str) -> Tool { "Create streaming-ready video", vec![ input( - "Input files / folders", - "Use semicolons between multiple inputs. Blank processes the current folder.", + "Input files / folders / URLs", + "Use semicolons between multiple inputs. An http(s) URL downloads with yt-dlp. Blank processes the current folder.", true, Some("."), false, ), + choices( + "resolution", + "Max resolution", + "Largest output frame. Smaller sources are never upscaled.", + "720", + vec![ + choice("480p", "480", &["--resolution", "480p"]), + choice("720p", "720", &[]), + choice("1080p", "1080", &["--resolution", "1080p"]), + choice("1440p", "1440", &["--resolution", "1440p"]), + choice("4K (2160p)", "2160", &["--resolution", "4k"]), + choice("Source", "source", &["--resolution", "source"]), + ], + ), number( "crf", "Video CRF", @@ -1334,6 +1398,13 @@ fn media_spec(name: &'static str) -> Tool { "--replace", true, ), + toggle( + "playlist", + "Download playlists", + "Download every entry when an input URL is a playlist.", + "--playlist", + true, + ), ], jobs(2), ), @@ -1342,8 +1413,8 @@ fn media_spec(name: &'static str) -> Tool { "Create compact AAC audio", vec![ input( - "Input files / folders", - "Use semicolons between multiple inputs. Blank processes the current folder.", + "Input files / folders / URLs", + "Use semicolons between multiple inputs. An http(s) URL downloads with yt-dlp. Blank processes the current folder.", true, Some("."), false, @@ -1380,6 +1451,13 @@ fn media_spec(name: &'static str) -> Tool { "--replace", true, ), + toggle( + "playlist", + "Download playlists", + "Download every entry when an input URL is a playlist.", + "--playlist", + true, + ), ], jobs(2), ), @@ -1388,8 +1466,8 @@ fn media_spec(name: &'static str) -> Tool { "Create high-quality MP3 audio", vec![ input( - "Input files / folders", - "Use semicolons between multiple inputs. Blank processes the current folder.", + "Input files / folders / URLs", + "Use semicolons between multiple inputs. An http(s) URL downloads with yt-dlp. Blank processes the current folder.", true, Some("."), false, @@ -1428,6 +1506,13 @@ fn media_spec(name: &'static str) -> Tool { "--replace", true, ), + toggle( + "playlist", + "Download playlists", + "Download every entry when an input URL is a playlist.", + "--playlist", + true, + ), ], jobs(2), ), @@ -1436,8 +1521,8 @@ fn media_spec(name: &'static str) -> Tool { "Create editing-ready WAV audio", vec![ input( - "Input files / folders", - "Use semicolons between multiple inputs. Blank processes the current folder.", + "Input files / folders / URLs", + "Use semicolons between multiple inputs. An http(s) URL downloads with yt-dlp. Blank processes the current folder.", true, Some("."), false, @@ -1476,6 +1561,13 @@ fn media_spec(name: &'static str) -> Tool { "--replace", true, ), + toggle( + "playlist", + "Download playlists", + "Download every entry when an input URL is a playlist.", + "--playlist", + true, + ), ], jobs(2), ), @@ -1964,6 +2056,81 @@ fn spec(name: &str) -> Option<Tool> { ), ], }, + "justpaste" => Tool { + name: "justpaste", + title: "JustPaste", + summary: "Download whatever a link points at", + fields: vec![ + input( + "Links", + "Use semicolons between several links. Blank pastes the links in the clipboard.", + true, + Some("--clipboard"), + false, + ), + text( + "output", + "Output folder", + "Optional destination folder. Blank saves into the current folder.", + "", + "--output", + true, + ), + toggle( + "playlist", + "Download playlists", + "Download every entry when a link is a playlist.", + "--playlist", + true, + ), + toggle( + "dry_run", + "Dry run", + "List the links without any network access. This one-run safety action is not saved.", + "--dry-run", + false, + ), + ], + }, + "justip" => Tool { + name: "justip", + title: "JustIP", + summary: "Show the public IP address this machine presents", + fields: vec![ + choices( + "family", + "Address family", + "Both reports IPv4 and IPv6 together; either one narrows the lookup.", + "both", + vec![ + choice("Both", "both", &[]), + choice("IPv4 only", "ipv4", &["--ipv4"]), + choice("IPv6 only", "ipv6", &["--ipv6"]), + ], + ), + choices( + "format", + "Output format", + "Labeled reads best; plain and JSON are for scripts and pipelines.", + "labeled", + vec![ + choice("Labeled", "labeled", &[]), + choice("Plain addresses", "plain", &["--plain"]), + choice("JSON", "json", &["--json"]), + ], + ), + number( + "timeout", + "Timeout (seconds)", + "How long each family's lookup may take before it is reported unavailable.", + 5, + "--timeout", + 1, + 60, + 1, + ), + ], + }, "justport" => Tool { name: "justport", title: "JustPort", @@ -2344,12 +2511,56 @@ mod tests { } } + #[test] + fn ip_launcher_defaults_to_both_families_and_narrows_on_request() { + let mut app = app_for("justip"); + // Reporting both families is the default, so the bare command carries + // no switch at all. + assert_eq!(app.command(), "justip"); + for (id, value) in [("family", "ipv6"), ("format", "plain"), ("timeout", "20")] { + let entry = app + .values + .iter_mut() + .find(|entry| entry.field.id == id) + .unwrap(); + assert!(entry.field.persistent, "{id} should be remembered"); + entry.value = value.into(); + } + assert_eq!(app.command(), "justip --ipv6 --plain --timeout 20"); + } + #[test] fn default_jpg_command_is_explicitly_headless() { let app = app_for("justjpg"); assert_eq!(app.command(), "justjpg ."); } + #[test] + fn media_launcher_forwards_urls_and_shows_the_download_destination() { + let mut app = app_for("justaudio"); + app.values + .iter_mut() + .find(|value| value.field.id == "input") + .unwrap() + .value = "https://example.test/watch?v=1".into(); + let playlist = app + .values + .iter_mut() + .find(|value| value.field.id == "playlist") + .unwrap(); + assert!(playlist.field.persistent); + playlist.value = "true".into(); + let command = app.command(); + assert!( + command.contains("https://example.test/watch?v=1"), + "{command}" + ); + assert!(command.contains("--playlist"), "{command}"); + let (destination, _) = app.output_policy(); + assert!(destination.contains("<title> [<id>].m4a"), "{destination}"); + assert!(destination.contains("yt-dlp"), "{destination}"); + } + #[test] fn mkcd_launcher_protects_literal_directory_and_never_saves_it() { let mut app = app_for("justmkcd"); diff --git a/src/main.rs b/src/main.rs index e30cadc..1c65cc2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,12 @@ mod commands; mod common; mod console_ui; +mod context; mod deps; mod error; mod install; mod launcher; +mod managed; mod pathing; mod preferences; mod selector; diff --git a/src/managed.rs b/src/managed.rs new file mode 100644 index 0000000..876e23d --- /dev/null +++ b/src/managed.rs @@ -0,0 +1,362 @@ +//! Private copies of yt-dlp and FFmpeg for machines that have neither. +//! +//! When one of them is not on `PATH`, JustTools downloads the vendor's own +//! build into a per-user folder and uses it from there. Nothing is installed +//! system-wide, `PATH` is not edited, and a copy already on `PATH` always +//! wins. Every download is checked against the SHA-256 the vendor publishes +//! beside it and is moved into place only after it verifies. +//! +//! `JUSTTOOLS_NO_DOWNLOAD=1` turns this off, and `JUSTTOOLS_DEPS_DIR` moves +//! the folder. + +use std::fs::{self, File}; +use std::io::{Read, Write}; +use std::path::{Path, PathBuf}; +use std::time::Duration; + +use sha2::{Digest, Sha256}; +use ureq::ResponseExt; + +const YT_DLP_RELEASE: &str = "https://github.com/yt-dlp/yt-dlp/releases/latest/download"; +/// Gyan Doshi's release build, the same one WinGet's `Gyan.FFmpeg` installs. +const FFMPEG_WINDOWS: &str = "https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-essentials.zip"; +/// Martin Riedl's static release builds, one zip per program. +const FFMPEG_UNIX: &str = "https://ffmpeg.martin-riedl.de/redirect/latest"; + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum Program { + YtDlp, + Ffmpeg, +} + +impl Program { + pub fn from_name(name: &str) -> Option<Self> { + match name { + "yt-dlp" => Some(Self::YtDlp), + "ffmpeg" | "ffprobe" => Some(Self::Ffmpeg), + _ => None, + } + } + + fn label(self) -> &'static str { + match self { + Self::YtDlp => "yt-dlp", + Self::Ffmpeg => "FFmpeg", + } + } +} + +/// Whether automatic downloads are allowed in this environment. +pub fn enabled() -> bool { + !std::env::var("JUSTTOOLS_NO_DOWNLOAD").is_ok_and(|value| { + matches!( + value.trim().to_ascii_lowercase().as_str(), + "1" | "true" | "yes" | "on" + ) + }) +} + +/// The folder that holds the downloaded programs. +pub fn directory() -> Option<PathBuf> { + if let Some(directory) = + std::env::var_os("JUSTTOOLS_DEPS_DIR").filter(|value| !value.is_empty()) + { + return Some(PathBuf::from(directory)); + } + directories::BaseDirs::new().map(|base| base.data_local_dir().join("JustTools/deps/bin")) +} + +fn executable(name: &str) -> String { + if cfg!(windows) { + format!("{name}.exe") + } else { + name.to_owned() + } +} + +/// A previously downloaded program, by its plain name. +pub fn find(name: &str) -> Option<PathBuf> { + Program::from_name(name)?; + let path = directory()?.join(executable(name)); + path.is_file().then_some(path) +} + +fn agent() -> ureq::Agent { + ureq::Agent::config_builder() + .timeout_connect(Some(Duration::from_secs(20))) + .timeout_recv_response(Some(Duration::from_secs(60))) + .user_agent(concat!("JustTools/", env!("CARGO_PKG_VERSION"))) + .build() + .into() +} + +fn text(agent: &ureq::Agent, url: &str) -> Result<String, String> { + agent + .get(url) + .call() + .and_then(|mut response| { + response + .body_mut() + .with_config() + .limit(1024 * 1024) + .read_to_string() + }) + .map_err(|error| format!("cannot read {url}: {error}")) +} + +/// The hash a checksum listing gives for `name`. A listing that holds a lone +/// hash, as a `.sha256` sidecar often does, names whatever it sits beside. +fn listed_hash(listing: &str, name: &str) -> Option<String> { + let valid = |hash: &str| hash.len() == 64 && hash.bytes().all(|byte| byte.is_ascii_hexdigit()); + let mut lone = None; + for line in listing.lines() { + let mut parts = line.split_whitespace(); + let Some(hash) = parts.next().filter(|hash| valid(hash)) else { + continue; + }; + match parts.next() { + Some(file) if file.trim_start_matches('*') == name => { + return Some(hash.to_ascii_lowercase()); + } + Some(_) => {} + None => lone = Some(hash.to_ascii_lowercase()), + } + } + lone +} + +/// Download `url` into `directory` under a temporary name, returning the file, +/// its SHA-256, and the address it finally came from. +fn download( + agent: &ureq::Agent, + url: &str, + directory: &Path, +) -> Result<(tempfile::NamedTempFile, String, String), String> { + let mut response = agent + .get(url) + .call() + .map_err(|error| format!("cannot download {url}: {error}"))?; + let source = response.get_uri().to_string(); + let mut file = tempfile::Builder::new() + .prefix(".download-") + .tempfile_in(directory) + .map_err(|error| format!("cannot write in {}: {error}", directory.display()))?; + let mut hasher = Sha256::new(); + let mut reader = response.body_mut().as_reader(); + let mut buffer = vec![0_u8; 256 * 1024]; + loop { + if crate::common::interrupted() { + return Err("interrupted".into()); + } + let count = reader + .read(&mut buffer) + .map_err(|error| format!("the download of {url} stopped: {error}"))?; + if count == 0 { + break; + } + hasher.update(&buffer[..count]); + file.write_all(&buffer[..count]) + .map_err(|error| format!("cannot write the download: {error}"))?; + } + file.flush() + .map_err(|error| format!("cannot write the download: {error}"))?; + let hash = hasher + .finalize() + .iter() + .map(|byte| format!("{byte:02x}")) + .collect(); + Ok((file, hash, source)) +} + +fn verify(actual: &str, listing: &str, name: &str, url: &str) -> Result<(), String> { + match listed_hash(listing, name) { + Some(expected) if expected == actual => Ok(()), + Some(expected) => Err(format!( + "{url} failed verification: expected SHA-256 {expected}, received {actual}" + )), + None => Err(format!("the vendor published no SHA-256 for {name}")), + } +} + +/// Put a finished file in place and make it runnable. +fn install(file: tempfile::NamedTempFile, destination: &Path) -> Result<(), String> { + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + fs::set_permissions(file.path(), fs::Permissions::from_mode(0o755)).map_err(|error| { + format!("cannot mark {} executable: {error}", destination.display()) + })?; + } + file.persist(destination) + .map(drop) + .map_err(|error| format!("cannot install {}: {}", destination.display(), error.error)) +} + +/// Copy the named programs out of a zip archive, wherever they sit in it. +fn unpack(archive: &Path, programs: &[&str], directory: &Path) -> Result<(), String> { + let broken = + |error: &dyn std::fmt::Display| format!("the FFmpeg archive is unreadable: {error}"); + let file = File::open(archive).map_err(|error| broken(&error))?; + let mut zip = zip::ZipArchive::new(file).map_err(|error| broken(&error))?; + for program in programs { + let wanted = executable(program); + let index = (0..zip.len()) + .find(|index| { + zip.by_index(*index).is_ok_and(|entry| { + entry.is_file() + && entry.name().rsplit(['/', '\\']).next() == Some(wanted.as_str()) + }) + }) + .ok_or_else(|| format!("the FFmpeg archive does not contain {wanted}"))?; + let mut entry = zip.by_index(index).map_err(|error| broken(&error))?; + let mut output = tempfile::Builder::new() + .prefix(".download-") + .tempfile_in(directory) + .map_err(|error| format!("cannot write in {}: {error}", directory.display()))?; + std::io::copy(&mut entry, &mut output).map_err(|error| broken(&error))?; + output.flush().map_err(|error| broken(&error))?; + install(output, &directory.join(&wanted))?; + } + Ok(()) +} + +fn yt_dlp_asset() -> Result<&'static str, String> { + Ok(match (std::env::consts::OS, std::env::consts::ARCH) { + ("windows", "aarch64") => "yt-dlp_arm64.exe", + ("windows", _) => "yt-dlp.exe", + ("macos", _) => "yt-dlp_macos", + ("linux", "x86_64") => "yt-dlp_linux", + ("linux", "aarch64") => "yt-dlp_linux_aarch64", + (os, arch) => return Err(format!("yt-dlp publishes no build for {os} {arch}")), + }) +} + +fn fetch_yt_dlp(agent: &ureq::Agent, directory: &Path) -> Result<(), String> { + let asset = yt_dlp_asset()?; + let url = format!("{YT_DLP_RELEASE}/{asset}"); + let listing = text(agent, &format!("{YT_DLP_RELEASE}/SHA2-256SUMS"))?; + let (file, hash, _) = download(agent, &url, directory)?; + verify(&hash, &listing, asset, &url)?; + install(file, &directory.join(executable("yt-dlp"))) +} + +fn fetch_ffmpeg(agent: &ureq::Agent, directory: &Path) -> Result<(), String> { + if cfg!(windows) { + // The x64 build also runs on Windows on ARM. + let (archive, hash, source) = download(agent, FFMPEG_WINDOWS, directory)?; + let listing = text(agent, &format!("{source}.sha256"))?; + let name = source.rsplit('/').next().unwrap_or_default().to_owned(); + verify(&hash, &listing, &name, &source)?; + return unpack(archive.path(), &["ffmpeg", "ffprobe"], directory); + } + let os = match std::env::consts::OS { + "macos" => "macos", + "linux" => "linux", + other => return Err(format!("no FFmpeg build is published for {other}")), + }; + let arch = match std::env::consts::ARCH { + "x86_64" => "amd64", + "aarch64" => "arm64", + other => return Err(format!("no FFmpeg build is published for {os} {other}")), + }; + for program in ["ffprobe", "ffmpeg"] { + let url = format!("{FFMPEG_UNIX}/{os}/{arch}/release/{program}.zip"); + let (archive, hash, source) = download(agent, &url, directory)?; + let listing = text(agent, &format!("{source}.sha256"))?; + verify(&hash, &listing, &format!("{program}.zip"), &source)?; + unpack(archive.path(), &[program], directory)?; + } + Ok(()) +} + +/// Download `program` into the managed folder, replacing any earlier copy. +pub fn fetch(tool: &str, program: Program) -> Result<PathBuf, String> { + let directory = directory().ok_or("cannot locate a per-user data folder")?; + fs::create_dir_all(&directory) + .map_err(|error| format!("cannot create {}: {error}", directory.display()))?; + eprintln!( + "{tool}: {} is not installed; downloading it to {}", + program.label(), + directory.display() + ); + let agent = agent(); + match program { + Program::YtDlp => fetch_yt_dlp(&agent, &directory)?, + Program::Ffmpeg => fetch_ffmpeg(&agent, &directory)?, + } + eprintln!("{tool}: {} is ready", program.label()); + Ok(directory) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn checksum_listings_match_by_name_or_stand_alone() { + let hash = "a".repeat(64); + let other = "b".repeat(64); + let listing = format!("{other} yt-dlp\n{hash} yt-dlp.exe\n{other} *yt-dlp_macos\n"); + assert_eq!(listed_hash(&listing, "yt-dlp.exe").as_deref(), Some(&*hash)); + assert_eq!( + listed_hash(&listing, "yt-dlp_macos").as_deref(), + Some(&*other) + ); + assert_eq!(listed_hash(&listing, "yt-dlp_linux"), None); + assert_eq!( + listed_hash(&hash.to_ascii_uppercase(), "ffmpeg.zip").as_deref(), + Some(&*hash) + ); + assert_eq!(listed_hash("not a hash ffmpeg.zip", "ffmpeg.zip"), None); + + assert!(verify(&hash, &listing, "yt-dlp.exe", "https://example.test/a").is_ok()); + let mismatch = verify(&other, &listing, "yt-dlp.exe", "https://example.test/a"); + assert!(mismatch.unwrap_err().contains("failed verification")); + } + + #[test] + fn only_the_two_managed_programs_are_ever_looked_up() { + assert_eq!(Program::from_name("ffprobe"), Some(Program::Ffmpeg)); + assert_eq!(Program::from_name("yt-dlp"), Some(Program::YtDlp)); + assert_eq!(Program::from_name("git"), None); + assert_eq!(find("git"), None); + assert!(yt_dlp_asset().is_ok()); + } + + #[test] + fn archives_yield_their_programs_from_any_folder() { + let directory = tempfile::tempdir().unwrap(); + let archive = directory.path().join("build.zip"); + let mut writer = zip::ZipWriter::new(File::create(&archive).unwrap()); + let options = zip::write::SimpleFileOptions::default(); + writer + .start_file( + format!("ffmpeg-9.0-build/bin/{}", executable("ffmpeg")), + options, + ) + .unwrap(); + writer.write_all(b"encoder").unwrap(); + writer + .start_file( + format!("ffmpeg-9.0-build/bin/{}", executable("ffprobe")), + options, + ) + .unwrap(); + writer.write_all(b"prober").unwrap(); + writer.finish().unwrap(); + + let bin = directory.path().join("bin"); + fs::create_dir(&bin).unwrap(); + unpack(&archive, &["ffmpeg", "ffprobe"], &bin).unwrap(); + assert_eq!( + fs::read(bin.join(executable("ffmpeg"))).unwrap(), + b"encoder" + ); + assert_eq!( + fs::read(bin.join(executable("ffprobe"))).unwrap(), + b"prober" + ); + let missing = unpack(&archive, &["ffplay"], &bin).unwrap_err(); + assert!(missing.contains("does not contain")); + } +} diff --git a/src/selector.rs b/src/selector.rs index e4495d4..d2967e4 100644 --- a/src/selector.rs +++ b/src/selector.rs @@ -35,6 +35,9 @@ fn list() { println!("\nrun: just <tool> [args] (e.g. `just qr hello`, `just help video`)"); println!("defaults: just --defaults-path (interactive changes save automatically)"); println!("shell: just init <powershell|bash|zsh|fish> (mkcd, claude_, codex_)"); + if cfg!(windows) { + println!("explorer: just context install (right-click menu for files and folders)"); + } } fn normalized_tool(value: &str) -> String { @@ -53,6 +56,12 @@ pub fn run(args: Vec<OsString>) -> ToolResult { if args.first().is_some_and(|arg| arg == "install") { return crate::install::run(args.into_iter().skip(1).collect()); } + if args.first().is_some_and(|arg| arg == "context") { + return crate::context::run(args.into_iter().skip(1).collect()); + } + if args.first().is_some_and(|arg| arg == "deps") { + return fetch_dependencies(&args[1..]); + } if args.first().is_some_and(|arg| arg == "init") { return crate::shell::run(args.into_iter().skip(1).collect()); } @@ -138,6 +147,37 @@ pub fn run(args: Vec<OsString>) -> ToolResult { } } +/// `just deps fetch <yt-dlp|ffmpeg> ...` downloads the managed copy of each +/// named program now, whether or not one is already on `PATH`. +fn fetch_dependencies(args: &[OsString]) -> ToolResult { + let usage = || ToolError::usage("just", "usage: just deps fetch <yt-dlp|ffmpeg> ..."); + let (Some(command), names) = (args.first(), args.get(1..).unwrap_or_default()) else { + return Err(usage()); + }; + if command != "fetch" || names.is_empty() { + return Err(usage()); + } + for name in names { + let program = name + .to_str() + .and_then(crate::managed::Program::from_name) + .ok_or_else(usage)?; + let directory = crate::managed::fetch("just", program) + .map_err(|message| ToolError::new("just", message))?; + println!("{}", directory.display()); + } + Ok(()) +} + +/// Let the user choose a tool from the browser without running it. +pub(crate) fn pick() -> ToolResult<Option<&'static str>> { + let selection = choose(None) + .map_err(|error| ToolError::new("just", format!("terminal UI failed: {error}")))?; + Ok(selection + .and_then(|index| COMMANDS.get(index)) + .map(|command| command.name)) +} + struct App { selected: usize, table: TableState, diff --git a/tests/native_cli.rs b/tests/native_cli.rs index 806ded0..577d920 100644 --- a/tests/native_cli.rs +++ b/tests/native_cli.rs @@ -11,12 +11,14 @@ const COMMANDS: &[&str] = &[ "justbunt", "justcommit", "justcrop", + "justip", "justjpg", "justjson", "justlinks", "justmkcd", "justmp3", "justoptimize", + "justpaste", "justpdf", "justpng", "justport", @@ -225,6 +227,105 @@ fn install_creates_native_aliases_and_backs_up_legacy_scripts() { assert!(String::from_utf8_lossy(&bunt_help.stdout).contains("justbunt")); } +/// A stand-in for a public address service, so the tests never reach the +/// network. It answers `connections` requests with the same response. +fn fake_ip_service( + status: &'static str, + body: &'static str, + connections: usize, +) -> (String, thread::JoinHandle<()>) { + let listener = TcpListener::bind("127.0.0.1:0").unwrap(); + let address = listener.local_addr().unwrap(); + let handle = thread::spawn(move || { + for _ in 0..connections { + let (mut stream, _) = listener.accept().unwrap(); + // A GET has no body, so its headers are the whole request. + // Answering before they arrive would leave the client writing + // into a closed socket. + let mut request = Vec::new(); + let mut buffer = [0_u8; 2048]; + while !request.windows(4).any(|bytes| bytes == b"\r\n\r\n") { + let count = stream.read(&mut buffer).unwrap(); + assert!(count > 0, "request ended before its headers"); + request.extend_from_slice(&buffer[..count]); + } + write!( + stream, + "HTTP/1.1 {status}\r\nContent-Type: text/plain\r\nContent-Length: {}\r\nConnection: close\r\n\r\n{body}", + body.len() + ) + .unwrap(); + } + }); + (format!("http://{address}/"), handle) +} + +#[test] +fn justip_reports_both_families_without_a_switch() { + let (ipv4, ipv4_service) = fake_ip_service("200 OK", "203.0.113.7\n", 1); + let (ipv6, ipv6_service) = fake_ip_service("200 OK", "2001:db8::7\n", 1); + let output = Command::new(binary()) + .args(["ip", "--json"]) + .env("JUSTIP_IPV4_URL", &ipv4) + .env("JUSTIP_IPV6_URL", &ipv6) + .output() + .unwrap(); + assert!( + output.status.success(), + "{}", + String::from_utf8_lossy(&output.stderr) + ); + assert_eq!( + String::from_utf8_lossy(&output.stdout).trim(), + r#"{"ipv4":"203.0.113.7","ipv6":"2001:db8::7"}"# + ); + ipv4_service.join().unwrap(); + ipv6_service.join().unwrap(); +} + +#[test] +fn justip_falls_back_and_refuses_an_answer_from_the_wrong_family() { + let (failing, failing_service) = fake_ip_service("500 Internal Server Error", "nope", 1); + let (working, working_service) = fake_ip_service("200 OK", "203.0.113.7", 1); + // The IPv6 service answers with an IPv4 address, which must be discarded + // rather than reported under the wrong label. + let (confused, confused_service) = fake_ip_service("200 OK", "203.0.113.7", 1); + let output = Command::new(binary()) + .args(["ip", "--plain"]) + .env("JUSTIP_IPV4_URL", format!("{failing};{working}")) + .env("JUSTIP_IPV6_URL", &confused) + .output() + .unwrap(); + // One family answering is still an answer, so the run succeeds. + assert!( + output.status.success(), + "{}", + String::from_utf8_lossy(&output.stderr) + ); + assert_eq!(String::from_utf8_lossy(&output.stdout), "203.0.113.7\n"); + let stderr = String::from_utf8_lossy(&output.stderr); + assert!(stderr.contains("IPv6 unavailable"), "{stderr}"); + assert!(stderr.contains("wrong address family"), "{stderr}"); + failing_service.join().unwrap(); + working_service.join().unwrap(); + confused_service.join().unwrap(); +} + +#[test] +fn justip_fails_when_no_requested_family_answers() { + let (failing, failing_service) = fake_ip_service("500 Internal Server Error", "nope", 1); + let output = Command::new(binary()) + .args(["ip", "-4"]) + .env("JUSTIP_IPV4_URL", &failing) + .output() + .unwrap(); + assert_eq!(output.status.code(), Some(1)); + assert!(output.stdout.is_empty()); + let stderr = String::from_utf8_lossy(&output.stderr); + assert!(stderr.contains("no public address available"), "{stderr}"); + failing_service.join().unwrap(); +} + #[test] fn bunt_snapshot_runs_through_short_dispatch() { let snapshot = run(&["bunt", "--snapshot"]); @@ -650,6 +751,8 @@ fn missing_dependency_never_installs_without_a_terminal() { .arg("video") .arg(&input) .env("PATH", &fake_bin) + // Without this the missing FFmpeg would simply be downloaded. + .env("JUSTTOOLS_NO_DOWNLOAD", "1") .env_remove("FFMPEG_BIN") .output() .unwrap(); @@ -660,6 +763,38 @@ fn missing_dependency_never_installs_without_a_terminal() { assert!(!directory.path().join("clip-web.mp4").exists()); } +#[test] +fn media_url_dry_run_reports_the_download_without_network_access() { + let directory = tempfile::tempdir().unwrap(); + let result = Command::new(binary()) + .args(["video", "--dry-run", "https://example.test/watch?v=1"]) + .current_dir(directory.path()) + .env("PATH", directory.path()) + .output() + .unwrap(); + assert!( + result.status.success(), + "{}", + String::from_utf8_lossy(&result.stderr) + ); + let report = String::from_utf8_lossy(&result.stdout); + assert!(report.contains("1 download(s) with yt-dlp"), "{report}"); + assert!( + report.contains("https://example.test/watch?v=1 -> "), + "{report}" + ); + assert!(report.contains("<title> [<id>].mp4"), "{report}"); + assert_eq!(fs::read_dir(directory.path()).unwrap().count(), 0); +} + +#[test] +fn image_tools_refuse_urls_instead_of_reading_them_as_paths() { + let result = run(["png", "https://example.test/logo.png"].as_ref()); + assert_eq!(result.status.code(), Some(2)); + let error = String::from_utf8_lossy(&result.stderr); + assert!(error.contains("reads local files"), "{error}"); +} + #[test] fn zip_uses_the_git_file_set_and_writes_a_readable_archive() { let directory = tempfile::tempdir().unwrap(); @@ -1189,3 +1324,337 @@ fn invalid_selector_option_uses_the_standard_usage_exit() { assert_eq!(result.status.code(), Some(2)); assert!(String::from_utf8_lossy(&result.stderr).contains("Try 'just --help'")); } + +#[test] +fn context_menu_entries_run_the_same_headless_command_they_show() { + let directory = tempfile::tempdir().unwrap(); + let image = directory.path().join("wide photo.png"); + let unrelated = directory.path().join("notes.txt"); + image::RgbaImage::from_pixel(1200, 600, image::Rgba([20, 80, 160, 255])) + .save(&image) + .unwrap(); + fs::write(&unrelated, "not an image").unwrap(); + // Explorer hands the selection over in a list file that is consumed. + let list = directory.path().join("selection.txt"); + fs::write( + &list, + format!("{}\r\n{}\r\n", image.display(), unrelated.display()), + ) + .unwrap(); + + let result = Command::new(binary()) + .args(["context", "run", "resize.1024", "--list"]) + .arg(&list) + .output() + .unwrap(); + assert!( + result.status.success(), + "context run failed: {}", + String::from_utf8_lossy(&result.stderr) + ); + let stdout = String::from_utf8_lossy(&result.stdout); + assert!( + stdout.contains("Headless: justresize --max 1024 'wide photo.png'"), + "{stdout}" + ); + assert!(!list.exists(), "the selection list must be consumed"); + assert!(image.is_file(), "the source must be kept"); + assert_eq!( + image::image_dimensions(directory.path().join("wide photo-resized.png")).unwrap(), + (1024, 512) + ); +} + +#[test] +fn context_menu_refuses_unknown_entries_and_selections_a_tool_cannot_read() { + let unknown = run(&["context", "run", "video.9000", "clip.mp4"]); + assert_eq!(unknown.status.code(), Some(2)); + assert!(String::from_utf8_lossy(&unknown.stderr).contains("unknown context-menu entry")); + + let unreadable = run(&["context", "run", "optimize", "song.mp3"]); + assert_eq!(unreadable.status.code(), Some(1)); + assert!(String::from_utf8_lossy(&unreadable.stderr).contains("JustOptimize reads")); + + // Launcher entries are interactive, so they never run without a terminal. + let launcher = run(&["context", "run", "video.options", "clip.mp4"]); + assert_eq!(launcher.status.code(), Some(1)); + assert!(String::from_utf8_lossy(&launcher.stderr).contains("needs a terminal")); + + let help = run(&["context", "--help"]); + assert!(help.status.success()); + assert!(String::from_utf8_lossy(&help.stdout).contains("just context install")); +} + +#[test] +fn context_package_layout_is_ready_for_signing() { + let directory = tempfile::tempdir().unwrap(); + let layout = directory.path().join("package"); + let result = Command::new(binary()) + .args([ + "context", + "package", + "--publisher", + "CN=Example", + "--output", + ]) + .arg(&layout) + .output() + .unwrap(); + assert!( + result.status.success(), + "{}", + String::from_utf8_lossy(&result.stderr) + ); + let manifest = fs::read_to_string(layout.join("AppxManifest.xml")).unwrap(); + assert!(manifest.contains(r#"Publisher="CN=Example""#)); + assert!(manifest.contains(r#"<desktop5:ItemType Type=".mp4">"#)); + assert!(layout.join("Assets").join("logo-44.png").is_file()); +} + +#[test] +fn video_resolution_is_validated_before_any_file_is_touched() { + let directory = tempfile::tempdir().unwrap(); + let clip = directory.path().join("clip.mp4"); + fs::write(&clip, b"not really a video").unwrap(); + let preview = Command::new(binary()) + .args(["video", "--resolution", "4k", "--dry-run"]) + .arg(&clip) + .output() + .unwrap(); + assert!( + preview.status.success(), + "{}", + String::from_utf8_lossy(&preview.stderr) + ); + assert!(String::from_utf8_lossy(&preview.stdout).contains("clip-web.mp4")); + + let invalid = Command::new(binary()) + .args(["video", "--resolution", "900p", "--dry-run"]) + .arg(&clip) + .output() + .unwrap(); + assert_eq!(invalid.status.code(), Some(2)); + assert!( + String::from_utf8_lossy(&invalid.stderr) + .contains("resolution must be 480p, 720p, 1080p, 1440p, 4k, or source") + ); +} + +#[test] +#[cfg(not(windows))] +fn context_menu_registration_is_windows_only() { + let result = run(&["context", "install"]); + assert_eq!(result.status.code(), Some(1)); + assert!(String::from_utf8_lossy(&result.stderr).contains("Windows File Explorer")); +} + +/// A stand-in web host for `justpaste`: `/photo` is a JPEG with no extension in +/// its address, `/post` is a page that declares that photo, and anything else +/// is missing. It serves until `requests` connections have been answered. +fn fake_paste_host(requests: usize) -> (String, thread::JoinHandle<()>) { + let listener = TcpListener::bind("127.0.0.1:0").unwrap(); + let address = listener.local_addr().unwrap(); + let handle = thread::spawn(move || { + for _ in 0..requests { + let (mut stream, _) = listener.accept().unwrap(); + let mut request = Vec::new(); + let mut buffer = [0_u8; 2048]; + while !request.windows(4).any(|bytes| bytes == b"\r\n\r\n") { + let count = stream.read(&mut buffer).unwrap(); + assert!(count > 0, "request ended before its headers"); + request.extend_from_slice(&buffer[..count]); + } + let request = String::from_utf8_lossy(&request).into_owned(); + let path = request.split_whitespace().nth(1).unwrap_or("/").to_owned(); + let (status, kind, body): (&str, &str, Vec<u8>) = match path.as_str() { + "/photo" => ( + "200 OK", + "image/jpeg", + b"\xff\xd8\xff\xe0 pretend jpeg".to_vec(), + ), + "/post" => ( + "200 OK", + "text/html; charset=utf-8", + b"<html><head><meta property=\"og:image\" content=\"/photo\"></head></html>" + .to_vec(), + ), + _ => ("404 Not Found", "text/plain", b"missing".to_vec()), + }; + write!( + stream, + "HTTP/1.1 {status}\r\nContent-Type: {kind}\r\nContent-Length: {}\r\nConnection: close\r\n\r\n", + body.len() + ) + .unwrap(); + stream.write_all(&body).unwrap(); + } + }); + (format!("http://{address}"), handle) +} + +#[test] +fn paste_saves_a_direct_file_and_numbers_a_taken_name() { + let directory = tempfile::tempdir().unwrap(); + let (host, server) = fake_paste_host(2); + for _ in 0..2 { + let result = Command::new(binary()) + .args(["paste", &format!("{host}/photo")]) + .current_dir(directory.path()) + .output() + .unwrap(); + assert!( + result.status.success(), + "justpaste failed: {}", + String::from_utf8_lossy(&result.stderr) + ); + } + server.join().unwrap(); + // The address has no extension, so the content type supplies one. + let first = fs::read(directory.path().join("photo.jpg")).unwrap(); + assert!(first.starts_with(b"\xff\xd8\xff")); + assert_eq!( + fs::read(directory.path().join("photo (2).jpg")).unwrap(), + first + ); + let leftovers: Vec<_> = fs::read_dir(directory.path()) + .unwrap() + .map(|entry| entry.unwrap().file_name().to_string_lossy().into_owned()) + .filter(|name| name.starts_with(".justpaste-")) + .collect(); + assert!( + leftovers.is_empty(), + "temporary files remain: {leftovers:?}" + ); +} + +#[test] +fn paste_falls_back_to_the_media_a_page_declares_when_yt_dlp_is_unavailable() { + let directory = tempfile::tempdir().unwrap(); + let output = directory.path().join("saved"); + let (host, server) = fake_paste_host(2); + let result = Command::new(binary()) + .args(["paste", "--output"]) + .arg(&output) + .arg(format!("{host}/post")) + .env("YTDLP_BIN", "justtools-test-missing-yt-dlp") + .output() + .unwrap(); + server.join().unwrap(); + assert!( + result.status.success(), + "justpaste failed: {}", + String::from_utf8_lossy(&result.stderr) + ); + assert!(output.join("photo.jpg").is_file()); +} + +#[test] +fn paste_reports_a_dead_link_and_previews_without_the_network() { + let directory = tempfile::tempdir().unwrap(); + let (host, server) = fake_paste_host(1); + let dead = Command::new(binary()) + .args(["paste", &format!("{host}/gone")]) + .env("YTDLP_BIN", "justtools-test-missing-yt-dlp") + .current_dir(directory.path()) + .output() + .unwrap(); + server.join().unwrap(); + assert_eq!(dead.status.code(), Some(1)); + assert!(String::from_utf8_lossy(&dead.stderr).contains("could not be fetched")); + assert_eq!(fs::read_dir(directory.path()).unwrap().count(), 0); + + // No server is listening for this one: a dry run must not connect. + let preview = run(&["paste", "--dry-run", "https://example.invalid/clip"]); + assert!(preview.status.success()); + assert!(String::from_utf8_lossy(&preview.stdout).contains("https://example.invalid/clip")); + + let not_a_link = run(&["paste", "clip.mp4"]); + assert_eq!(not_a_link.status.code(), Some(2)); + assert!(String::from_utf8_lossy(¬_a_link.stderr).contains("http(s) link")); +} + +/// Downloads the real vendor builds, so it only runs when asked for: +/// `cargo test --test native_cli managed_downloads -- --ignored`. +#[test] +#[ignore = "downloads yt-dlp and FFmpeg from their vendors"] +fn managed_downloads_fetch_verified_programs_that_run() { + let directory = tempfile::tempdir().unwrap(); + let result = Command::new(binary()) + .args(["deps", "fetch", "yt-dlp", "ffmpeg"]) + .env("JUSTTOOLS_DEPS_DIR", directory.path()) + .output() + .unwrap(); + assert!( + result.status.success(), + "{}", + String::from_utf8_lossy(&result.stderr) + ); + let version = Command::new(directory.path().join(executable_name("yt-dlp"))) + .arg("--version") + .output() + .unwrap(); + assert!(version.status.success(), "yt-dlp does not run"); + let encoders = Command::new(directory.path().join(executable_name("ffmpeg"))) + .args(["-hide_banner", "-encoders"]) + .output() + .unwrap(); + let encoders = String::from_utf8_lossy(&encoders.stdout).into_owned(); + for encoder in ["libx264", "libmp3lame", "aac"] { + assert!(encoders.contains(encoder), "FFmpeg lacks {encoder}"); + } + let probe = Command::new(directory.path().join(executable_name("ffprobe"))) + .arg("-version") + .output() + .unwrap(); + assert!(probe.status.success(), "ffprobe does not run"); + let leftovers = fs::read_dir(directory.path()) + .unwrap() + .filter(|entry| { + entry + .as_ref() + .unwrap() + .file_name() + .to_string_lossy() + .starts_with(".download-") + }) + .count(); + assert_eq!(leftovers, 0, "temporary downloads remain"); +} + +#[test] +fn deps_fetch_needs_a_program_it_manages() { + let nothing = run(&["deps", "fetch"]); + assert_eq!(nothing.status.code(), Some(2)); + assert!(String::from_utf8_lossy(¬hing.stderr).contains("just deps fetch")); + let unmanaged = run(&["deps", "fetch", "git"]); + assert_eq!(unmanaged.status.code(), Some(2)); +} + +#[test] +fn a_downloaded_program_is_used_when_path_has_none() { + let directory = tempfile::tempdir().unwrap(); + let managed = directory.path().join("managed"); + let empty = directory.path().join("empty-path"); + fs::create_dir(&managed).unwrap(); + fs::create_dir(&empty).unwrap(); + // Stand-ins: resolving them is the point, and they fail when run. + for name in ["ffmpeg", "ffprobe"] { + fs::write(managed.join(executable_name(name)), b"stand-in").unwrap(); + } + let clip = directory.path().join("clip.mp4"); + fs::write(&clip, b"not decoded before the encoder is checked").unwrap(); + let result = Command::new(binary()) + .arg("video") + .arg(&clip) + .env("PATH", &empty) + .env("JUSTTOOLS_DEPS_DIR", &managed) + .env("JUSTTOOLS_NO_DOWNLOAD", "1") + .env_remove("FFMPEG_BIN") + .output() + .unwrap(); + let error = String::from_utf8_lossy(&result.stderr); + // Reaching the stand-in proves it was resolved; no installer was proposed. + assert!(!result.status.success()); + assert!(!error.contains("interactive confirmation"), "{error}"); + assert!(!error.contains("proposed command"), "{error}"); +} From 50bab0d9f3f5639d33b99d905c049d63c38bc1d7 Mon Sep 17 00:00:00 2001 From: "James P. Verde" <james@justsuperhuman.com> Date: Thu, 1 Oct 2026 13:26:38 -0400 Subject: [PATCH 2/3] fix: Use as_chunks for fixed-size chunks flagged by Rust 1.99 clippy Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --- ports/core-tools/src/links.rs | 6 ++++-- ports/core-tools/src/pdf/images.rs | 22 +++++++++++++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/ports/core-tools/src/links.rs b/ports/core-tools/src/links.rs index ca54d98..a1a05d2 100644 --- a/ports/core-tools/src/links.rs +++ b/ports/core-tools/src/links.rs @@ -568,8 +568,10 @@ fn text_links(text: &str) -> Vec<Found> { fn decode_text(bytes: &[u8]) -> Option<String> { let utf16 = |bytes: &[u8], from: fn([u8; 2]) -> u16| { let units: Vec<u16> = bytes - .chunks_exact(2) - .map(|pair| from([pair[0], pair[1]])) + .as_chunks::<2>() + .0 + .iter() + .map(|pair| from(*pair)) .collect(); String::from_utf16_lossy(&units) }; diff --git a/ports/core-tools/src/pdf/images.rs b/ports/core-tools/src/pdf/images.rs index 881ac33..edc800a 100644 --- a/ports/core-tools/src/pdf/images.rs +++ b/ports/core-tools/src/pdf/images.rs @@ -509,9 +509,11 @@ fn unpack(data: &[u8], row: usize, per_row: usize, height: usize, bits: usize) - match bits { 8 => samples.extend(row[..per_row].iter().map(|byte| u16::from(*byte))), 16 => samples.extend( - row.chunks_exact(2) + row.as_chunks::<2>() + .0 + .iter() .take(per_row) - .map(|pair| u16::from_be_bytes([pair[0], pair[1]])), + .map(|pair| u16::from_be_bytes(*pair)), ), _ => { let per_byte = 8 / bits; @@ -667,7 +669,15 @@ fn decode_raw( fn to_gray_or_rgb(color: &Color, values: Vec<u8>) -> (usize, Vec<u8>) { match color { Color::Gray => (1, values), - Color::Cmyk => (3, values.chunks_exact(4).flat_map(cmyk_to_rgb).collect()), + Color::Cmyk => ( + 3, + values + .as_chunks::<4>() + .0 + .iter() + .flat_map(|cmyk| cmyk_to_rgb(cmyk)) + .collect(), + ), _ => (3, values), } } @@ -704,7 +714,7 @@ fn color_key( .map(|pixel| { let keyed = pixel .iter() - .zip(ranges.chunks_exact(2)) + .zip(ranges.as_chunks::<2>().0) .all(|(sample, range)| (range[0]..=range[1]).contains(&i64::from(*sample))); if keyed { 0 } else { 255 } }) @@ -738,7 +748,9 @@ fn mask_alpha( } else { picture .pixels - .chunks_exact(3) + .as_chunks::<3>() + .0 + .iter() .map(|pixel| pixel[0]) .collect() }; From 1cffd1d5f0a159ccd736787a2badaa47f56d71fc Mon Sep 17 00:00:00 2001 From: "James P. Verde" <james@justsuperhuman.com> Date: Thu, 1 Oct 2026 13:41:29 -0400 Subject: [PATCH 3/3] test: Use portable basename in the fish helper test Ubuntu 22.04 ships fish 3.3, which predates the path builtin. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --- tests/shell/fish.fish | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/shell/fish.fish b/tests/shell/fish.fish index 6384da1..e79b0a1 100644 --- a/tests/shell/fish.fish +++ b/tests/shell/fish.fish @@ -1,7 +1,7 @@ set -l start "$PWD" set -gx JUSTTOOLS_MKCD_RESULT previous-value mkcd 'my folder [x] café'; or exit 1 -test (path basename "$PWD") = 'my folder [x] café'; or exit 1 +test (basename -- "$PWD") = 'my folder [x] café'; or exit 1 test "$JUSTTOOLS_MKCD_RESULT" = previous-value; or exit 1 set -l inside "$PWD" mkcd --help >/dev/null; or exit 1 @@ -14,9 +14,9 @@ test "$PWD" = "$inside"; or exit 1 if mkcd first second; exit 1; end test ! -e first; or exit 1 just mkcd -p parent/child; or exit 1 -test (path basename "$PWD") = child; or exit 1 +test (basename -- "$PWD") = child; or exit 1 justmkcd -- --literal; or exit 1 -test (path basename "$PWD") = --literal; or exit 1 +test (basename -- "$PWD") = --literal; or exit 1 cd "$start" mkdir stubs printf '%s\n' '#!/bin/sh' 'printf "<%s>\n" "$@"' 'exit 19' > stubs/claude