jackherd 1.8.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/INSTALL.md +2 -0
  3. package/README.md +41 -60
  4. package/assets/branding/README.md +5 -7
  5. package/assets/branding/jackherd-logo-outline.svg +1 -0
  6. package/assets/branding/outline.test.ts +30 -0
  7. package/assets/icons/bark.svg +1 -1
  8. package/assets/icons/bowl.svg +1 -1
  9. package/assets/icons/decide.svg +1 -1
  10. package/assets/icons/ear.svg +1 -1
  11. package/assets/icons/lanes.svg +1 -1
  12. package/assets/icons/plan.svg +1 -1
  13. package/dist/{chunk-M6DDZEW4.js → chunk-MCP4XJQH.js} +17 -0
  14. package/dist/config.d.ts +6 -0
  15. package/dist/config.js +19 -3
  16. package/dist/plan-format.d.ts +22 -3
  17. package/dist/plan-format.js +21 -7
  18. package/herdr-plugin/herdr-plugin.toml +1 -1
  19. package/install.sh +1 -1
  20. package/kit/hooks/hooks/approval-gate/index.ts +22 -4
  21. package/kit/hooks/hooks/approval-gate/run.ts +29 -6
  22. package/kit/hooks/hooks/approval-gate/subagent.ts +18 -0
  23. package/kit/hooks/hooks/merge-guard/decision.ts +70 -21
  24. package/kit/hooks/hooks/merge-guard/xargs-program.ts +182 -0
  25. package/kit/hooks/hooks/sent-file/index.ts +19 -0
  26. package/kit/hooks/hooks/sent-file/record.ts +128 -0
  27. package/kit/hooks/hooks/sent-file/run.ts +48 -0
  28. package/kit/hooks/hooks/sent-file/store.ts +18 -0
  29. package/kit/hooks/hooks/shared/board-lanes.ts +15 -2
  30. package/kit/hooks/hooks.json +9 -0
  31. package/kit/hooks/statusline.sh +1 -1
  32. package/kit/workflow/skills/implement/SKILL.md +2 -0
  33. package/kit/workflow/skills/orchestrate/SKILL.md +31 -6
  34. package/package.json +3 -1
  35. package/schemas/jackherd.schema.json +26 -2
  36. package/src/cli.ts +3 -0
  37. package/src/config/read-config.ts +5 -1
  38. package/src/config/schema.ts +22 -2
  39. package/src/context/fill.ts +12 -0
  40. package/src/context/session-log.ts +43 -1
  41. package/src/plan-format/clock.ts +4 -0
  42. package/src/plan-format/dependencies.ts +2 -5
  43. package/src/plan-format/lanes.ts +30 -5
  44. package/src/plan-format/terminal-text.ts +4 -0
  45. package/src/plan-format/waiting.ts +48 -0
  46. package/src/plans/active-tasks.ts +60 -0
  47. package/src/plans/current-phase.ts +17 -7
  48. package/src/plans/current-task.ts +63 -5
  49. package/src/plans/lane-standing.ts +12 -6
  50. package/src/plans/lane-summary.ts +141 -74
  51. package/src/plans/lane-tickets.ts +15 -0
  52. package/src/plans/layout-phase.ts +57 -18
  53. package/src/plans/layout-summary.ts +85 -67
  54. package/src/plans/layout.ts +253 -89
  55. package/src/plans/live.ts +22 -0
  56. package/src/plans/phase-models.ts +1 -1
  57. package/src/plans/phase-ranges.ts +45 -0
  58. package/src/plans/pull-requests.ts +6 -0
  59. package/src/plans/selection.ts +19 -16
  60. package/src/plans/sent-files-read.ts +22 -0
  61. package/src/plans/sent-files.ts +121 -0
  62. package/src/plans/signals-read.ts +54 -0
  63. package/src/plans/snapshot.ts +251 -55
  64. package/src/plans/subagents-read.ts +82 -0
  65. package/src/plans/subagents.ts +132 -0
  66. package/src/plans/texts.ts +16 -11
  67. package/src/plans/unlisted-lanes.ts +10 -5
  68. package/src/plans/view.ts +3 -3
  69. package/src/plans/waiting-click.ts +76 -0
  70. package/src/preview/command.ts +83 -0
  71. package/src/preview/embed.ts +209 -0
  72. package/src/preview/images.ts +89 -0
  73. package/src/preview/open.ts +12 -0
  74. package/src/preview/options.ts +32 -0
  75. package/src/preview/page.ts +89 -0
  76. package/src/preview/render.ts +41 -0
  77. package/src/settled/board-row.ts +1 -2
  78. package/src/shared/is-record.ts +2 -0
  79. package/src/shared/private-records.ts +48 -0
  80. package/src/task-signals/agent.ts +15 -0
  81. package/src/task-signals/claude-read.ts +72 -0
  82. package/src/task-signals/claude-signals.ts +112 -0
  83. package/src/task-signals/command.ts +71 -0
  84. package/src/task-signals/fixtures/session.jsonl +7 -0
  85. package/src/task-signals/matcher.ts +96 -0
  86. package/src/task-signals/record-store.ts +40 -0
  87. package/src/task-signals/record.ts +68 -0
  88. package/src/task-signals/text.ts +13 -0
  89. package/src/task-signals/types.ts +14 -0
  90. package/src/terminal/open.ts +13 -6
  91. package/src/terminal/text.ts +8 -1
  92. package/src/terminal/width.ts +2 -1
  93. package/src/update/command.ts +2 -0
  94. package/src/update/config-shares.ts +30 -0
  95. package/src/update/update.ts +12 -1
  96. package/src/vocabulary/index.ts +33 -1
  97. package/src/waiting/command.ts +35 -0
  98. package/src/watch/appointments.ts +5 -5
  99. package/src/watch/approvals.ts +2 -2
  100. package/src/watch/command.ts +91 -5
  101. package/src/watch/failed-tests.ts +56 -10
  102. package/src/watch/failure-read.ts +18 -6
  103. package/src/watch/failures.ts +29 -5
  104. package/src/watch/feedback.ts +1 -1
  105. package/src/watch/gh-process.ts +9 -3
  106. package/src/watch/json-guards.ts +0 -3
  107. package/src/watch/lane-fill.ts +1 -1
  108. package/src/watch/lane-model.ts +1 -1
  109. package/src/watch/lane-parallel.ts +1 -1
  110. package/src/watch/lane-progress.ts +19 -7
  111. package/src/watch/lane-report.ts +5 -1
  112. package/src/watch/lane-rest.ts +28 -0
  113. package/src/watch/plan-badges.ts +9 -2
  114. package/src/watch/previews.ts +1 -1
  115. package/src/watch/pull-requests.ts +2 -1
  116. package/src/watch/source-path.ts +1 -1
  117. package/src/watch/sources.ts +1 -1
  118. package/src/watch/stream-output.ts +12 -7
  119. package/src/watch/task-parallel-input.ts +118 -0
  120. package/src/watch/task-parallel-read.ts +149 -0
  121. package/src/watch/task-parallel-touched.ts +39 -0
  122. package/src/watch/task-parallel.ts +206 -0
  123. package/src/watch/waiting-line.ts +19 -0
  124. package/src/watch/watch-events.ts +13 -1
  125. package/src/watch/workflow-runs.ts +2 -1
  126. package/assets/icons/bark-dark.svg +0 -1
  127. package/assets/icons/bowl-dark.svg +0 -1
  128. package/assets/icons/decide-dark.svg +0 -1
  129. package/assets/icons/ear-dark.svg +0 -1
  130. package/assets/icons/lanes-dark.svg +0 -1
  131. package/assets/icons/plan-dark.svg +0 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,45 @@
2
2
 
3
3
  What changed for people who use jackherd, newest first.
4
4
 
5
+ ## 1.9.0
6
+
7
+ - **An open lane in the herd takes fewer lines, and a red pull request says what failed where.** A failed test hangs under its check as `└ ✗ <package> · <test>`, the package read from the log (the monorepo task header, else the test file), the test path dim with `›`; a cut name unfolds on a click and folds on the next. The pull request title stays on one line, a lane's only link chip moves onto its session line, and the finished phases are ranges (`✓ P1–P7, P10–P15`). The label column (SESSION, PR, NOW, NEXT, LATER, DONE, LINKS) is gone: the tree lines and each row's mark (`⎇`, `↗`, `▶`/`▷`, `✓`) say what it is, and every row under a lane gains the 9 columns the labels took. Each running phase is a branch of its own, and the other open phases share one line, `next P18–P25` (ranges, the other plans by name after them). A reported task in other words still finds its plan task, and a lane that reports a task shows no guessed `▷`. The progress column is calmer: no `◐`, the `🥣` cell on a folded lane only from `warn`, and a hidden cell keeps its width, so no bar moves; the checkbox count stands on every lane line. A folded lane's title line in a narrow pane starts in the column of the lane's name, where an open lane's branches start too. A click on a for-you row now also lands right while `now:` lines stand above it.
8
+ - **A lane in the herd shows only the phases its board rows name.** It showed every phase of its plan, so phases another lane had just written stood under the lane's NOW while its own phase waited; the tally (`n/m`, `n/m ph`) counts the named phases too, a sub-phase (`P10c`) belonging to the phase a row names. A board row's range (`P17–P25`) names every phase it spans, where before only its first counted. A phase runs while some of its tasks are ticked and others open, while one of its boxes was ticked in the last 20 minutes, or while an agent reports it; task lines written into a phase, or a new phase without a tick, no longer make it run, and a phase with only its review gate open waits.
9
+ - **The herd's teal is the brand colour.** The teal accents (the working lane's dot, `▶`/`▷`, `↑n`) are exactly `#03B5BD`, as true colour where `COLORTERM` is `truecolor` or `24bit`, and 256-colour 37 elsewhere.
10
+ - **`jh watch` proposes open plan tasks that could run in parallel at a heartbeat** (`parallel tasks <lane>: …`): disjoint paths, none touched or reported by running agents (the coordinator's subagents in the lane's worktree included), extra agents costing less than `watch.parallelTasks.maxTokens` (default 100000, the baseline is the first answer of a session log). One free task beside a running agent counts; a lane with no active work gets no proposal; once per changed situation; nothing starts by itself.
11
+ - **The merge guard no longer asks for an interpreter script whose text merely contains the command words apart** (a path segment `workflow` and a `run` elsewhere): where the program is hidden, the words count only as adjacent whole tokens, with quotes, commas, brackets and gh options between them. An option value that brackets or braces cut into several tokens (`-R "${REPO}"`, `REPOS[0]`, `os.environ["GH_REPO"]`, an f-string) no longer hides the words after it, so those calls ask again.
12
+ - **`jh preview` is hardened.** An image is embedded only when its answer carries a plain `image/<subtype>` type, an image address is escaped before it goes into the page (also the one behind GitHub's image proxy) and read back unescaped before it is fetched, so a badge address with `&` in it fetches the right image, and a local image is read only when it is a regular file whose real path, links followed, lies inside the package. `jh watch` reads the task signals of subagent logs written within the activity window only, and the writes of at most the 20 newest subagent logs of a session.
13
+ - **The herd's arrow follows the task an agent works on.** It stood on the first open task of a phase; now the open task whose words the lane's agent (or a subagent working in its worktree) used most in its last 40 log entries gets the arrow, when it clearly leads (at least 3 of its distinctive words and 40 %); otherwise the first open task, as before.
14
+ - **`jh task start "<text>"` and `jh task done` report the task an agent works on.** One record per agent in `.jackherd/tasks/` (a new `start` replaces the agent's task); the kit skills `/implement` and `/orchestrate` tell every building agent to report. `jh task done` without an open task is silent and exits 0, so a second call is no error; with text that names another task than the open one it exits 1.
15
+ - **The herd's arrow comes from what agents report, in every case.** It reads Claude Code's task list (`TaskCreate`/`TaskUpdate`, `TodoWrite`) from the logs of the sessions and subagents of every worktree and of the coordinator, and the records of `jh task`, and matches them to open plan tasks. Every active task carries its own `▶`, a phase with an active task runs, so a lane may show several active phases; the agent's name stands dim after the title only while more than one agent is active in the lane. A report that matches no open task shows as `now: <text>` under its lane, under the title when no lane fits (also without herdr). A `jh task` record counts only while it is younger than the lane's last tick; agent text is cleaned of control characters. Without any report the word guess stays, drawn as a dim `▷` with a plain title.
16
+ - **The herd's arrow is teal, not yellow.** `▶` on a task is teal with a bold title, as the working lane's dot is; yellow stays for what is blocked or waits on you. The legend (`?`) names `▶` and `▷`.
17
+ - **The open lane's tree names each thing once.** An open lane no longer repeats its phase on the lane line; a folded lane names it compactly, `P3 Search API +1 · 12/20` (`+n` more active phases). The running phases stand by number, never by recency, each with its age, its count and `· gate` while only the review gate is open, without an arrow on the phase row; arrows stand before tasks only, and an agent's name stands dim at the right edge of its task, only while more than one agent is active. An open lane shows per active phase only its active tasks; a click on the phase row shows the other open ones and the next click folds them. Only you change a fold; a new active task adds its own row.
18
+ - **Files sent to you and published artifacts stay in sight.** The new kit hook `sent-file` (PostToolUse on `SendUserFile` and `Artifact`) records each send with time and caption in `.jackherd/sent/`. `jh herd` shows the files as `📎` badges among the link chips of the lane they belong to (linked by their `file:` address; an artifact by its URL), the sends nobody closed wait on you next to the board's rows (top of the herd, heartbeat, status line), and `jh waiting close <id>` (or `--all`) closes them after your answer; `jh waiting` lists them.
19
+ - **A draft for review is published as one Artifact.** `/orchestrate` names the `Artifact` tool: with it, and unless `preview.publish` is `false` in `.jackherd/config.json`, the coordinator publishes the `jh preview` page as a private Artifact and updates the same URL each round; without it, a file card or `jh preview --open`. `jh preview` embeds external images (badges) as data addresses so the page is complete where it may load nothing from outside, and warns once for an image it could not fetch. It fetches only `https` images from public hosts (no loopback, private or link-local address, also after a redirect) and at most 5 MB each.
20
+ - **`jh herd` stays calm.** The lanes keep the order of the board, whatever their states are (the order by urgency is gone; the state shows in the symbol and colour of each line, and what waits on you sits on top). A lane opens by itself only when it first appears; a change of status no longer opens or closes it, so a lane you folded stays folded.
21
+ - **A click on a `📎` row opens it.** In `jh herd` a plain left click on a file or Artifact in the block of what waits on you opens it with the platform's opener (`xdg-open`, `open`); a `?` row opens nothing and a failure shows in the footer. `jh preview --open` shares the opener (`src/terminal/open.ts`).
22
+ - **The herd's lane line names the state only for `blocked`.** The symbol at the row start carries working, idle, done, unknown and no agent (colour unchanged); a blocked lane writes `blocked` in front of its own phase title (no column, so no other row moves). The legend names every symbol; the watcher and the heartbeat keep their words.
23
+ - **Long for-you rows expand by click.** A `📎`/`?` row wider than the pane expands on a click (wrapped over several lines); a question folds on the next click, a file or Artifact opens on it. A row that fits opens its file at once.
24
+ - **The coordinator's hand-over thresholds default to 350 000 / 500 000 tokens** (`plans.context.coordinator`, were 200 000 / 300 000), since a fresh coordinator chat already starts near 200 000; the 60 % / 85 % cap of a smaller window stays. The `statusline.sh` template follows.
25
+ - **`jh preview --open` works on Windows again** through the shared opener (`rundll32 url.dll,FileProtocolHandler`, which hands the target over without a shell).
26
+ - **`jh preview` renders long documents and answers `--help`.** The Markdown went to `gh api /markdown` as an argument and failed with `E2BIG` for a long plan; it goes through standard input now. `jh preview --help` (and `-h`) prints the usage and exits 0.
27
+ - **A question or a waiting agent no longer sinks in the coordinator's pane.** `jh herd` shows a subagent of the coordinator that builds in a worktree as `working` (and as `blocked` while the approval gate holds a request of it), also when the worktree has no row in the board; the row carries the subagent's description and the branch. The approval gate holds a permission request of such a subagent like a lane's, under the name `subagent-<type>-<id>`, so the watcher reports `approval …` instead of the dialog sitting in the coordinator's pane. The heartbeat and each status line name what a resting (`idle`, `done`) lane waits on, from the questions in its report: `a idle: waits on: <first question>, 2 open questions`.
28
+ - **What waits on you stays in sight.** A board section `## Wartet auf dich` (German) or `## Waiting for you` (English), one row `Seit | Punkt | Herkunft | Stand`, lists a preview sent, a question put to you or a report to accept. `jh herd` shows every open row on top as one line per item (a dim `▌`, then `📎 file` or `? question` in bold, `▌ +n` after five), closed by a rule labelled `woof`, and the watcher repeats them in each heartbeat and status until the row is closed in its status cell. `/orchestrate` says when Jack enters and closes a row.
29
+ - **The README is shorter and keeps each point once.** The section "Human on the loop" is gone; what it said sits where it belongs, in the intro (you decide, Jack asks only what the plan does not settle), in "What Jack does on his own, and what waits for you" and in "Guarded commands and merges", which now also names the refusal of a push to the base branch and the limit of the guards. Planning and building are told apart from the parts that need herdr, the quickstart is five bare steps, and the lines on lanes, boards, worktrees, the watcher and the fresh start say what they mean. `jh preview` is in the command list.
30
+ - **The feature icons load from a marked address.** Every icon in the README is `…/assets/icons/<name>.svg?v=2`. GitHub's image proxy keeps an unmarked address for a year, so npm kept showing the 1.8.0 icons, a few pixels too high. A test holds the mark in one place (`assets/icons/version.ts`) and compares the icon files with stored digests, so a changed icon without a new mark turns red.
31
+ - **`jh preview <markdown-file>`** renders a Markdown file through the GitHub API into a page that shows it in GitHub and npm style, light and dark, and at phone width (`--out`, `--open`).
32
+ - **`jh herd` shows a small fix as active.** It listed a lane as "no agent" when the board held a cleaned-up row and a newer open row of the same name, or when a cleaned-up lane had uncommitted changes in its worktree. A newer row without the mark now reopens the lane, and uncommitted changes make it active.
33
+ - **An open lane in `jh herd` keeps its tree.** Its pull requests hang on the tree as `PR`, behind the SESSION line, the chips row is labelled `LINKS`, and a pull request title no longer repeats the lane's ticket key.
34
+
35
+ ## 1.8.1
36
+
37
+ - **The README reads on npm in a dark browser.** npm wraps every image in a link, so a `<picture>` never switched to its dark source, and npm has no dark theme of its own; a phone in dark mode showed the light logo on black. Every image is now one version that works on white and on black: the logo is the dark one with a light outline around Jack, the letters, the lanes and the nodes (`assets/branding/jackherd-logo-outline.svg`), the terminal diagrams are always the dark ones, and the feature icons are mid-grey and teal. Each of the six points has its icon on the line of the bold title and its text below, so nothing wraps under an icon on a phone or on a desktop and the gaps are equal.
38
+ - **A German board may head its status column "Status".** The appointment table was read only with the column "Stand" and reported `missing columns: Stand` otherwise; "Stand" still counts, and so does "Status".
39
+ - **`jh update` writes context thresholds as tokens in a project without an install.** A project with only `.jackherd/config.json` kept the share (`warnAt`, `alertAt`) and the warning, since only `jh sync` rewrote it. `jh update` now writes `warnTokens` and `alertTokens` in place there too, with a line per block; a project with an install is still done by its sync.
40
+ - **The herd shows a worktree with uncommitted changes as a working lane**, with its phase and tasks, also when no herdr agent runs there, as when the coordinator's subagent builds a small fix. Before, it was folded into "no agent".
41
+ - **`/orchestrate`: a small fix that builds a phase of a plan gets a row in the board's lanes table** (name, plan link, phase), so the herd shows it; without a phase it stays one line in the history.
42
+ - **The merge guard no longer asks for a search through `xargs`.** `ls | xargs grep -l 'gh pr merge 602'` asked, because `xargs` counted as a runner that hides what it starts, and the guard then searched the whole command for the words. An `xargs` whose program is written out and is one that starts nothing (`grep`, `cat`, `head`, `wc`, `ls`, `rm` and a few more) is now read as that program's call, with its options (`-I {}`, `-n 1`, `-P 4`, `-a file`, `--arg-file=…`, the old `-i`) skipped; `xargs` without a program runs `echo` and passes too. A guarded program (`xargs gh`), a shell, `env`, `timeout`, `xargs`, an interpreter, `git`, `sed`, `awk`, any program not on the list, a program from a variable or a substitution, a glob, the replace string as the program (`xargs -I{} {} …`) and an option the guard does not know still ask when the command names the words.
43
+
5
44
  ## 1.8.0
6
45
 
7
46
  - **Context thresholds are tokens.** `plans.context.warnTokens` and `alertTokens` (default 250000 and 350000) and the same keys in `plans.context.coordinator` (default 200000 and 300000) replace the shares `warnAt` and `alertAt`, so a 1M window no longer warns only at 600000. The window only bounds the share the herd shows. A config with shares is read as tokens of the largest window it names (rounded to thousands), and `jh sync` writes it that way once, with a line per block; `jh sync --check` only says so. The status line colours by tokens too, at these defaults when the config sets no threshold, as `jh context` does. Each threshold stops at 60 % (warn) and 85 % (alert) of the model's window, so a 200k window warns at 120000 and alerts at 170000. `jh context` adds a line on stderr when Claude Code's auto-compact window (`CLAUDE_CODE_AUTO_COMPACT_WINDOW` for its own session, `modelSettings.<model>.autoCompactWindow` or `autoCompactWindow` in the project's and the user's settings) is not above `alertTokens`, since Claude Code then compacts before the hand-over.
package/INSTALL.md CHANGED
@@ -69,6 +69,8 @@ bunx jackherd sync # later: updates the kit files
69
69
 
70
70
  `init` writes what it [detected](#detected-per-repository) into the new config, so the project sees it. It asks whether to enter the status line (README, *Status line*) in `.claude/settings.json`; `--yes` or `--no` answer every question without asking.
71
71
 
72
+ **Everyone on the team needs Bun.** The project hooks run as `bun .claude/hooks/…`, and without Bun the guard hooks block the commands they check.
73
+
72
74
  **Name clashes.** A project that already has a skill or agent of a kit name (`implement`, `plan`, …): `init` names the clash and offers the prefix `jh-`, so the kit's copies sit beside yours and call each other, not yours. Any project can set `skillPrefix` in `.jackherd/config.json`; `sync` then renames, and removes the unprefixed kit files you never edited, with the directories they leave empty. A directory that holds a file of yours stays, and `sync` names it.
73
75
 
74
76
  **Your edits survive.** `sync` leaves files you have edited alone. When the kit changed one of them too, its version lands beside yours as `<file>.kit-new`: merge it, or take the kit version with `sync --accept <path>`. A kit file you deleted stays deleted. Project-specific additions go into `.claude/project/<skill>.md` (read first by the skill of that name) or a rule beside `.claude/rules/kit/`, so the kit files stay updatable.
package/README.md CHANGED
@@ -1,43 +1,37 @@
1
1
  <p>
2
- <picture>
3
- <source media="(prefers-color-scheme: dark)" srcset="https://unpkg.com/jackherd/assets/branding/jackherd-logo-dark.svg">
4
- <img alt="jackherd: a black and white Shih Tzu in a turquoise bandana, three lanes running from him to three agent nodes" src="https://unpkg.com/jackherd/assets/branding/jackherd-logo.svg" width="340">
5
- </picture>
2
+ <img alt="jackherd: a black and white Shih Tzu in a turquoise bandana, three lanes running from him to three agent nodes" src="https://unpkg.com/jackherd/assets/branding/jackherd-logo-outline.svg" width="340">
6
3
  <br>
7
4
  </p>
8
5
 
9
- [![npm](https://img.shields.io/npm/v/jackherd)](https://www.npmjs.com/package/jackherd) [![license: MIT](https://img.shields.io/npm/l/jackherd)](https://www.npmjs.com/package/jackherd) [![2 dependencies](https://img.shields.io/badge/dependencies-2-brightgreen)](https://www.npmjs.com/package/jackherd?activeTab=dependencies)<br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd/assets/icons/space.svg">
6
+ [![npm](https://img.shields.io/npm/v/jackherd)](https://www.npmjs.com/package/jackherd) [![license: MIT](https://img.shields.io/npm/l/jackherd)](https://www.npmjs.com/package/jackherd) [![2 dependencies](https://img.shields.io/badge/dependencies-2-brightgreen)](https://www.npmjs.com/package/jackherd?activeTab=dependencies)<br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd/assets/icons/space.svg?v=2">
10
7
 
11
- **Let AI do the work. Stay in control.** Build several features in parallel with Claude Code. Each runs in its own branch; you only answer the questions that need a human. Jack, the coordinator (the Shih Tzu in the logo, who herds anyway), handles the rest. In a project install, hooks hold merges and releases that touch risky paths until you approve, and refuse a push to your base branch.
8
+ # Your agents write code. Jack keeps the work moving.
12
9
 
13
- Install with one command, run `/jh-start` in a repository, and it offers your first plan: [Quickstart](#quickstart).<br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd/assets/icons/space.svg">
10
+ **Let AI do the work. Stay in control.** jackherd is a coordination layer for your coding agents, built around a plan in your repository. Claude Code alone builds it one phase at a time; with [herdr](https://herdr.dev), a terminal for coding agents, phases run in parallel, each in its own git worktree. Jack, the coordinator, keeps these lanes moving: he answers what the plan already settles and brings you only the decisions that need you.
11
+
12
+ Install with one command, run `/jh-start` in a repository, and it offers your first plan: [Quickstart](#quickstart).<br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd/assets/icons/space.svg?v=2">
14
13
 
15
14
  <p>
16
- <picture>
17
- <source media="(prefers-color-scheme: dark)" srcset="https://unpkg.com/jackherd/docs/workflow-dark.svg">
18
- <img src="https://unpkg.com/jackherd/docs/workflow.svg" width="720" alt="jackherd in herdr: a lane hits a question, Jack asks you as a choice, you pick, and the lane works on while the herd view counts its progress.">
19
- </picture>
15
+ <img src="https://unpkg.com/jackherd/docs/workflow-dark.svg" width="720" alt="jackherd in herdr: a lane hits a question, Jack asks you as a choice, you pick, and the lane works on while the herd view counts its progress.">
20
16
  <br>
21
- <sub>Parallel mode in herdr (optional). Planning and building work without it.</sub><br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd/assets/icons/space.svg">
17
+ <sub>Parallel lanes in herdr. Without herdr, you plan and build one phase at a time.</sub><br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd/assets/icons/space.svg?v=2">
22
18
  </p>
23
19
 
24
- <p><picture><source media="(prefers-color-scheme: dark)" srcset="https://unpkg.com/jackherd/assets/icons/plan-dark.svg"><img align="left" width="28" height="48" alt="" src="https://unpkg.com/jackherd/assets/icons/plan.svg"></picture><b>Plans live in your repository.</b> Markdown phases, a model each, ticked off as they are built.<br clear="left"></p>
20
+ <p><img src="https://unpkg.com/jackherd/assets/icons/decide.svg?v=2" width="24" height="34" align="middle" alt=""> <b>You decide. Jack takes care of the lanes.</b><br>Jack answers what the plan already settles, records his decisions on the board, and asks you about the rest. One approval per pull request covers its commits and pushes. Jack merges automatically only when you've allowed it and checks pass.</p>
25
21
 
26
- <p><picture><source media="(prefers-color-scheme: dark)" srcset="https://unpkg.com/jackherd/assets/icons/lanes-dark.svg"><img align="left" width="28" height="48" alt="" src="https://unpkg.com/jackherd/assets/icons/lanes.svg"></picture><b>Lanes stay apart.</b> A lane is one phase of a plan in its own git worktree and session, side by side in herdr, the terminal that holds the parallel sessions.<br clear="left"></p>
22
+ <p><img src="https://unpkg.com/jackherd/assets/icons/lanes.svg?v=2" width="24" height="34" align="middle" alt=""> <b>Lanes stay apart.</b><br>One phase per lane, on its own branch and worktree. Jack keeps the board's merge order and has the other lanes rebase after each merge.</p>
27
23
 
28
- <p><picture><source media="(prefers-color-scheme: dark)" srcset="https://unpkg.com/jackherd/assets/icons/decide-dark.svg"><img align="left" width="28" height="48" alt="" src="https://unpkg.com/jackherd/assets/icons/decide.svg"></picture><b>You decide. Jack takes care of the lanes.</b> He answers what the plan settles and asks you the rest.<br clear="left"></p>
24
+ <p><img src="https://unpkg.com/jackherd/assets/icons/bark.svg?v=2" width="24" height="34" align="middle" alt=""> <b>Jack barks when something moves.</b><br>One live view of the herd, all your lanes: state, plan progress, pull request, checks, feedback, context fill.</p>
29
25
 
30
- <p><picture><source media="(prefers-color-scheme: dark)" srcset="https://unpkg.com/jackherd/assets/icons/bark-dark.svg"><img align="left" width="28" height="48" alt="" src="https://unpkg.com/jackherd/assets/icons/bark.svg"></picture><b>Jack barks when something moves.</b> One live view of the herd, all your lanes: state, pull request, checks, feedback.<br clear="left"></p>
26
+ <p><img src="https://unpkg.com/jackherd/assets/icons/ear.svg?v=2" width="24" height="34" align="middle" alt=""> <b>Jack listens beyond GitHub.</b><br><code>/jh-follow</code> Jira, Linear, Sentry or a status page, and Jack reports changes while he runs in herdr.</p>
31
27
 
32
- <p><picture><source media="(prefers-color-scheme: dark)" srcset="https://unpkg.com/jackherd/assets/icons/ear-dark.svg"><img align="left" width="28" height="48" alt="" src="https://unpkg.com/jackherd/assets/icons/ear.svg"></picture><b>Jack listens beyond GitHub.</b> <code>/jh-follow</code> Jira, Linear, Sentry or a status page. Reports need herdr.<br clear="left"></p>
28
+ <p><img src="https://unpkg.com/jackherd/assets/icons/plan.svg?v=2" width="24" height="34" align="middle" alt=""> <b>One workflow for the whole team.</b><br>After <code>jh init</code>, plans, skills, rules and guard hooks are files in your repository. Commit them, and everyone who opens it in Claude Code works with the same set; changes to it go through your usual pull request review.</p>
33
29
 
34
- <p><picture><source media="(prefers-color-scheme: dark)" srcset="https://unpkg.com/jackherd/assets/icons/bowl-dark.svg"><img align="left" width="28" height="48" alt="" src="https://unpkg.com/jackherd/assets/icons/bowl.svg"></picture><b>Long sessions get a fresh start.</b> At a phase boundary, a lane whose context is filling up moves to a new chat.<br clear="left"></p>
30
+ <p><img src="https://unpkg.com/jackherd/assets/icons/bowl.svg?v=2" width="24" height="34" align="middle" alt=""> <b>Long chats get a fresh start.</b><br>A lane whose context fills up continues in a new chat at the end of its phase, from the ticked-off plan and a hand-over note.</p>
35
31
 
36
32
  ## Quickstart
37
33
 
38
- Planning and building work without herdr; parallel lanes need it.
39
-
40
- 1. **Install** (Linux and macOS; needs Claude Code and git). It asks a few setup questions and leaves your repositories alone. → [INSTALL.md](https://unpkg.com/jackherd/INSTALL.md)
34
+ 1. **Install** (Linux and macOS; needs Claude Code and git). → [INSTALL.md](https://unpkg.com/jackherd/INSTALL.md)
41
35
 
42
36
  ```bash
43
37
  curl -fsSL https://unpkg.com/jackherd/install.sh | sh
@@ -48,22 +42,22 @@ Planning and building work without herdr; parallel lanes need it.
48
42
  ```text
49
43
  Install jackherd by following https://unpkg.com/jackherd/INSTALL.md. Ask me the setup questions it lists; herdr is optional.
50
44
  ```
51
- 2. **Start Claude Code in a repository.** It checks the setup and offers your first plan.
45
+ 2. **Start Claude Code in a repository.**
52
46
 
53
47
  ```text
54
48
  /jh-start
55
49
  ```
56
- 3. **Plan.** Phases, tasks and a model for each, written to `docs/plans/`.
50
+ 3. **Create your first plan.** It lands in `docs/plans/`, and for parallel lanes `/jh-plan` offers to write a board.
57
51
 
58
52
  ```text
59
53
  /jh-plan Add product search
60
54
  ```
61
- 4. **Build,** one phase at a time, ticked off in the plan. No herdr needed.
55
+ 4. **Build the first phase.**
62
56
 
63
57
  ```text
64
58
  /jh-implement docs/plans/<plan>.md phase 1
65
59
  ```
66
- 5. **Or let Jack run the herd.** Inside [herdr](https://herdr.dev), one lane per phase, with the live herd view beside him (`jh herd` anywhere else).
60
+ 5. **Run phases in parallel with herdr (optional).** In Claude Code inside herdr, hand Jack the board:
67
61
 
68
62
  ```text
69
63
  /jh-orchestrate docs/plans/board-<name>/board.md
@@ -71,17 +65,12 @@ Planning and building work without herdr; parallel lanes need it.
71
65
 
72
66
  By hand (Bun 1.3+): `bun add -g jackherd` or `npm install -g jackherd`, then `jh init --global` for yourself, or `jh init` in a repository to give your team the same skills and guard hooks. → [INSTALL.md](https://unpkg.com/jackherd/INSTALL.md)
73
67
 
74
- ## Human on the loop
75
-
76
- You decide every open question, commit and push, once per pull request. Jack answers on his own what the plan already settles, never money, auth, secrets, a migration or a release. Once you've approved a plan and a pull request, he merges it on green checks and tells you in one line. The guards catch mistakes, not an agent set on getting around them; only branch protection stops that. A pull request that touches a workflow, a migration, a lockfile or `package.json` still asks, and so does every release. Prefer to see every merge? Approve per pull request instead.
68
+ ## In detail
77
69
 
78
70
  <details>
79
71
  <summary><b>What Jack does on his own, and what waits for you</b></summary>
80
72
 
81
- <picture>
82
- <source media="(prefers-color-scheme: dark)" srcset="https://unpkg.com/jackherd/docs/lanes-dark.svg">
83
- <img src="https://unpkg.com/jackherd/docs/lanes.svg" alt="Jack prompts two lanes and asks you for decisions and approvals; the lanes send questions back as text; jh watch reads lane state, pull requests and checks and wakes Jack.">
84
- </picture>
73
+ <img src="https://unpkg.com/jackherd/docs/lanes-dark.svg" alt="Jack prompts two lanes and asks you for decisions and approvals; the lanes send questions back as text; jh watch reads lane state, pull requests and checks and wakes Jack.">
85
74
 
86
75
  | On his own | After your approval | Never |
87
76
  | --- | --- | --- |
@@ -96,7 +85,7 @@ You decide every open question, commit and push, once per pull request. Jack ans
96
85
  <details>
97
86
  <summary><b>Guarded commands and merges</b></summary>
98
87
 
99
- In a project install, the `merge-guard` hook asks you before `gh pr merge`, `gh workflow run`, `gh run rerun` and a `gh api` write that merges, writes a file, dispatches or reruns a workflow, or moves a ref, also behind a chain, a wrapper or `sh -c`. The `git-guard` hook refuses a git command that hides a commit, push, rebase, reset, checkout or merge from your permission rules (`git -C … push`, `sh -c "…"`), and every force push, skipped hook and hard reset.
88
+ In a project install, the `merge-guard` hook asks you before `gh pr merge`, `gh workflow run`, `gh run rerun` and a `gh api` write that merges, writes a file, dispatches or reruns a workflow, or moves a ref, also behind a chain, a wrapper or `sh -c`. The `git-guard` hook refuses a git command that hides a commit, push, rebase, reset, checkout or merge from your permission rules (`git -C … push`, `sh -c "…"`), every push to the base branch, and every force push, skipped hook and hard reset.
100
89
 
101
90
  A merge passes without a question only on an answer from your own dialog: self-merge for that pull request, or the approval of its plan, with green checks and no file on a path that always asks (workflows, migrations, lockfiles, `package.json`, env files, agent instructions, and your own list). `merge.withoutChecks` lets a pull request that only touches such paths as docs merge without waiting for checks.
102
91
 
@@ -107,21 +96,16 @@ A merge passes without a question only on an answer from your own dialog: self-m
107
96
  }
108
97
  ```
109
98
 
110
- A global install ships no hooks, and the skills ask on their own.
99
+ The guards catch an agent's mistakes, not an agent set on getting around them; for that, use branch protection. A global install ships no hooks, and the skills ask on their own.
111
100
 
112
101
  </details>
113
102
 
114
- ## In detail
115
-
116
103
  <details>
117
104
  <summary><b>Plans, boards and the skills</b></summary>
118
105
 
119
- A **plan** is Markdown with phases, checkbox tasks, a model and a review gate per phase. A **board** lists the lanes: which phases each one works on, on which model, after what. A **lane** is one agent session in its own git worktree, and **Jack** is the session in the main checkout that runs `/jh-orchestrate`.
106
+ A **plan** is Markdown with phases, checkbox tasks, a model and a review gate per phase. A **board** lists the lanes of one or more plans: which phases each lane builds, on which model, after what. A **lane** is one agent session in its own git worktree (a second checkout of your repository), and **Jack** is the session in the main checkout that runs `/jh-orchestrate` on a board.
120
107
 
121
- <picture>
122
- <source media="(prefers-color-scheme: dark)" srcset="https://unpkg.com/jackherd/docs/skills-dark.svg">
123
- <img src="https://unpkg.com/jackherd/docs/skills.svg" alt="/jh-grill hands decisions to /jh-plan; /jh-plan feeds /jh-orchestrate or a single /jh-implement; /jh-implement ends in /jh-pre-commit, which runs the reviewers; /jh-diagnose hands a red command to /jh-implement.">
124
- </picture>
108
+ <img src="https://unpkg.com/jackherd/docs/skills-dark.svg" alt="/jh-grill hands decisions to /jh-plan; /jh-plan feeds /jh-orchestrate or a single /jh-implement; /jh-implement ends in /jh-pre-commit, which runs the reviewers; /jh-diagnose hands a red command to /jh-implement.">
125
109
 
126
110
  | Skill | Does |
127
111
  | --- | --- |
@@ -148,7 +132,7 @@ Each phase in the plan names its model: the planning model (Opus by default) whe
148
132
  <details>
149
133
  <summary><b>The watcher and tickets outside GitHub</b></summary>
150
134
 
151
- Jack doesn't watch the terminals himself. `jh watch`, which he starts himself, wakes him when a lane is blocked or done, a check turns red, a pull request gets feedback, a lane's context fills up or a lane waits for an approval; deploys and previews too, when configured.
135
+ Jack doesn't watch the terminals himself. `jh watch`, which he starts, wakes him when a lane is blocked or done, a check turns red, a pull request gets feedback, a lane's context fills up or a lane waits for an approval; deploys and previews too, when configured.
152
136
 
153
137
  `/jh-follow PROJ-123` adds a ticket, an issue or a status page: it checks the tool and its login, shows you a dry run and writes the source to `watch.sources` after your yes. The [recipes](https://unpkg.com/jackherd/recipes/README.md) cover Jira, Linear, GitHub issues and Projects, Sentry and status pages. The reports need herdr; a source can be set up and dry-run without it.
154
138
 
@@ -162,26 +146,21 @@ Jack doesn't watch the terminals himself. `jh watch`, which he starts himself, w
162
146
  ```text
163
147
  🐾 Board 01 11:38
164
148
  ────────────────────────────────────────────────────────────────────────────────
165
- ▾ ◆ search-ui blocked 🥣 62 % │ ██████░░░░ ◐ 6/9
166
- ⎇ feat/search-ui ↑1 ±4
167
- │
168
- └─ Product search
169
- ├─ 📎 📄 Plan 📡 PROJ-123 · In Progress ✦ Mockup ◈ Search box
170
- │
171
- ├─ ✓ P2 Search box 4/4
172
- ├─ ▸ P3 Docs docs open
173
- │ └─ ▶ Docs updated (README)
174
- └─ ▸ P4 Review 0/2
149
+ ▾ ◆ search-ui blocked ██████░░░░ 6/9
150
+ ├─ Search box docs ⎇ feat/search-ui ↑1 ±4 🥣 62 %
151
+ ├─ 📄 Plan 📡 PROJ-123 · In Progress ✦ Mockup ◈ Search box
152
+ ├─ P3 Docs · 4 min ago · gate 2/3
153
+ │ ▶ Review gate
154
+ ├─ next P4
155
+ └─ ✓ P2
175
156
  ────────────────────────────────────────────────────────────────────────────────
176
- ▸ ◉ checkout-fee done ↗ #42 💬 2 🥣 48 % │ ██████████ ◐ 6/6
157
+ ▸ ◉ checkout-fee ↗ #42 💬 2 ██████████ 6/6
177
158
  ────────────────────────────────────────────────────────────────────────────────
178
- ▾ ● search-index working 🥣 34 % │ ████████░░ ◐ 4/5
179
- ⎇ feat/search-index ↑3 ±2
180
- ↗ #41 … checks 🌐 preview 💬 1 new Search index
181
- │
182
- └─ Product search
183
- └─ ▸ P1 Index 4/5
184
- └─ ▶ /jh-uncle-bob
159
+ ▾ ● search-index ████████░░ 4/5
160
+ ├─ Search index ⎇ feat/search-index ↑3 ±2 🥣 34 %
161
+ ├─ ↗ #41 … checks 🌐 preview 💬 1 new Search index
162
+ └─ P1 Index · just now 4/5
163
+ ▶ /jh-uncle-bob
185
164
  ────────────────────────────────────────────────────────────────────────────────
186
165
  · no agent (1) docs-site 1/3
187
166
  ────────────────────────────────────────────────────────────────────────────────
@@ -201,6 +180,8 @@ Jack doesn't watch the terminals himself. `jh watch`, which he starts himself, w
201
180
  | `jh check` | types, lint and tests of what you touched, plus the plan and board checks (`--skip-slow`, `--parallel <plan>`) |
202
181
  | `jh herd` | the live view (`--once`, `--lane <name>`) |
203
182
  | `jh watch` | the watcher Jack runs |
183
+ | `jh preview <file>` | renders a Markdown file through the GitHub API into a preview in GitHub and npm style |
184
+ | `jh waiting` | the files and Artifacts sent to you that you have not answered yet (`close <id>…` or `close --all` once you have) |
204
185
  | `jh context` | how full an agent's context is, as JSON |
205
186
  | `jh config` | the commands and the base branch the repository uses |
206
187
 
@@ -8,6 +8,7 @@ Jack, a black-and-white Shih Tzu with a teal bandana, herding three lanes to thr
8
8
  | ---- | ------- | --- |
9
9
  | `jackherd-logo.svg` | Jack, lanes, nodes, wordmark | npm and GitHub README on light backgrounds, documentation |
10
10
  | `jackherd-logo-dark.svg` | The same for dark backgrounds: `jack` in fur white, brighter teal, a fur-white sticker rim around Jack so the dark ears stand off the ground, lighter node rims, faint shadows | GitHub README in dark mode, dark documentation themes |
11
+ | `jackherd-logo-outline.svg` | The dark logo with ink letters and a light outline around Jack, the letters, the lanes and the nodes, no card; generated from `jackherd-logo-dark.svg` by `bun assets/branding/outline.ts` | The npm README, any page whose ground is unknown |
11
12
  | `jackherd-logo-mark.svg` | Jack, lanes, nodes, no wordmark | Where the name is already written next to it |
12
13
  | `jackherd-icon.svg` | App icon: Jack's head and bandana, lanes and nodes on a dark tile | Avatars, social previews, the herdr plugin, 128 px and up |
13
14
  | `jackherd-icon-small.svg` | The icon simplified for 32-64 px: no `</>`, no ticks, thicker lanes, larger nodes | Favicons, tabs, small UI |
@@ -20,15 +21,12 @@ PNG exports, transparent outside the tile:
20
21
 
21
22
  Below 24 px even the small icon loses its lanes; use the head and bandana only, or no icon.
22
23
 
23
- The six README feature icons in `assets/icons/` are generated from `jackherd-logo.svg`: after a change, run `bun assets/icons/build.ts` from the package root.
24
+ The six README feature icons in `assets/icons/` (one version each, mid-grey line work, readable on white and on black) are generated from `jackherd-logo.svg`: after a change, run `bun assets/icons/build.ts` from the package root.
24
25
 
25
- A README switches between the light and the dark logo with `<picture>`. The paths below are relative to the package root, as the package README sees them; npm does not resolve relative image paths, so a README rendered there needs absolute URLs to the published files:
26
+ A README that npm renders uses `jackherd-logo-outline.svg` and no `<picture>`: npm wraps every `<img>` in a link, so a `<source media="(prefers-color-scheme: dark)">` is never chosen, and npm has no dark theme of its own. Its light outline makes it read on white and on black. The paths below are relative to the package root; npm does not resolve relative image paths, so a README rendered there needs absolute URLs to the published files:
26
27
 
27
28
  ```html
28
- <picture>
29
- <source media="(prefers-color-scheme: dark)" srcset="assets/branding/jackherd-logo-dark.svg">
30
- <img alt="jackherd" src="assets/branding/jackherd-logo.svg" width="340">
31
- </picture>
29
+ <img alt="jackherd" src="assets/branding/jackherd-logo-outline.svg" width="340">
32
30
  ```
33
31
 
34
32
  ## Palette
@@ -38,7 +36,7 @@ A README switches between the light and the dark logo with `<picture>`. The path
38
36
  | Anthracite | `#212E34` | Outlines, `jack`, nodes, icon tile |
39
37
  | Teal | `#03B5BD` | `herd`, bandana, lanes, ticks, node dots |
40
38
  | Teal on dark | `#21BEC5` | `herd`, lanes, ticks and node dots in the dark logo |
41
- | Light on dark | `#E6EDF3` | Line work of the dark feature icons (`assets/icons/*-dark.svg`) |
39
+ | Icon grey | `#6F818A` | Line work of the feature icons (`assets/icons/*.svg`) |
42
40
  | Node rim on dark | `#5B6B73` | Node rims in the dark logo |
43
41
  | Dark grey | `#4A4E51` | Ears and body fur |
44
42
  | Mid grey | `#9B9D9E` | Eye patches, fur strands |
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="262 78 957 707" role="img" aria-label="jackherd"><title>jackherd</title><g id="shadows" fill="#BCC5CA" opacity="0.5"><ellipse cx="541" cy="523" rx="186" ry="13" transform="rotate(2.2 541 523)"/><ellipse cx="925" cy="345.5" rx="47.5" ry="7"/><ellipse cx="1081" cy="404" rx="49" ry="6"/><ellipse cx="1110" cy="531" rx="59" ry="9"/></g><g id="lanes" fill="#03B5BD" stroke="#FAF9F8" stroke-width="6" stroke-linejoin="round" paint-order="stroke"><path d="M710.7 446.5L726.4 444.6L743.1 442.5L760.6 440.0L778.5 437.3L796.5 434.2L814.3 430.9L831.6 427.3L848.0 423.5L863.2 419.3L877.0 414.9L889.1 410.2L899.1 405.0L907.0 399.3L912.4 392.5L913.1 385.1L909.9 379.3L904.9 375.1L898.7 371.6L891.5 368.4L883.6 365.3L875.3 362.2L866.8 359.2L858.6 356.1L851.0 352.9L844.4 349.7L839.3 346.5L836.1 343.5L834.8 340.9L834.9 341.0L835.1 340.6L835.8 339.8L837.6 338.7L840.2 337.6L843.5 336.6L847.4 335.7L851.7 334.9L856.3 334.3L861.0 333.8L865.8 333.3L870.5 332.9L875.1 332.6L879.4 332.2A4.8 4.8 0 0 0 878.6 322.8L874.4 323.1L869.8 323.4L865.0 323.7L860.1 324.1L855.1 324.6L850.2 325.3L845.5 326.1L841.0 327.1L836.8 328.3L833.0 329.9L829.6 332.0L826.8 335.0L825.1 339.0L825.2 344.1L828.2 349.7L833.2 354.5L839.4 358.6L846.7 362.3L854.7 365.7L863.1 369.0L871.6 372.1L879.8 375.2L887.4 378.3L893.9 381.2L898.8 384.1L901.7 386.5L902.5 387.6L902.6 387.5L899.6 391.2L893.5 395.5L884.5 399.9L873.3 404.2L860.0 408.3L845.2 412.2L829.1 415.8L812.1 419.2L794.5 422.3L776.6 425.1L758.9 427.6L741.5 429.9L724.9 431.9L709.3 433.5A6.5 6.5 0 0 0 710.7 446.5Z"/><path d="M695.3 470.5L733.9 468.9L770.5 467.2L804.9 465.2L837.0 463.1L866.8 460.6L894.0 457.9L918.7 455.0L940.7 451.7L959.9 448.2L976.4 444.3L990.0 440.0L1000.7 435.1L1008.7 429.3L1013.3 422.4L1014.2 416.5L1012.8 411.6L1010.0 407.7L1006.6 404.6L1002.8 402.0L998.7 399.7L994.6 397.5L990.5 395.4L986.7 393.3L983.3 391.3L980.7 389.3L979.0 387.6L978.2 386.3L977.9 385.1L977.9 385.3L978.2 385.0L979.3 384.2L981.5 383.3L984.7 382.4L988.6 381.7L993.1 381.1L998.1 380.7L1003.5 380.4L1009.3 380.2L1015.3 380.1L1021.5 380.1L1027.7 380.0L1034.0 380.0A5.0 5.0 0 0 0 1034.0 370.0L1027.8 369.9L1021.5 369.9L1015.2 369.9L1009.1 369.9L1003.2 370.0L997.5 370.2L992.1 370.6L987.0 371.2L982.4 372.0L978.1 373.1L974.3 374.7L970.9 377.0L968.2 380.4L967.1 384.9L967.8 389.9L970.2 394.2L973.4 397.6L977.1 400.4L981.0 403.0L985.2 405.3L989.3 407.5L993.2 409.6L996.7 411.7L999.5 413.6L1001.5 415.4L1002.4 416.7L1002.6 417.3L1002.7 417.6L1000.5 421.0L995.0 424.8L985.8 428.7L973.2 432.5L957.5 436.0L938.7 439.2L917.1 442.1L892.7 444.7L865.6 447.0L836.1 449.0L804.1 450.8L769.8 452.2L733.3 453.5L694.7 454.5A8.0 8.0 0 0 0 695.3 470.5Z"/><path d="M683.7 498.4L708.8 501.3L734.6 503.9L760.9 506.3L787.7 508.4L814.8 510.1L842.0 511.6L869.3 512.6L896.6 513.2L923.8 513.4L950.6 513.1L977.1 512.3L1003.1 510.9L1028.5 509.0L1053.1 506.5A6.5 6.5 0 0 0 1051.9 493.5L1027.5 495.5L1002.4 496.9L976.7 497.6L950.5 497.9L923.9 497.6L897.0 496.8L870.0 495.6L843.0 494.0L816.0 492.0L789.2 489.7L762.8 487.1L736.7 484.1L711.2 481.0L686.3 477.6A10.5 10.5 0 0 0 683.7 498.4Z"/></g><g id="jack"><path d="M694 108c.6 .6 .6 .6 4 3.5c2.5 1 2.5 1 6.6 1.6c11.2 2 19 6.7 26.4 15.3c3.3 3.4 7.2 4.9 11.5 7c12.2 6.4 19.5 15.5 25.5 27.6c-.1 1.3-.4 2.7-.5 4c0 10.8 7.3 19.8 14.3 27.6c4.9 4.4 10.5 7.6 16.2 10.9c.5 .8 .5 .8 3 5c.7 .8 1.4 1.7 2.1 2.6c7.5 9.3 12.5 20.2 11.4 32.4c-1.3 1.2-2.6 2.3-4 3.5c-1.4 3.6-1.5 6.4-1.2 10.2c.6 12.6-3.4 22.9-10.3 33.3c-5.1 4.4-5.1 4.4-10.5 5c-4.5 2.8-7 6-10.5 10c-6.9 5.3-12.2 8-21 8c-1.8-.8-3.6-1.6-5.5-2.5c-5-1.6-7.1-2.1-12 0c-8.3 6.2-8.3 6.2-10 10.5c-.6 11.3 .1 16.9 5.4 26.7c6.9 13.8 11.5 30.9 9.1 46.3c-1 .6-2 1.3-3 2c-3.4 4.2-3 7.1-3 12.4c.1 7.5-.4 13.7-3.5 20.6c-.5 1.3-1.1 2.6-1.7 3.9c-4.8 10.7-11.7 16.6-21.8 22.1c-4 3-4 3-7.5 6.5c-.5 .4-.5 .4-3 2.5c-.5 .6-.5 .6-3 4c-1.3 1.1-2.6 2.3-4 3.5c-6.3 5.6-6.3 5.6-7 11c1.4 5.4 3 7 7 11c2 3 2 3 3 8c.5 1.2 1 2.4 1.5 3.6c3.1 8 3.5 13.7 .5 21.9c-6.6 9.9-15.4 13.7-26.7 16.8c-6.4 1.2-12.4 1.5-18.9 .9c-3.6-.2-7.2-.2-10.8-.1c-9.2 0-15.9-2.1-24.1-6.1c-4-.5-4-.5-10.5 0c-10.9-2.4-19.9-9.1-27.4-17.2c-4.1-4.4-5.6-5.2-11.6-5.8c-2.5 .1-4.9 .3-7.3 .5c-34.1 2.3-34.1 2.3-46.2-7c-3-3.5-3-3.5-6.5-8.5c-2.5-2-2.5-2-6.5-4c-2.3-5.5-3.3-10-3.9-15.9c-.6-3.6-.6-3.6-3.6-7.6c-5.9-3.5-5.9-3.5-12.5-3.5c-3 1.5-3 1.5-6.8 5.3c-5.1 5-9.8 8.1-16.2 11.2c-3.6 4.3-4 4.9-4 10.5c.4 1.1 .6 2.3 1 3.5c.1 .6 .1 .6 .4 3.9c.7 4.8 1.7 8 5.6 11.1c-.1 .6-.4 1.3-.5 2c-5.1 1.9-10.1 2.8-15.5 3.5c-1.3 .4-2.6 .6-3.9 1c-7.9 1.9-15.6 2.1-23.6 2.5c-2.1 .1-4.3 .4-6.5 .5c-13.9-1.1-26.6-3.5-36.5-14c-3-6-3-6-4-10.9c-1.1-5.2-2.9-7-6.5-10.6c-3.2-16.4 1.4-30.4 10.5-44c1-1.5 2-2.9 3-4.5c.5-1.5 .5-1.5 .5-7.5c-1.5-3-1.5-3-6-8c-1-2-1-2-1-4c1.8-.6 3.6-1.3 5.5-2c9.9-5.7 16.1-13.1 19.5-24c.4-1.1 .7-2.1 1.1-3.3c3.9-12.8 3.9-12.8 .9-18.7c-3-2.5-3-2.5-6.1-4.1c-6.5-3.6-11.1-8.9-13.9-15.9c0-1.8 0-3.6 0-5.5c-1.8-4.1-3.1-5.5-7-7.5c-7.4-12.1-10.1-24.1-7.1-37.9c2-7.4 5-13.2 9.1-19.6c3.1-4.9 3.2-6.3 2-12c0-11.8 7.7-21.9 15.4-30.2c11.9-11.1 26.8-16.8 43.1-16.3c1.1 .5 2.3 1 3.5 1.5c5.5 .5 5.5 .5 10 .5c2.5 .9 5 1.9 7.5 3c3.5 .5 3.5 .5 8-.5c4.1-3.4 5.6-6.8 8-11.5c2.7-3.8 5.6-7.3 8.5-11c1.9-3.7 1.4-5.9 .5-10c-3-3.5-3-3.5-7-5.5c.1-.5 .4-1 .5-1.5c3.1-1.3 6.4-2.7 9.5-4c12.1-6.8 21.1-16.6 30-26.9c4.1-4.3 8.5-7.5 13.5-10.7c4.5-3.1 5.8-5.7 7.5-10.9c10-11 22.4-17.4 36.6-21.1c5.4-1.4 5.4-1.4 8.4-3.4c13.1-6.5 28.2-8.5 42.5-5c2.7 1 5.4 2 8 3c4.5 .7 6.8 0 10.5-2.5c.8-.7 1.6-1.3 2.5-2c9.5-4.8 9.5-4.8 12.5-4c31.5 0 31.5 0 38.5 4z" fill="#FAF9F8" stroke="#FAF9F8" stroke-width="20" stroke-linejoin="round"/><path fill="#212E34" d="M694 108c.6 .6 .6 .6 4 3.5c2.5 1 2.5 1 6.6 1.6c11.2 2 19 6.7 26.4 15.3c3.3 3.4 7.2 4.9 11.5 7c12.2 6.4 19.5 15.5 25.5 27.6c-.1 1.3-.4 2.7-.5 4c0 10.8 7.3 19.8 14.3 27.6c4.9 4.4 10.5 7.6 16.2 10.9c.5 .8 .5 .8 3 5c.7 .8 1.4 1.7 2.1 2.6c7.5 9.3 12.5 20.2 11.4 32.4c-1.3 1.2-2.6 2.3-4 3.5c-1.4 3.6-1.5 6.4-1.2 10.2c.6 12.6-3.4 22.9-10.3 33.3c-5.1 4.4-5.1 4.4-10.5 5c-4.5 2.8-7 6-10.5 10c-6.9 5.3-12.2 8-21 8c-1.8-.8-3.6-1.6-5.5-2.5c-5-1.6-7.1-2.1-12 0c-8.3 6.2-8.3 6.2-10 10.5c-.6 11.3 .1 16.9 5.4 26.7c6.9 13.8 11.5 30.9 9.1 46.3c-1 .6-2 1.3-3 2c-3.4 4.2-3 7.1-3 12.4c.1 7.5-.4 13.7-3.5 20.6c-.5 1.3-1.1 2.6-1.7 3.9c-4.8 10.7-11.7 16.6-21.8 22.1c-4 3-4 3-7.5 6.5c-.5 .4-.5 .4-3 2.5c-.5 .6-.5 .6-3 4c-1.3 1.1-2.6 2.3-4 3.5c-6.3 5.6-6.3 5.6-7 11c1.4 5.4 3 7 7 11c2 3 2 3 3 8c.5 1.2 1 2.4 1.5 3.6c3.1 8 3.5 13.7 .5 21.9c-6.6 9.9-15.4 13.7-26.7 16.8c-6.4 1.2-12.4 1.5-18.9 .9c-3.6-.2-7.2-.2-10.8-.1c-9.2 0-15.9-2.1-24.1-6.1c-4-.5-4-.5-10.5 0c-10.9-2.4-19.9-9.1-27.4-17.2c-4.1-4.4-5.6-5.2-11.6-5.8c-2.5 .1-4.9 .3-7.3 .5c-34.1 2.3-34.1 2.3-46.2-7c-3-3.5-3-3.5-6.5-8.5c-2.5-2-2.5-2-6.5-4c-2.3-5.5-3.3-10-3.9-15.9c-.6-3.6-.6-3.6-3.6-7.6c-5.9-3.5-5.9-3.5-12.5-3.5c-3 1.5-3 1.5-6.8 5.3c-5.1 5-9.8 8.1-16.2 11.2c-3.6 4.3-4 4.9-4 10.5c.4 1.1 .6 2.3 1 3.5c.1 .6 .1 .6 .4 3.9c.7 4.8 1.7 8 5.6 11.1c-.1 .6-.4 1.3-.5 2c-5.1 1.9-10.1 2.8-15.5 3.5c-1.3 .4-2.6 .6-3.9 1c-7.9 1.9-15.6 2.1-23.6 2.5c-2.1 .1-4.3 .4-6.5 .5c-13.9-1.1-26.6-3.5-36.5-14c-3-6-3-6-4-10.9c-1.1-5.2-2.9-7-6.5-10.6c-3.2-16.4 1.4-30.4 10.5-44c1-1.5 2-2.9 3-4.5c.5-1.5 .5-1.5 .5-7.5c-1.5-3-1.5-3-6-8c-1-2-1-2-1-4c1.8-.6 3.6-1.3 5.5-2c9.9-5.7 16.1-13.1 19.5-24c.4-1.1 .7-2.1 1.1-3.3c3.9-12.8 3.9-12.8 .9-18.7c-3-2.5-3-2.5-6.1-4.1c-6.5-3.6-11.1-8.9-13.9-15.9c0-1.8 0-3.6 0-5.5c-1.8-4.1-3.1-5.5-7-7.5c-7.4-12.1-10.1-24.1-7.1-37.9c2-7.4 5-13.2 9.1-19.6c3.1-4.9 3.2-6.3 2-12c0-11.8 7.7-21.9 15.4-30.2c11.9-11.1 26.8-16.8 43.1-16.3c1.1 .5 2.3 1 3.5 1.5c5.5 .5 5.5 .5 10 .5c2.5 .9 5 1.9 7.5 3c3.5 .5 3.5 .5 8-.5c4.1-3.4 5.6-6.8 8-11.5c2.7-3.8 5.6-7.3 8.5-11c1.9-3.7 1.4-5.9 .5-10c-3-3.5-3-3.5-7-5.5c.1-.5 .4-1 .5-1.5c3.1-1.3 6.4-2.7 9.5-4c12.1-6.8 21.1-16.6 30-26.9c4.1-4.3 8.5-7.5 13.5-10.7c4.5-3.1 5.8-5.7 7.5-10.9c10-11 22.4-17.4 36.6-21.1c5.4-1.4 5.4-1.4 8.4-3.4c13.1-6.5 28.2-8.5 42.5-5c2.7 1 5.4 2 8 3c4.5 .7 6.8 0 10.5-2.5c.8-.7 1.6-1.3 2.5-2c9.5-4.8 9.5-4.8 12.5-4c31.5 0 31.5 0 38.5 4z"/><path fill="#4A4E51" d="M651.5 106.5c.6 .2 1.3 .3 2 .5c-.6 .6-.6 .6-4 3.5c-1.4 2.3-2.7 4.7-4 7c-.4 .2-.4 .2-2 1c-.6-.3-1.3-.7-2-1c-.6 .5-1.3 1-2 1.5c.1 .2 .1 .2 .5 1c-2-.5-2-.5-7-4.5c-4.8-2.5-9.4-4.2-14.5-5.5c-1-.3-2-.7-3-1c4.7-1.2 10.2 1.8 14.5 3.5c1.1 .3 2.3 .7 3.5 1c.6 .3 1.3 .7 2 1c.6-.8 1.3-1.7 2-2.5c.6-.2 1.3-.3 2-.5c-.6 1.3-1.3 2.7-2 4c.1 .2 .4 .3 .5 .5c.8 0 1.6 0 2.5 0c1-1.3 2-2.7 3-4c.6-.3 1.3-.7 2-1c0 .8 0 1.7 0 2.5c1-1.5 2-3 3-4.5c1-.8 2-1.7 3-2.5zM606.5 127c0 .5 0 1 0 1.5c-1.4 .4-2.7 .7-4.2 1.2c-8.1 2.7-14.3 6.7-20.3 12.8c1.4-.3 2.7-.7 4.1-.9c4.9-1.1 4.9-1.1 11.4-1.6c1 1 1 1 1 2.5c1 0 2 0 3 0c0 .5 0 1 0 1.5c-1 .5-2 1.1-3 1.6c-12.6 7-19.1 17.5-23.5 30.9c-.5 .3-1 .7-1.5 1c-.5-.2-1-.3-1.5-.5c-.7 1.4-1.4 2.9-2 4.4c-2.5 5.1-2.5 5.1-5.5 10.1c-.5 .2-1 .3-1.5 .5c0-6.8 1.7-12.2 4-18.5c-.4 0-.6 0-1 0c-.1 .3-.1 .3-1 2c-.6 1.2-1.2 2.3-1.8 3.6c-3.2 6.3-5.8 12.7-7.9 19.5c-1.7 5-3.7 8.9-6.3 13.4c-3 7.1-4.5 13.8-4.5 21.5c.4-1.3 .8-2.7 1.2-4.1c4.8-14.4 4.8-14.4 7.8-16.4c.1 1.1 .2 2.2 .3 3.3c1.8 12.3 6.3 24 10.4 35.6c4.8 15 3.9 29.5-1.7 44.1c-1.3 2.4-2.6 4.7-4 7c-.5 0-1 0-1.5 0c0-2.1 0-4.1 .1-6.2c-.1-10.5-2.4-18.9-7.1-28.3c-.4-.1-.6-.4-1-.5c.1 .6 .4 1.3 .5 2c1.3 16-1.7 32.7-11 46c-2.9-2.9-4.4-6.8-6.3-10.4c-2.2-3.8-4.6-7.5-7.2-11.1c-11-16.4-13.9-35.1-10.5-54.5c2.2-7.7 4.8-14.9 8.5-22c-14.6 14.6-18.4 34.4-19.1 54.2c.3 8.1 2.5 15.6 4.6 23.3c0 .5 0 1 0 1.5c-7.4-2.9-12.6-11.8-16.4-18.4c-6.3-14.7-5.4-28.9 .4-43.6c1-1.7 2-3.3 3-5c.4-.7 .6-1.3 1-2c-8 5.9-15 11.4-19.5 20.5c-.4 0-.6 0-1 0c0-13.1 7.6-26.4 16-36c.7-.9 1.4-1.8 2.2-2.7c4.6-5.6 9.7-10.7 14.8-15.8c1.9-2.2 3.7-4.4 5.4-6.7c2.6-3.3 2.6-3.3 7.1-7.8c-3.4 0-7 2.9-10 4.5c-.3 .1-.3 .1-1.5 .5c.5-2 .5-2 4.5-6c.7-1 1.4-2 2-3.1c11.5-15.4 27.5-26.1 46.5-29.4c2.5-.3 5-.7 7.5-1c-2.7-2.8-7.7-2.6-11.5-3c1.3-3.9 7.6-6.3 11.1-8.3c8.1-3.5 16.7-6.2 25.4-7.7c3.4-1.7 7.6 0 11 1zM743.5 149c4 1 6.9 4 10 6.5c.6-.3 1.3-.7 2-1c.1 .7 .4 1.3 .5 2c.1 .3 .4 .7 .5 1c.5 0 1 0 1.5 0c5 5.7 8.4 11.4 11 18.5c6.6 12.3 13.5 20.3 25.5 27.5c-.1 .1-.1 .1-1 .5c-1.3-.7-2.6-1.3-4-2c1 3.5 1 3.5 5 8.5c7 8.8 7 8.8 8 14.5c-3.7 .9-6.9-2.2-10-4c-.6-.4-.6-.4-4-2.5c-.5-.2-1-.3-1.5-.5c1.5 3 1.5 3 5.5 7c3.9 5.3 5 10.1 6 16.6c.3 1.6 .6 3.4 .9 5.2c1.6 13.3 1.6 13.3 .1 16.2c-.4 0-.6 0-1 0c-.3-1.1-.5-2.2-.9-3.3c-3.8-14-11.6-25.8-21.1-36.7c-7.5-8.8-7.5-8.8-7.5-13.5c-2.2-3.4-4.6-6.7-7-10c-1.8-4.4-3.1-8.9-4.5-13.5c-.5-1.2-1-2.3-1.5-3.5c0-.5 0-1 0-1.5c1.5 .5 1.5 .5 5 5.5c3.5 4 3.5 4 5 4.5c-.6-1.2-1.2-2.3-1.8-3.6c-3-6-5.2-12-7.2-18.4c-3.5-5-3.5-5-6-7.5c-1.5-2-1.5-2-4-7c-1.1-1.5-2.3-2.9-3.5-4.5c0-.3 0-.7 0-1zM720.5 140.5c1 0 2 0 3 0c0 .5 0 1 0 1.5c-.4 0-.6 0-1 0c0 .3 0 .7 0 1c1 .3 2 .7 3 1c10.4 9.3 15.4 19 16.5 33c-.6 .2-1.3 .3-2 .5c-1-.8-2-1.7-3-2.5c-8-4.7-14.1-7.7-23.5-6.5c0-3.9 6.3-8.3 9-11c0-.3 0-.7 0-1c-2-1-2-1-7-1c-6.4 2.6-10 6.3-14.5 11.5c.5 2 .5 2 3 4.5c.2 .1 .2 .1 1.5 .5c.1 .5 .4 1 .5 1.5c-1.5 2.8-3 5.7-4.5 8.5c-.4 .8-.6 1.7-1 2.5c-2 .5-4 1-6 1.5c-.1 .2-.1 .2-1 1c-.4 0-.6 0-1 0c1-2.5 1-2.5 2-3.5c.8-.2 .8-.2 5-1c.6-1.7 1.3-3.3 2-5c.6-1 1.3-2 2-3c0-.5 0-1 0-1.5c-1-.8-2-1.7-3-2.5c-.5-.7-1-1.3-1.5-2c1.6-6.6 9.1-11.3 14.5-14.5c3.3-.8 5.9-.8 9 .5c.4 .5 .4 .5 2.5 3c-2.6 2.7-5.3 5.3-8 8c2 .2 4 .3 6 .5c12.9 5.3 12.9 5.3 16.5 9c-.9-9.9-3.9-18.4-10.5-26c-5.5-4-5.5-4-9.5-6c0-1.5 0-1.5 1-2.5zM634 169.5c.8 .1 .8 .1 5 .5c6 2.5 6 2.5 9.5 6c.5 3.5 .5 3.5-2 7c-.4 0-.6 0-1 0c2.5 2.5 2.5 2.5 5.9 5.1c3.1 2.4 3.1 2.4 4.1 4.4c-2.5 2.1-4.3 3.3-7.5 4c.5 1.8 1 3.7 1.5 5.5c.8-.8 1.6-1.6 2.4-2.3c3.7-3.2 7.6-4.8 12.1-6.7c1 .5 2 1 3 1.5c.1 .5 .4 1 .5 1.5c-1.5 2-1.5 2-5 4c-4 3.2-6.9 6.1-10 10c-.4-.2-.6-.3-1-.5c2.9-5.8 8.1-9.7 13.5-13c0-.2 0-.3 0-.5c-6 .8-10 3.1-14.5 7c-.5 .7-1 1.3-1.5 2c-.2-.1-.2-.1-1.5-.5c-.1-1-.1-1-1-6c-.1-.4-.1-.4-1-2.5c.1-.8 .4-1.7 .5-2.5c1.3 .2 2.6 .3 4 .5c1-.5 2-1 3-1.5c-1.2-3.8-7.1-6.5-10.5-8.5c0-.3 0-.7 0-1c1.1-.7 2.3-1.3 3.5-2c1-2 1-2 .5-4.5c-4.1-4.1-8-4.3-13.5-5c-1.6-.5-3.3-1-5-1.5c-6.5 0-10.4 .3-16 3.5c-.1 .3-.4 .7-.5 1c1.3 0 2.6 0 4 0c6 1.6 10.8 4.3 16 7.5c-.1 .2-.1 .2-.5 1.5c-1.6 .2-3.3 .3-5 .5c-13 3.7-20.4 11.7-29 21.5c-3.5 3-3.5 3-5.5 4c10.9 .3 10.9 .3 15-2.5c.1-.2 .1-.2 .5-1.5c.5 0 1 0 1.5 0c-.1 .8-.4 1.7-.5 2.5c-5.5 3.6-8.5 4-15 4c-1.1-.3-2.3-.7-3.5-1c-.1-.7-.4-1.3-.5-2c1.5-1.5 1.5-1.5 5.5-3.5c3.7-3.7 7.1-7.6 10.5-11.5c6.5-6.2 13.2-10.1 22-12.5c-10.5-5.5-10.5-5.5-15-5.5c-.4-.1-.4-.1-2.5-.5c0-.7 0-1.3 0-2c7.7-6.2 15.2-6.8 24.5-4zM740.5 183c.4 .2 .6 .3 1 .5c.5 1.8 .9 3.7 1.3 5.5c1.4 5.5 3.1 10 5.7 15c.1 .5 .4 1 .5 1.5c-4.5-1-4.5-1-8.5-3c0-.3 0-.7 0-1c1.6 .3 3.3 .7 5 1c-6.5-3.3-10.8-4.5-18-4.5c-.1-.3-.4-.7-.5-1c.6-1 1.3-2 2-3c.4 .3 .6 .7 1 1c-.1 .3-.4 .7-.5 1c.6-.1 .6-.1 3.5-.5c3.6 .8 7 1.7 10.5 3c-.4-1.3-.8-2.4-1.2-3.7c-2.3-7.6-2.3-7.6-2.3-11.3c.1-.2 .4-.3 .5-.5zM578 181c.5 0 1 0 1.5 0c-1 3-1 3-2.7 6.9c-6.1 13.9-5.7 28.5-.7 42.7c.5 1.2 .9 2.2 1.4 3.4c1 0 1 0 5.5-4c10-7.4 20.1-11.8 32.5-12.5c.8-.2 1.6-.3 2.5-.5c1.1 .3 2.3 .7 3.5 1c1 0 2 0 3 0c.1 .3 .4 .7 .5 1c-.1 .3-.4 .7-.5 1c-1.3 0-2.6 0-4 0c0 .3 0 .7 0 1c1.4 0 2.7-.1 4.1-.1c4.4 .1 4.4 .1 6.9 1.1c-1.8 2.7-5.2 3.6-8 5c-9.7 6.1-17.5 13.3-24.5 22.5c.5-.3 1-.7 1.5-1c.6-.2 1.3-.3 2-.5c.4 .3 .6 .7 1 1c-.9 3.4-3.1 6.1-5 9c-5.1 10.3-6.7 19.6-6.5 31c-.5 0-1 0-1.5 0c0-.5 0-1 0-1.5c-.4 0-.6 0-1 0c0 1.8 0 3.6 0 5.5c-.4 1-.6 2-1 3c-1.1 4.7 1.1 10.2 3 14.5c-2-.5-2-.5-7-4.5c-1.1-.8-2.3-1.6-3.5-2.4c-3-2.1-3-2.1-5-4.1c.8-2.7 1.6-5.4 2.5-8c2.6-15.9 2.3-29.4-3.7-44.6c-7.5-19.6-7.5-19.6-5.8-29.9c.1 0 .4 0 .5 0c.4 1.7 .6 3.3 1 5c.4 0 .6 0 1 0c-.4-1.3-.6-2.7-1-4c-1.1-13.7 .6-23.9 7-36c.1-.3 .4-.7 .5-1zM621.5 219c0 .2 0 .3 0 .5c.8 0 1.6 0 2.5 0c0-.2 0-.3 0-.5c-.8 0-1.6 0-2.5 0zM591 268c-1.5 5.5-1.5 5.5-1 8c.1 0 .4 0 .5 0c1-5 1-5 1-8c-.1 0-.4 0-.5 0zM452.5 289.5c2.6 .2 5.4 .4 8 .5c.1-.1 .4-.4 .5-.5c.9 0 1.6 0 2.5 0c.1 .3 .1 .3 1 1.5c.4 .1 .4 .1 2 1c1.3 1.5 2.6 2.9 4 4.5c4 2.5 4 2.5 9.5 2.5c3.5 4 3.5 4 7.5 9.5c-1 2-1 2-1.5 2.5c-2.1 0-4.3 0-6.5 0c0-.5 0-1 0-1.5c.5 0 1 0 1.5 0c0-.4 0-.6 0-1c-.9-.1-1.6-.4-2.5-.5c-2.5-1-5-2-7.5-3c-8.3-2.1-16.2-.1-23.5 4c-4.4 3.6-7.6 8.4-9 14c0 6 0 6 1 10c-2.6 2.1-5.3 4.1-7.9 6.1c-6.5 5.3-11.5 11-16.1 17.9c-2.5-.5-2.5-.5-6.5-3c-.6-.1-1.3-.4-2-.5c0-.5 0-1 0-1.5c-.5 0-1 0-1.5 0c-5.6-1.4-9.9-6.9-13-11.5c.1-.5 .4-1 .5-1.5c2.2 2.4 4.4 4.9 6.5 7.5c1.5 1 2.9 2 4.5 3c-.2-.7-.2-.7-1.5-4.5c-.7-4.1-.6-8.3-.5-12.5c.9 .1 1.6 .4 2.5 .5c0-.5 0-1 0-1.5c-.9 0-1.6 0-2.5 0c0-8.6 0-8.6 2.5-12c2 .5 2 .5 3 1.5c.6 2.1 1.3 4.3 2 6.5c3 6 3 6 5.5 9c-.1-1.9-.1-3.7-.1-5.7c.2-14.2 4.5-22.7 14.6-32.8c16.6-10.6 16.6-10.6 23-8.5zM448 290c0 .1 0 .4 0 .5c1 0 2 0 3 0c0-.1 0-.4 0-.5c-1 0-2 0-3 0zM461 290c2 .5 2 .5 2 .5zM405 322c-.4 .4-.6 .6-1 1c.4 0 .6 0 1 0c.1 1.1 .4 2.3 .5 3.5c.4 .1 .6 .4 1 .5c-.5-4-.5-4-1.5-5zM403.5 323.5c.5 2 .5 2 .5 2zM403 326.5c.5 1 .5 1 .5 1zM551.5 328.5c1 1.5 2 2.9 3 4.5c14.9 20 14.9 20 24.5 25.5c1.9 1.5 3.7 3 5.5 4.5c1 .8 2 1.6 3.1 2.4c.4 .4 .4 .4 2.4 2.1c0 .5 0 1 0 1.5c-3.4-2.2-6.6-4.6-9.5-7.5c-.2 6.6 .5 12.5 2 19c.4 1.5 .6 2.9 1 4.5c-1.5 1.5-1.5 1.5-7 3c-.8 .8-1.6 1.6-2.5 2.5c-.8 .8-1.6 1.6-2.5 2.4c-2.5 2.6-2.5 2.6-5 5.6c-.6-.1-1.3-.4-2-.5c-.5-2-.5-2 1-7.5c-2.5 .5-2.5 .5-5.5 4c-.4 0-.6 0-1 0c-.4 .6-.6 1.3-1 2c-1.1 1.3-2.3 2.6-3.5 4c-8.5 12.7-11.5 27.9-11.5 43c-.4 .1-.6 .4-1 .5c-5-4-5.8-10.6-7-16.5c-.1-2.1-.4-4.3-.5-6.5c-.1 0-.4 0-.5 0c-2.1 9.9-2.8 19.9-3.5 30c.4 0 .6 0 1 0c.5 1 .5 1 .5 5c-.5 0-1 0-1.5 0c0-1.1 0-2.3 0-3.5c-1.8-.1-3.6-.4-5.5-.5c0-.4 0-.6 0-1c-1.6 0-3.3 0-5 0c-8.6-2.6-8.6-2.6-12.5-6.5c-1.5-1.2-3-2.4-4.5-3.5c-.4 .4-.4 .4-2.5 2c-6.1-3.3-10.1-6.6-15-11.5c-.6-.5-1.3-1-2-1.5c-.1-.8-.4-1.6-.5-2.5c-1.1-1.3-2.3-2.6-3.5-4c-1.4-2.6-2.7-5.3-4-8c-.4-.4-.6-.6-1-1c-1-1.5-1-1.5-1-5c-.4 0-.6 0-1 0c-.4-.6-.6-1.3-1-2c-1 5-1 5-1.5 11c-.1 .1-.4 .4-.5 .5c.9 6 1.7 11.7 3.5 17.5c0 .6 0 1.3 0 2c-.4 .1-.4 .1-2 1c-3.6-3-6.9-5.9-10-9.5c-.5-.5-1-1-1.5-1.5c0-.4 0-.6 0-1c-.4-.1-.4-.1-2-1c-9.1-13.1-10.6-25.7-9-41.5c-.6 .8-.6 .8-4 4.5c-.6-.1-1.3-.4-2-.5c-1.8-3.6 1.1-10.7 2.1-14.4c3.6-9.5 8.7-16.9 15.9-24.1c-16.7 3.4-31.6 13.6-42 27c-.4-.1-.6-.4-1-.5c1-2.5 1-2.5 2.5-4.5c.1-.8 .4-1.6 .5-2.5c10.4-16.9 22.1-29.1 41-36c15.8-3.5 29.7-1.9 45 3c.7 .1 .7 .1 4.5 1c-.1 .5-.4 1-.5 1.5c-2.5 .9-5 1.7-7.5 2.5c-3.5 1.5-3.5 1.5-4 2.5c1.5 .1 2.9 .4 4.5 .5c1 .2 1 .2 6 1.5c3.1 .5 6.4 1 9.5 1.5c-.6 1.6-1.4 3.4-2 5c8.8-6.4 14.8-11.9 20-21.5c1-.5 1-.5 4.3-.9c3.6-.6 6.7-3 10.2-2.1zM462 348c-.4 .4-.6 .6-1 1c.4 .1 .4 .1 2 1c0-.6 0-1.3 0-2c-.4 0-.6 0-1 0zM562.5 387.5c.5 1 .5 1 .5 1zM471 404c-.1 .6-.4 1.3-.5 2c1.5 0 1.5 0 2.5-.5c-.1-.5-.4-1-.5-1.5c-.5 0-1 0-1.5 0zM472.5 406c.5 1.5 .5 1.5 .5 1.5zM470 407.5c.5 2 .5 2 .5 2zM469.5 410c.5 2 .5 2 .5 2zM474 411.5c.5 1 .5 1 .5 1zM469 423.5c0 1 0 2 0 3c.1 0 .4 0 .5 0c0-1 0-2 0-3c-.1 0-.4 0-.5 0zM469.5 427c.5 1.5 .5 1.5 .5 1.5zM470 430c.5 1.5 .5 1.5 .5 1.5zM470.5 432c.5 1 .5 1 .5 1zM498.5 432.5c.5 3.5 .5 3.5 1.5 5c0-.5 0-1 0-1.5c.5 .1 1 .4 1.5 .5c-.5-1.5-1-2.9-1.5-4.5c-.5 0-.5 0-1.5 .5zM471 433.5c.5 1.5 .5 1.5 .5 1.5zM471.5 435.5c.5 1 .5 1 .5 1zM500.5 436.5c.5 1 .5 1 .5 1zM520.5 450c2 .5 2 .5 2 .5zM528 451.5c0 .1 0 .4 0 .5c.8 0 1.6 0 2.5 0c0-.1 0-.4 0-.5c-.8 0-1.6 0-2.5 0zM531 452.5c0 1 0 2 0 3c.1 0 .4 0 .5 0c0-1 0-2 0-3c-.1 0-.4 0-.5 0z"/><path fill="#9B9D9E" d="M720.5 140.5c.1 .3 .1 .3 .5 2c1.3 .7 2.6 1.3 4 2c9.5 7.6 13.6 15.7 16 27.5c0 1.5 0 2.9 0 4.5c-1.5 0-1.5 0-4-2c-7.4-4.3-13.2-7.4-22-7c0-1.5 0-1.5 2.9-4.4c1-1 2.1-2 3.1-3.1c.8-1 1.6-2 2.5-3c-1.5-1.5-1.5-1.5-3.5-2c-6.6 0-9.4 1.8-14.5 6c-2.9 3.1-2.9 3.1-5 6c.5 2 .5 2 3 4.5c.5 .5 1 1 1.5 1.5c-.5 2-.5 2-3.5 7.5c-.5 1.2-1 2.3-1.5 3.5c-.9 .2-.9 .2-5.5 1c-.1 .2-.1 .2-1 1c-3-3.1-2.1-7.8-2.1-11.9c0-1.4 0-2.9 0-4.3c.1-5.1 .5-9.9 3.1-14.3c.5-.2 1-.3 1.5-.5c.4 .2 .6 .3 1 .5c.1-.8 .4-1.7 .5-2.5c6-7.7 10.4-10.9 20-12.5c1-.5 1-.5 3 0zM642.5 160c1.3 1 2.6 2 4 3c.1-.7 .4-1.3 .5-2c2 0 2 0 5.1 2.8c7.5 8.1 12.9 19 12.9 30.2c-2 .8-4 1.7-6 2.5c-4.5 2.5-4.5 2.5-9.5 7c-.5-.2-1-.3-1.5-.5c-.5-2.2-1-4.3-1.5-6.5c-.1-.5-.4-1-.5-1.5c1.5-.5 1.5-.5 4.5-.5c1.1-.7 2.3-1.3 3.5-2c-1.2-3.7-7-6.3-10-8.5c.1-.5 .4-1 .5-1.5c.6-.2 1.3-.3 2-.5c1-2.5 1-2.5 .5-6c-4.2-4.2-8.7-4.6-14.5-5.5c-1.1-.3-2.3-.7-3.5-1c-7.4-.3-12.1 .6-18.5 4.5c-.1 .2-.1 .2-.5 1c.6-.1 .6-.1 3.5-.5c5.6 1.4 10.5 3.7 15.5 6.5c0 .7 0 1.3 0 2c-1.8 .3-3.6 .7-5.5 1c-10.5 3.8-17.5 9.9-24.5 18.5c-2.6 3.1-4.6 5.2-8.5 6.5c-.1 .2-.1 .2-.5 1.5c6.9 .1 11.9-.1 18-3.5c1.4 2.1 2.8 4.3 4 6.5c1.3 1 2.6 2 4 3c.1 .3 .1 .3 1 1.5c-1.5 1-1.5 1-4.9 1.2c-11.6 .9-21.9 6.4-30.7 13.9c-2.9 2.4-2.9 2.4-4.9 2.4c-6.7-17.5-7.6-33.2 0-50.5c2.2-4.4 4.1-7.2 7.5-11c-.4-.2-.6-.3-1-.5c3.9-7.7 16.8-12.7 24.5-16c12.7-3.5 23.3-3.8 35 2.5zM739.5 180.5c.6 .3 1.3 .7 2 1c0 1.5 0 2.9 0 4.5c2.5 10.3 2.5 10.3 4 14c-1.5 .5-1.5 .5-6-1.5c-2.6-.7-5.3-1.3-8-2c.4-1.3 .6-2.7 1-4c0-5 0-5-.5-10c.5-.3 1-.7 1.5-1c.1 .2 .4 .3 .5 .5c3.5 0 3.5 0 5.5-1.5z"/><path fill="#C4CBCE" d="M722 379.5c2.5 .5 2.5 .5 4.5 2.5c1.3 5 1.3 5 .5 8c-2 1-2 1-4 1.5c-1.5-1.5-1.5-1.5-2.5-3.5c-.6-.1-1.3-.4-2-.5c-.4-.6-.6-1.3-1-2c3-4.5 3-4.5 4.5-6z"/><path fill="#FAF9F8" d="M654.5 104c.9 .1 .9 .1 5.5 .5c-2.3 1.5-4.6 3-7 4.5c-3 3.5-3 3.5-3.5 5.5c1.1-.7 2.3-1.3 3.5-2c7.5-3.7 13.6-4.8 22-5c.1 .1 .1 .1 1 .5c0 .3 0 .7 0 1c-1.5 .8-3 1.7-4.5 2.5c-2.3 2.3-4.5 4.5-6 7.5c2-.5 2-.5 4-2c.8-.2 1.6-.3 2.5-.5c.9-.3 .9-.3 5.5-1.5c9.4 0 17.9 2.5 26.5 6c0 .5 0 1 0 1.5c-5 2-5 2-6 2c.1 .7 .4 1.3 .5 2c.4-.2 .6-.3 1-.5c8.9-.5 14.6 2 21.5 7.5c6 6.5 6 6.5 6 8.5c-1.3-.1-2.6-.2-4-.3c-7.5-.3-13.2 1.6-19.5 5.8c-3.5 4-3.5 4-6 9c-.8 0-1.6 0-2.5 0c-1.6 6.1-2.1 11.2-2.1 17.5c0 1.5 0 3 0 4.6c.1 3.9 .1 3.9 1.1 7.4c-1.5 1.5-1.5 1.5-5 2c-.4 .7-.6 1.3-1 2c1.8-.2 3.6-.3 5.5-.5c11 .8 18.8 4.6 27 12c5.3 .7 5.3 .7 10.5 1c15.8 3.9 26.5 12.1 35.1 25.8c2 3.9 3.3 7.5 4.4 11.7c-.1 .5-.4 1-.5 1.5c-1.5-.5-1.5-.5-5-5c-4.5-4.5-4.5-4.5-6-5c1 3 1 3 2.9 6.1c5.7 10.6 6.6 21.6 4.6 33.4c-3.4 8.7-7.5 15-14 21.5c-.5-.1-1-.4-1.5-.5c.1-1.1 .4-2.3 .5-3.5c.1-5.9 .2-10.7-1.5-16.5c-.4-.1-.6-.4-1-.5c-.2 1.3-.4 2.6-.5 4c-2.1 11.1-7 19.5-15 27.5c-.5 .1-1 .4-1.5 .5c0 .4 0 .6 0 1c-12.6 9.5-12.6 9.5-18.5 9.5c1-2.5 1-2.5 3.5-6c2.5-5.5 2.5-5.5 2.5-8c-.4-.1-.6-.4-1-.5c-.4 .6-.6 1.3-1 2c-8.9 10.1-18.4 16.1-31.5 19c-11.5 .7-20.9-3.4-29.5-11c0-.4 0-.6 0-1c-.4 0-.6 0-1 0c.8 6.3 3.4 9.9 7.5 14.5c0 .4 0 .6 0 1c-14.5 0-27.2-5.3-37.5-15.5c-.6-.8-.6-.8-3.5-5c-.5-.5-1-1-1.5-1.5c-.5 0-1 0-1.5 0c1 6.3 2.6 11.2 5.5 17c0 .6 0 1.3 0 2c-10.8-2.1-20.7-7.8-27.4-16.7c-6-9.4-7.6-18.9-6-29.8c1.9-8.3 4.9-14.9 9.4-22c.6-1.2 1.3-2.3 2-3.5c-2 1-2 1-5 4.5c-.5 0-1 0-1.5 0c1.6-6.3 7.7-12.3 12.5-16.5c.8-.8 1.6-1.6 2.5-2.4c9.6-8.4 20.5-13.8 32.8-17.3c3.7-1.3 3.7-1.3 5.2-3.8c4.5-7 9-12.1 16-16.5c.4 0 .6 0 1 0c.1-.7 .4-1.3 .5-2c-.8-.2-1.6-.3-2.5-.5c-.1-1.4-.3-2.9-.5-4.4c-2-10.8-6.9-20.7-15-28.1c-.4-.2-.6-.3-1-.5c.5 1 1 2 1.5 3c-.1 .5-.4 1-.5 1.5c-.7-.6-.7-.6-4.5-3.5c-10-6-18.7-7.2-30.2-5.2c-15.8 4.4-29.1 13.5-39.3 26.2c-.8 .8-1.6 1.7-2.5 2.5c0-11.4 6-22.8 13-31.5c5.9-5.9 11.7-9.8 19.5-13c0-.2 0-.3 0-.5c-8 0-15.4 1.2-23 3.5c-.5 0-1 0-1.5 0c1.2-4.9 6.6-8.1 10.6-10.7c5.5-3.2 10.6-5 16.9-6.3c0-.5 0-1 0-1.5c-8-2.2-15.3-3.3-23.5-4c-.1-.3-.4-.7-.5-1c19.3-6.7 36.5-6.3 55.5 1c.5 .2 1 .3 1.5 .5c-1.5-2.5-1.5-2.5-3.5-4.5c0-.3 0-.7 0-1c1 0 2 0 3 0c.5-.3 1-.7 1.5-1c.5 0 1 0 1.5 0c.1 .2 .1 .2 1 1c1.6-2.2 3-4.6 4.5-7c1.5-1.3 3-2.7 4.5-4c.5-.7 1-1.3 1.5-2zM640.5 117.5c0 .7 0 1.3 0 2c.5 .3 .5 .3 3 2c.4-.7 .6-1.3 1-2c-1.5-1.5-1.5-1.5-4-2zM679.5 200c-4 4.6-4 4.6-4 9.5c3.6 4.3 6.6 5.1 12 6.5c.4 .3 .4 .3 2.5 2c1.5 .5 3 1 4.5 1.5c.9 5.3 .5 7.1-2 12c-8.1 8.2-15 9.1-26 9.5c-.1 .7-.4 1.3-.5 2c7.6 3.8 14.5 3 22.5 .5c4.7-2.1 7.3-3.7 11-7.5c3.5 .5 3.5 .5 7 1.5c4.3 1.1 7.5 .7 11.5-1c2.5-2.5 2.5-2.5 3.5-4.5c-2-.5-2-.5-5.8-.4c-5.2-.1-8.4-1-12.7-4.1c-1.5-4.5-1.5-4.5-2-10c1.6-1.5 3.3-2.9 5-4.5c2.5-5 2.5-5 3-9c-1.5-4.5-1.5-4.5-4.5-7c-8.7-3.2-17.1-1.4-25 3zM555.5 134.5c-2.5 2.5-2.5 2.5-6.5 5.5c-.8 .8-1.6 1.7-2.5 2.5c-3.3 1.1-6.6 2.1-10 3c-1.5 .7-3 1.3-4.5 2c-.4-.2-.6-.3-1-.5c4.2-7.8 9.8-9 18-11.6c4-.9 4-.9 6.5-.9zM728 178c2.5 1 2.5 1 5.5 3.5c0 1.3 0 2.7 0 4c.1 1.5 .4 2.9 .5 4.5c0 3.5 0 3.5-1.5 6.5c-.6 .1-.6 .1-3.5 .5c-.5-2-.5-2 1-7c0-4.1-.4-6.8-2-10.5c0-.5 0-1 0-1.5zM495.5 193c-2 4-5.7 6.6-9 9.5c-1.7 1.7-3.4 3.3-5 5c-.5-1-.5-1 0-4.5c-1-4.5-1-4.5-4-8.5c.9-.1 .9-.1 5.2-.2c4.3-.2 8.5-1.3 12.8-1.3zM618.5 196.5c-.1 2-.4 3.9-.5 6c1.2 6.3 2.9 9.4 7.5 14c.1 .1 .1 .1 1 .5c0 .5 0 1 0 1.5c-3.3 1.6-7.2 .3-10.5-.5c-4.1-2.9-6.2-5.5-8.5-10c.5-3.5 .5-3.5 5-8c5-3.5 5-3.5 6-3.5zM797 228.5c4.8 1.2 8.5 6.9 11.5 10.5c0 .3 0 .7 0 1c.6 .3 1.3 .7 2 1c.8 1.3 1.6 2.7 2.5 4c.4 .3 .6 .7 1 1c-1.1 1-2.3 2-3.5 3c-1 2.5-1 2.5-1.5 5.5c-1-1.5-1-1.5-1.9-4.7c-2.1-7.4-5.3-13-9.6-19.3c-.1-.7-.4-1.3-.5-2zM466 229c.5 1.5 .5 1.5-2 7.5c-3.6 14.2-3.6 27.9 3.1 41.1c2.9 4.9 2.9 4.9 7.4 9.9c.5 0 1 0 1.5 0c-.2-1.1-.4-2.1-.6-3.2c-.7-7.2-.2-13.9 2.1-20.8c.4 0 .6 0 1 0c.5 1 .5 1 .9 5.3c2 17.8 9.7 30.6 22.6 42.7c7.4 5.1 14.9 8.5 23.5 11c0 .5 0 1 0 1.5c-8.2 2.2-14.6 3.1-22.8 .8c-14.9-3.8-28.8-3.3-43.7 .2c-.5-2-.5-2 1.5-6.5c5.3-6.6 12.7-7.7 20.8-8.6c1.6-.1 3.1-.3 4.7-.4c-1.6-3.1-3.5-6.5-6-9c-1.8 0-3.6 0-5.5 0c-5-3.5-5-3.5-7.9-6.6c-2.6-2.9-2.6-2.9-5.6-3.9c-12.9-.4-23.7 2.9-33.5 11.5c-.5-.1-1-.4-1.5-.5c2-2.5 2-2.5 4-4.5c-1.5-.5-1.5-.5-3-.5c-1.5 3-1.5 3-1.5 6c0 1.5 0 1.5-3.5 6.5c-5.6 10.3-5.9 18.9-5 30.5c-5.1-2.6-7.3-7.6-9.5-12.5c-.5-1.8-1-3.6-1.5-5.5c-.5-.1-1-.4-1.5-.5c-2.1 10.5-2.2 19.9 1.5 30c0 .5 0 1 0 1.5c-9.8-4.9-14.8-13.2-18.5-23c-1.6-6-2.4-11.9-1.5-18c.4-.1 .4-.1 2.5-1c2.5-5 2.5-5 3-7.5c-.9 .5-1.6 1-2.5 1.5c-2.1-4.2-.2-10.6 1-15c5.6-14.8 16.3-25.1 30-32.5c10.8-4.5 10.8-4.5 13-4.5c-.1-.5-.4-1-.5-1.5c-11.3-2.5-21.3-.6-32 3c-.4 0-.6 0-1 0c1.3-5.2 8.4-9 12.5-12c13.6-7.4 26-10.4 41.5-9c.1-.3 .4-.7 .5-1c1.6 .2 3.3 .3 5 .5c4.5-1 4.5-1 7-3zM396.5 263c-2.5 2.5-2.5 2.5-6.5 5.5c-4.8 4.3-9.2 8.4-13 13.5c-.5-1-.5-1 0-4.5c-.1-1.5-.4-2.9-.5-4.5c2-2 2-2 5.5-4c.5-.3 .5-.3 3.1-1.9c8.5-5.1 8.5-5.1 11.4-4.1zM792 278.5c1.5 .5 1.5 .5 2 1.5c.1 5.6-.2 10.9-1 16.5c-1.8 .5-3.6 1-5.5 1.5c-.8 .4-1.6 .6-2.5 1c.9-2.2 2-4.4 3-6.5c2-4.8 3.1-8.9 4-14zM374.5 324c.4 .1 .6 .4 1 .5c.2 1.4 .4 2.9 .6 4.4c2 12.2 7.7 20.3 16.9 28.6c-.1 .3-.1 .3-.5 1.5c-9.6-2.8-9.6-2.8-13-5c-.4-2-.6-3.9-1-6c-2.5-3.5-2.5-3.5-6-5.5c.1-.4 .4-.6 .5-1c.1-4.1 .2-8.3 .3-12.4c.2-3.6 .2-3.6 1.2-5.1zM677.5 347c4.5 1.5 4.5 1.5 5.5 3.5c-1.6 6.6-3.8 13.1-6 19.5c-.6 2-1.2 3.9-1.9 6c-2.1 6.5-2.1 6.5-4.1 8.5c-4.5-.5-4.5-.5-6.5-2.5c1.5-5.3 3.1-10.4 5-15.6c.5-1.8 1.1-3.6 1.8-5.5c.6-1.5 1.1-3.2 1.7-4.9c.5-1.4 .9-2.6 1.4-4c1.1-3 1.1-3 3.1-5zM462.5 349c-1 2-1 2-3.3 4.2c-9.5 9.7-13.8 21.6-15.7 34.8c2-1 2-1 6-6.5c.4 0 .6 0 1 0c-.3 2.9-.6 5.7-1 8.5c-.3 13.1 .6 23.4 8 34.5c.9 .8 1.6 1.6 2.5 2.5c4.5 5 4.5 5 5.5 7c.6 .4 1.3 .6 2 1c1.1 1 2.3 2 3.5 3c.4 0 .6 0 1 0c-.8-3.6-1.6-7.4-2.5-11c-1-7.1-.1-14.1 1-21c.5-.4 1-.6 1.5-1c.5 1.6 1 3.1 1.5 4.8c3.4 9.6 7.3 16.4 15 23.2c1.6 1.5 3.3 2.9 5 4.5c2.3 1.4 4.6 2.7 7 4c.1-.5 .4-1 .5-1.5c-.4-.6-.6-1.3-1-2c0-.6 0-1.3 0-2c2 1 2 1 3.9 3.9c5.4 8 13.2 9.3 22.2 11.3c.8 .2 .8 .2 4.4 .8c1 3.5 1 3.5 2 9.5c1.4 7.6 1.4 7.6 2 10c-7.3 1.4-16-2-22.7-4.7c-1.1-.4-2.2-.9-3.3-1.3c-.4 .1-.4 .1-2 1c-14.9-3-28.1-16-39-26c-1.3 5.2 3.1 11.6 5.5 16c-1.9 9.5-11.4 17.4-19 22.5c-10.2 5.4-20.5 7.6-32 9c3.1 3.1 8.4 3.4 12.5 4.5c6.2 2.1 8.1 4.1 11 10c.5 4.5 .5 4.5-1 8c-1.3 .8-2.6 1.6-4 2.5c-.5-.1-1-.4-1.5-.5c-.4-2-.6-3.9-1-6c-.4-.8-.6-1.6-1-2.5c-1-.1-2-.4-3-.5c.4 1 .6 2 1 3c0 3.5 0 3.5-1.5 7c-3.9 2.6-9.1 2-13.5 2c-.6-.1-1.3-.4-2-.5c-.5-2-1-3.9-1.5-6c-.5-.8-1-1.6-1.5-2.5c0-.4 0-.6 0-1c-.5 0-1 0-1.5 0c-.1 2.1-.4 4.3-.5 6.5c-.4 .8-.6 1.6-1 2.5c-5.5 2.2-11.6-.4-17-2c-7.4-5.2-10.6-9.4-12.5-18c0-4.7 .1-9.3 .5-14c-.5 0-1 0-1.5 0c-.4 .6-.4 .6-2.5 4c-.4 0-.6 0-1 0c-.4 .8-.6 1.6-1 2.5c-.6 1.2-1.3 2.4-2 3.7c-1.9 4-2.6 6.9-3 11.3c-.1 0-.4 0-.5 0c-.4-1.5-.6-2.9-1-4.5c-3-3.5-3-3.5-4-4.5c.4 0 .6 0 1 0c.1-1.1 .4-2.3 .5-3.5c.4 0 .6 0 1 0c.4-1 .6-2 1-3c2.2-4.2 4.6-7.7 7.5-11.5c.5-2.6 1-5.4 1.5-8c5-12.6 12.4-23.1 21-33.5c2.8-3.4 5.4-6.9 8-10.5c-3.8-.9-7.8 1-11.5 2c-1.6 .1-3.3 .4-5 .5c0-.6 0-1.3 0-2c1.3-1.1 2.6-2.3 4-3.5c7.9-8.1 13.4-17.6 18-28c-.3-.1-.3-.1-1.5-.5c1.8-12.7 10.6-21.6 20.1-29.4c8.2-5.9 20.1-13.1 30.4-13.1zM476 422.5c-.4 .8-.6 1.6-1 2.5c-.4 .4-.6 .6-1 1c.5 2.5 .5 2.5 1.5 4c1 0 2 0 3 0c0-.5 0-1 0-1.5c.1-.1 .4-.4 .5-.5c.6 .4 1.3 .6 2 1c-1-2.5-1-2.5-4-6.5c-.4 0-.6 0-1 0zM660.5 353.5c2 1 2 1 5 5c-2.1 3.5-5.2 5.1-8.5 7.5c-.1 .5-.4 1-.5 1.5c1 .6 1.9 1.2 2.9 1.8c3.1 2.2 3.1 2.2 5.6 5.2c-2 4-2 4-3 5c-6-1.5-12.3-7-17-11c1-5.8 7-8.7 11.5-12c1.3-1 2.6-2 4-3zM686 353.5c5.9 1.1 11.4 6.9 15.5 11c-.7 5.1-3.6 6.4-7.5 9.5c-.5 .4-.5 .4-3.1 2.6c-2.4 1.9-2.4 1.9-3.9 2.4c-1.4-1.4-2.6-2.6-4-4c.9-3.4 3.9-5.2 6.5-7.5c.6-.6 1.3-1.3 2-2c-.6-.4-1.3-.6-2-1c-5.9-4.1-5.9-4.1-7-6.5c1.5-2.5 1.5-2.5 3.5-4.5zM579 360c2 .5 2 .5 6.5 4.5c2 1.5 4 3 6 4.5c.9 .6 1.6 1.3 2.5 1.9c4.6 3.5 9.4 6.7 14.2 9.9c1.8 1.3 3.7 2.5 5.6 3.8c4.1 2.6 8.1 5 12.2 7.4c.8 .6 1.6 1.3 2.5 2c2.5 1.5 5 3 7.5 4.5c6.6 4.2 13.1 8.4 19.5 13c.8 .6 .8 .6 4.9 3.3c3.7 2.6 7.1 5.3 10.6 8.2c3.2 2.6 3.2 2.6 6 4.5c6-2 11-6.6 15.5-11c.6-.4 1.3-.6 2-1c.4-.6 .6-1.3 1-2c.4-.4 .4-.4 2-2c.4 0 .6 0 1 0c.4-.6 .6-1.3 1-2c.8-1 1.6-2 2.5-3c.4 0 .6 0 1 0c.4-.8 .6-1.6 1-2.5c1.5-1.6 3-3.3 4.5-5c1.1-1.8 2.3-3.6 3.5-5.5c1-1.4 1.9-2.9 2.9-4.4c4.6-7.2 7.3-14.8 9.6-23.1c3.5 1.7 4.4 5.6 6 9c1.5 2.5 3 5 4.5 7.5c5.4 9.9 5.4 9.9 7 13c.5 .4 1 .6 1.5 1c-1.3 1.1-2.6 2.3-4 3.5c-.4 .9-.4 .9-2 5.5c-.1 0-.4 0-.5 0c-.1-1.5-.4-2.9-.5-4.5c-2-6.4-4.3-11.6-7.5-17.5c-.5-.1-1-.4-1.5-.5c.1 .4 .4 .6 .5 1c1.4 23.4-1.7 45.9-17 64.5c-1.1 1.1-2.3 2.3-3.5 3.5c-.1 0-.4 0-.5 0c.1-1.1 .4-2.3 .5-3.5c.9-6.9 1.7-13.6 1.5-20.5c-1.5 1.5-1.5 1.5-3.1 6c-5 13.5-14.3 24.7-25.9 33c-.6 .5-1.3 1-2 1.5c-.5 0-1 0-1.5 0c-1.1-1.6-2.3-3.3-3.5-5c-4-4.5-7.8-8.4-12.6-12c-4.4-3.4-6-6.4-8.6-11.2c-2.3-4.3-2.3-4.3-5.8-9.3c0-.4 0-.6 0-1c-.4 .1-.4 .1-2 1c-.6 0-1.3 0-2 0c-2.5-2.5-2.5-2.5-3-3.5c-.6-.4-1.3-.6-2-1c-1.1-1-2.3-2-3.5-3c2.5 6.3 5.1 12.3 8.3 18.2c.6 1.1 1.1 2.2 1.7 3.3c-.1 .5-.4 1-.5 1.5c-1.2-.4-2.5-.8-3.7-1.3c-3.8-1.2-3.8-1.2-4.8-1.2c1.3 3.8 7 6.2 10.3 8.4c12.8 9.3 21.8 20.7 28.2 35.1c0 .4 0 .6 0 1c-1.5-.1-3-.4-4.5-.5c0 .5 0 1 0 1.5c3.1 2.4 6.3 4.7 9.5 7c7.2 6.4 10.8 12.6 12.5 22c-1.6 5-2.9 6.9-7 10.5c-1.5-1.5-1.5-1.5-2.5-6.5c-2.5-5-2.5-5-5-7.5c-.4 0-.6 0-1 0c.5 2.5 1.2 5 2 7.5c0 5.5 0 5.5-2 9.5c-5 2.5-5 2.5-10 3.5c-1.3 .4-2.6 .6-4 1c-1.8-.1-3.6-.4-5.5-.5c-1-1.5-1-1.5-1.5-6c-2-5-2-5-3.5-6.5c-.4 .1-.6 .4-1 .5c0 2.1 0 4.3 0 6.5c-1.5 3.5-1.5 3.5-4 5c-9 1.8-17.6-1.5-25.5-6c-4.2-3-7.7-5.5-11-9.5c-.8-.4-1.6-.6-2.5-1c.3 1.2 .6 2.4 1 3.6c.5 2.1 1 4.3 1.5 6.4c-.4 .1-.6 .4-1 .5c-15.7-7.7-24.2-21-30-37c-1.6-5.3-2.6-10.1-3.5-15.5c-.6 .1-1.3 .4-2 .5c-1.9 6.4-2.6 12-2.5 18.6c0 1.4 0 2.8 0 4.2c0 1.1 0 2.1 0 3.2c-8-4-13-13.3-16.5-21c-.7-2.3-1.4-4.6-2-7c-.4-1.1-.6-2.3-1-3.5c-1-11-.6-22.1 3.5-32.5c-.6-.1-1.3-.4-2-.5c-.4 .8-.6 1.6-1 2.5c-.5 .7-.5 .7-3 4.5c-1.9 4.3-3.8 8.6-5.5 13c-.5 .1-1 .4-1.5 .5c0-4.6 .1-8.9 .5-13.5c0-1.2 0-2.4-.1-3.7c.4-19.4 5.6-36.9 19.6-50.8c2.5-2 2.5-2 6-3c-.5 4-.5 4-2 9c2-1 2-1 5.5-5c.8-.8 1.6-1.6 2.5-2.5c.8-1 1.6-2 2.5-3c4-1.5 4-1.5 6.5-2c-.7-3.1-1.4-6.1-2-9.1c-1-5.5-1.1-10.4-1-15.9zM722 380.5c-1.5 1.5-1.5 1.5-3.5 5c.1 .5 .4 1 .5 1.5c.4 .1 .4 .1 2 .5c.4 .5 .4 .5 2 3c1.1-.4 2.3-.6 3.5-1c-.1-.6-.4-1.3-.5-2c0-1 0-1 .5-2.5c-1.5-3.5-1.5-3.5-3-4.5c-.5 0-1 0-1.5 0zM709.5 400c-.5 .5-1 1-1.5 1.5c.1 .5 .4 1 .5 1.5c1-.4 2-.6 3-1c-.4-.6-.6-1.3-1-2c-.4 0-.6 0-1 0zM714.5 428.5c-.6 .6-1.3 1.3-2 2c-.4 0-.6 0-1 0c.1 .6 .4 1.3 .5 2c.4-.1 .6-.4 1-.5c.4 1.1 .6 2.3 1 3.5c2.5 .5 2.5 .5 4 0c.4-1 .6-2 1-3c-1.1-1.3-2.3-2.6-3.5-4c-.4 0-.6 0-1 0z"/><path fill="#03B5BD" d="M569 311.5c3.5 2 3.5 2 7 4.5c4.8 2.3 9.6 4.4 14.5 6.5c1.1 .5 2.3 1 3.5 1.5c28 9.3 28 9.3 42.6 9c4 0 7.5 .9 11.4 2c8.4 1.4 16.6 1.2 25 .5c1.8 0 3.6 0 5.5 0c9.7-.8 19.1-3.5 28-7.5c3.5-1.1 7-2.1 10.5-3c0 10.4-6.5 17.6-12.5 25.5c4.8-2.6 8.6-5.1 12.5-9c.6 0 1.3 0 2 0c0 13-4.1 24.7-10.5 36c-.7 1.4-1.5 2.7-2.2 4.1c-6.8 11.4-16.3 21.3-25.8 30.4c-.8 .1-1.6 .4-2.5 .5c-2.9-2.1-5.7-4.3-8.5-6.5c-5.3-3.8-10.6-7.4-16-11c-1.5-1-3-2-4.5-3c-5.8-3.8-11.6-7.4-17.5-11c-4.3-2.6-8.4-5.2-12.5-8c-1.3-.8-2.6-1.6-4-2.4c-6.4-4.1-12.5-8.5-18.5-13.1c-1-.8-2.1-1.6-3.2-2.4c-12.3-9.6-24-20.3-32.3-33.6c1-2.5 1-2.5 2.5-4c.4 0 .6 0 1 0c.4-.6 .6-1.3 1-2c2.5-3.5 2.5-3.5 3.5-4zM677.5 348c-4 6.8-6 15.1-8.5 22.5c-.8 2.1-1.5 4.2-2.2 6.4c-1.3 4.1-1.3 4.1-.3 6.1c1.5 .1 3 .4 4.5 .5c2.1-3.6 3.1-7.4 4.4-11.3c1.6-5.3 3.4-10.6 5.1-15.9c1-3.3 1-3.3 1.5-6.8c-1.5-.5-3-1-4.5-1.5zM647 365c-.4 .5-.6 1-1 1.5c1 4.7 6.5 6.6 10.2 9.3c1.4 .8 2.8 1.8 4.3 2.7c.4-.1 .4-.1 2-.5c.5-1.3 1-2.6 1.5-4c-2.8-2.3-5.6-4.4-8.5-6.5c0-.5 0-1 0-1.5c2.8-2.1 5.6-4.1 8.5-6c.1-.5 .4-1 .5-1.5c-1-1.3-2-2.6-3-4c-4 0-11.5 8.1-14.5 10.5zM686 354.5c-2 2-2 2-2.5 4c2.5 2.5 2.5 2.5 5.6 4.8c2.9 2.2 2.9 2.2 3.4 3.7c-.4 .1-.4 .1-2 1c-5 4-5 4-6.5 5.5c.5 2 .5 2 3 4.5c3.5-1.7 6.1-4.5 9-7c1.3-1 2.6-2 4-3c.1-1.1 .4-2.3 .5-3.5c-11.3-10-11.3-10-14.5-10z"/><g id="face-lights" fill="#FAF9F8"><circle cx="628.3" cy="198" r="3.4"/><circle cx="714.2" cy="182.6" r="3"/><ellipse cx="692.6" cy="201.6" rx="4.2" ry="1.6" transform="rotate(-12 692.6 201.6)"/></g><path fill="#03B5BD" d="M640 345H706L700 388L645 390Z"/><path d="M660.5 356.5L648 366L660.5 375.5M680.5 350.5L669 382.5M685.5 356.5L698.5 365.5L686 375" fill="none" stroke="#FAF9F8" stroke-width="4.6" stroke-linecap="round" stroke-linejoin="round"/></g><g id="nodes"><rect x="892.5" y="285" width="62" height="62" rx="12.4" fill="#212E34" stroke="#FAF9F8" stroke-width="4"/><circle cx="923.5" cy="316.0" r="11.5" fill="#03B5BD"/><rect x="1049" y="340.5" width="63" height="63" rx="12.6" fill="#212E34" stroke="#FAF9F8" stroke-width="4"/><circle cx="1080.5" cy="372.0" r="12" fill="#03B5BD"/><rect x="1071" y="453.5" width="78" height="78" rx="15.6" fill="#212E34" stroke="#FAF9F8" stroke-width="4"/><circle cx="1110.0" cy="492.5" r="15" fill="#03B5BD"/></g><g id="ticks" fill="none" stroke="#03B5BD" stroke-width="5.5" stroke-linecap="round"><path d="M957.5 276L971 258.5"/><path d="M969 291.5L986.5 285"/><path d="M1117.5 331.5L1132.5 314"/><path d="M1129 347.5L1148.5 341"/><path d="M1158.5 446L1175 426"/><path d="M1170 466L1194 458.5"/></g><g id="wordmark" transform="translate(293 720)"><path fill="#212E34" stroke="#FAF9F8" stroke-width="9" stroke-linejoin="round" paint-order="stroke" d="M5.7 42.7 -8.3 14.1Q1.5 14.1 6.7 12Q11.9 9.8 13.9 4.2Q15.9 -1.4 15.9 -11.8V-105.7H52.8V-3Q52.8 13.4 47.5 23.4Q42.2 33.4 31.8 38.1Q21.4 42.7 5.7 42.7ZM34.8 -125.5Q24.8 -125.5 19.2 -130.2Q13.6 -134.9 13.6 -143.5Q13.6 -151.4 19.3 -156.4Q25 -161.5 34.8 -161.5Q44.8 -161.5 50.5 -156.8Q56.1 -152.1 56.1 -143.5Q56.1 -135.6 50.4 -130.5Q44.6 -125.5 34.8 -125.5ZM114.5 1.8Q101.2 1.8 90.9 -5.2Q80.5 -12.3 74.5 -24.6Q68.5 -37 68.5 -53Q68.5 -69.1 74.5 -81.5Q80.4 -93.8 90.9 -100.8Q101.4 -107.8 115.1 -107.8Q122.4 -107.8 128.5 -105.8Q134.5 -103.7 139.2 -100.1Q143.8 -96.4 147.2 -91.6Q150.5 -86.8 152.6 -81.3L145.1 -81.7V-105.7H181.4V0H144.3V-25.8L152.5 -25.3Q150.6 -19.6 147.1 -14.7Q143.6 -9.7 138.7 -6.1Q133.8 -2.4 127.7 -0.3Q121.6 1.8 114.5 1.8ZM124.9 -28.6Q131.3 -28.6 135.8 -31.5Q140.4 -34.4 142.8 -39.8Q145.2 -45.3 145.2 -53Q145.2 -60.6 142.8 -66.1Q140.4 -71.6 135.8 -74.6Q131.3 -77.5 124.9 -77.5Q118.6 -77.5 114.1 -74.6Q109.7 -71.6 107.3 -66.1Q104.8 -60.6 104.8 -53Q104.8 -45.3 107.3 -39.8Q109.7 -34.4 114.1 -31.5Q118.6 -28.6 124.9 -28.6ZM251.7 2Q235.9 2 223.5 -5.2Q211.1 -12.3 204 -24.6Q196.9 -37 196.9 -52.9Q196.9 -68.8 204 -81.2Q211.1 -93.6 223.5 -100.7Q235.9 -107.8 251.7 -107.8Q265.9 -107.8 277.8 -103.3Q289.8 -98.7 297.1 -90.1L277 -66.4Q274.7 -69.1 271.4 -71.4Q268.1 -73.7 264 -74.9Q260 -76.2 255 -76.2Q248.4 -76.2 243.5 -73.3Q238.5 -70.4 235.8 -65.1Q233.1 -59.9 233.1 -53.1Q233.1 -46.5 235.8 -41.2Q238.4 -36 243.4 -32.9Q248.4 -29.8 255 -29.8Q260 -29.8 264 -30.9Q268 -32.1 271.3 -34.2Q274.5 -36.4 277 -39.4L296.9 -15.5Q289.8 -7.2 277.7 -2.6Q265.7 2 251.7 2ZM344.8 -30.2 328.1 -54.7 377.2 -105.7H425.4ZM308.9 0V-146.6H345.8V0ZM380.6 0 344.7 -49.1 370.6 -68.1 423.3 0Z"/><path fill="#03B5BD" stroke="#FAF9F8" stroke-width="9" stroke-linejoin="round" paint-order="stroke" d="M433.4 0V-146.6H469.5V-84.3L461.8 -81.9Q463.9 -89.3 469.6 -95.2Q475.2 -101 483.2 -104.4Q491.1 -107.8 499.9 -107.8Q511.8 -107.8 520 -102.9Q528.3 -98 532.5 -88.4Q536.7 -78.8 536.7 -65V0H499.8V-62Q499.8 -67.1 498.3 -70.6Q496.7 -74 493.6 -75.8Q490.4 -77.6 486.1 -77.5Q482.6 -77.5 479.7 -76.4Q476.8 -75.4 474.7 -73.3Q472.6 -71.3 471.5 -68.7Q470.3 -66.2 470.3 -63V0H451.9Q445.2 0 440.6 0Q436 0 433.4 0ZM608.9 2Q590.9 2 577.8 -5.1Q564.7 -12.2 557.6 -24.5Q550.4 -36.8 550.4 -52.7Q550.4 -64.7 554.4 -74.8Q558.4 -84.9 565.6 -92.3Q572.8 -99.7 582.6 -103.8Q592.4 -107.9 604 -107.9Q615.4 -107.9 624.9 -103.8Q634.4 -99.8 641.2 -92.5Q648.1 -85.2 651.7 -75.2Q655.3 -65.3 655 -53.6L654.8 -45.2H571.4L566.9 -63.6H625.2L621.6 -59.7V-63.5Q621.5 -67.7 619.3 -70.9Q617.1 -74.2 613.4 -76Q609.6 -77.8 604.7 -77.8Q598.1 -77.8 593.6 -75.2Q589.1 -72.5 586.7 -67.6Q584.3 -62.6 584.3 -55.6Q584.3 -47.8 587.7 -42Q591 -36.3 597.4 -33Q603.8 -29.8 613.1 -29.8Q619.3 -29.8 624 -31.5Q628.6 -33.2 633.9 -37.1L650.9 -13.1Q644 -7.5 637 -4.3Q630 -1 623.1 0.5Q616.1 2 608.9 2ZM669.5 0V-105.7H704L706 -70.8L698.2 -76.8Q700.7 -85.6 706.2 -92.7Q711.7 -99.7 719.4 -103.8Q727.1 -107.8 735.7 -107.8Q739.2 -107.8 742.4 -107.3Q745.5 -106.8 748.3 -106L738.2 -65.2Q736.1 -66.5 732.1 -67.6Q728.1 -68.7 723.5 -68.7Q719.6 -68.7 716.4 -67.5Q713.2 -66.2 711 -63.8Q708.9 -61.3 707.7 -58.1Q706.5 -54.8 706.5 -50.5V0ZM797.9 2.1Q784.6 2.1 774.2 -4.9Q763.9 -11.9 757.9 -24.3Q751.9 -36.6 751.9 -52.8Q751.9 -68.7 758 -81.2Q764 -93.6 774.5 -100.7Q785 -107.8 798.6 -107.8Q805.5 -107.8 811.8 -105.8Q818.1 -103.9 823.2 -100.3Q828.3 -96.7 831.7 -91.9Q835.2 -87.2 836.2 -81.9L827.7 -79.5V-146.6H864.8V0H831.2L828.6 -23.6L836 -22.1Q835.2 -17 831.8 -12.6Q828.5 -8.2 823.4 -4.9Q818.3 -1.6 811.7 0.3Q805.2 2.1 797.9 2.1ZM808.4 -28Q814.7 -28 819.3 -31.1Q823.9 -34.1 826.3 -39.6Q828.7 -45.1 828.7 -52.8Q828.7 -60.5 826.3 -66Q823.9 -71.6 819.3 -74.6Q814.7 -77.5 808.4 -77.5Q802.1 -77.5 797.6 -74.6Q793.1 -71.6 790.7 -66Q788.3 -60.5 788.3 -52.8Q788.3 -45.1 790.7 -39.6Q793.1 -34.1 797.6 -31.1Q802.1 -28 808.4 -28Z"/></g></svg>
@@ -0,0 +1,30 @@
1
+ import { describe, expect, test } from 'bun:test'
2
+ import { readFileSync } from 'node:fs'
3
+ import { join } from 'node:path'
4
+ import { outlineOf } from './outline'
5
+
6
+ const read = (name: string): string => readFileSync(join(import.meta.dir, name), 'utf8')
7
+
8
+ describe('the outlined logo', () => {
9
+ const outline = read('jackherd-logo-outline.svg')
10
+
11
+ test('is the committed file, built from the current dark logo', () => {
12
+ expect(outline).toBe(outlineOf(read('jackherd-logo-dark.svg')))
13
+ })
14
+
15
+ test('has no card, and no colour that only reads on black: ink letters, light rims, teal lanes', () => {
16
+ expect(outline).not.toContain('rx="56"')
17
+ expect(outline).not.toContain('#21BEC5')
18
+ expect(outline).not.toContain('#5B6B73')
19
+ expect(outline).toMatch(/<g id="wordmark"[^>]*><path fill="#212E34" stroke="#FAF9F8"/)
20
+ expect(outline).toMatch(/<g id="lanes" fill="#03B5BD" stroke="#FAF9F8"/)
21
+ })
22
+
23
+ test('keeps the white sticker rim around Jack of the dark logo', () => {
24
+ expect(outline).toContain('fill="#FAF9F8" stroke="#FAF9F8" stroke-width="20"')
25
+ })
26
+
27
+ test('refuses a file that is not the dark logo', () => {
28
+ expect(() => outlineOf('<svg></svg>')).toThrow()
29
+ })
30
+ })