diff options
| author | Gabriel Schneider <[email protected]> | 2026-08-12 13:32:43 -0300 |
|---|---|---|
| committer | Gabriel Schneider <[email protected]> | 2026-08-12 16:07:33 -0300 |
| commit | bc89f57cb576e23a58572ec35f96db068367f1b4 (patch) | |
| tree | 06f1ea2b7e95f229c10b316214ae904b9d43e343 | |
| parent | b424164922842796619cb6894ec46d729a8a6826 (diff) | |
| download | pardes-bc89f57cb576e23a58572ec35f96db068367f1b4.tar.gz pardes-bc89f57cb576e23a58572ec35f96db068367f1b4.zip | |
docs: the tutor taught three keystrokes wrong, and the rest had drifted
The documentation had gone stale in the ordinary way -- claims that were true
when they were written and that nothing since had been obliged to re-read.
Some of them were load-bearing.
THE TUTOR. It still said there is no multi-cursor, that NextColor cycles three
themes, and that its practice blocks "are also run as unit tests (generated
from this file by tutor_gen)" -- a tool that appears nowhere in the tree, and
nothing anywhere parses a `# keys:` block. Left alone, that claim is what
makes the next wrong block survive.
Three of those blocks WERE wrong, and all three for one reason: since the
helix motion model landed, w/e/f/t SELECT the range they cross, so `i` after
one inserts at the SELECTION'S START. `w i Z esc` on "foo bar" gives
"Zfoo bar", not the "foo Zbar" the file promised. They were written against a
vim reading of the same keys. Every block in the file has now been run through
`zig build hxdiff` against the real core and matches byte for byte, and the
trap itself is written down in 3.3 rather than left to be rediscovered.
The tutor gains a PART 4 for everything added since it was written -- PDF
panes, the in-process ZLS backend, themes and fonts, the startup file -- and
PART 3 gains counts (and which keys ignore one), f/F/t/T, the whole g table
(bare `G` is a no-op; `ge` is the START of the last line), multiple cursors
and the s/S regex pair, `m`, `]`/`[`, `|`, insert mode, and all fifty leader
paths.
THE REST. design.typ's line table claimed 7,626 lines against a real 38,048,
and its rows did not sum to its own total; its Event/Effect boundary contract
-- the part a shell author writes against -- named four variants that do not
exist and omitted fourteen that do. lsp.md's probe count. config.md's
theme-name rules, which as written could not reach a zed theme at all.
helix-keys.md's Skipped section, holding five families that have since landed.
macos.md's menu bar, undocumented, along with sixteen other claims. web.md on
what the browser build can actually do.
SOURCE COMMENTS that had rotted alongside them: `tag_normal` is a space, not
the `•` its own comment describes; Wrap is ON by default, not off; a FontSel
row is SELECTED by n and RUN by Tab, not run by n; the SPC paths in lsp.zig
lost their `l` group prefix when the language group moved; and the
differential suites are 481 and 561 cases, not 360 and 440.
TWO THINGS FOUND BY DOCUMENTING THEM, both left standing and written down
rather than papered over. Typing `[^\n]` at an s/S prompt panics: the live
preview compiles every prefix, and `[^\` indexes an empty slice in mvzr's
parseCharSet. Both the tutor and a waiver recommended that pattern as the
workaround for `.` matching a newline; they now say what it costs and what
would make it sayable. And `Exec` is a builtin, so an `Exec` line in the
startup config types that command into a shell before the first frame -- the
tutor said nothing in that file is ever sent to one.
Nine adversarial reviews over two rounds, each with the hxdiff harness to
execute what it doubted. The second round exists because the first round's
fixes needed checking too, and it caught three regressions of my own -- one of
them a probe count I had "corrected" away from the truth.
Verified: unit-test, snap 87/87, hxdiff 481/0, hxparity 561/0, mupdf-check.
docs/design.pdf regenerated. The tutor's first seventeen lines are byte-
identical, which is what tutor.golden pins.
| -rw-r--r-- | docs/config.md | 50 | ||||
| -rw-r--r-- | docs/design.pdf | 2378 | ||||
| -rw-r--r-- | docs/design.typ | 284 | ||||
| -rw-r--r-- | docs/helix-keys.md | 21 | ||||
| -rw-r--r-- | docs/lsp-evaluation.md | 13 | ||||
| -rw-r--r-- | docs/lsp.md | 35 | ||||
| -rw-r--r-- | docs/macos.md | 128 | ||||
| -rw-r--r-- | docs/web.md | 24 | ||||
| -rw-r--r-- | src/builtins.zig | 12 | ||||
| -rw-r--r-- | src/config.zig | 10 | ||||
| -rw-r--r-- | src/lsp/lsp.zig | 34 | ||||
| -rw-r--r-- | src/macos/icon.swift | 3 | ||||
| -rw-r--r-- | src/pardes.zig | 6 | ||||
| -rw-r--r-- | src/tutor.txt | 988 | ||||
| -rw-r--r-- | test/hxcases/waivers.jsonl | 2 |
15 files changed, 2803 insertions, 1185 deletions
diff --git a/docs/config.md b/docs/config.md index 7b35586c..30962ddb 100644 --- a/docs/config.md +++ b/docs/config.md @@ -8,6 +8,14 @@ Native pardes builds read a per-user `pardes` file before the first frame: - Windows: `%LOCALAPPDATA%\pardes`, with `%USERPROFILE%\AppData\Local\pardes` as the fallback. +On the two unixes `XDG_CONFIG_HOME` counts only when it is ABSOLUTE, as the +XDG base-directory specification requires; an empty or relative value falls +back to the home-directory form. Windows never consults it. A file of 1 MiB or +more, or one that cannot be read, is treated as no file at all — the path +still resolves, because "nothing is there yet" is the answer `Config` exists +to give. There is one case with no path at all: a native launch with no `HOME` +set, which `Config` reports as such. + `Config` (`SPC f c`, or the word executed anywhere) prints the resolved path into a `+Config` output pane, so the machine answers this rather than the list above. The path is printed whether or not a file is there — that is the case @@ -15,6 +23,8 @@ you ask in — and the row is ordinary text, so a right click on it opens the file. The browser build has no local user-config path and does not load this file. +(Nor does it have the `Font` builtin, or a language backend, or ptys of its +own — see `docs/web.md`.) The format is one existing builtin command per line, using the same spelling and argument parsing as commands executed inside pardes: @@ -22,14 +32,44 @@ and argument parsing as commands executed inside pardes: ```text Theme acme Font DejaVuSansMono-Regular +Shell zsh +Wrap ``` -On the SDL GUI, a selected face falls back to embedded Adwaita Mono, then to -installed `NotoSansMono-Regular`, `DejaVuSansMono`, +A line matches a builtin whose name takes NO argument only as that whole word: +`Kill` runs, `Kill something` does not. Builtins that take one (`Theme`, +`Font`, `Shell`, `Restore`, `Find`, `Grep`, `Rename`, `WsSymbols`, `Look`, +`Exec`) take everything after the name as the argument. + +`Theme <name>` wants one of the 228 names in the ring. Do not derive the +spelling — read it off `ThemeSel` (`SPC t t`), which lists every one as the +exact `Theme <name>` line that selects it. The generator lowercases, folds +punctuation runs to a single `_` and then TRIMS leading and trailing ones +(`penumbra+.toml` is `penumbra`, not `penumbra_`), and it suffixes every theme +that came from zed with `_zed` so it cannot collide with a helix theme of the +same name (zed's "Ayu Mirage" is `ayu_mirage_zed`; `ayu_mirage` is helix's). +A name that is not in the ring is ignored. + +`Shell <name>` sets the binary that the NEXT terminal pane execs; panes +already open keep the shell they are running. A bare name is resolved against +the handful of directories a shell actually lives in, not `$PATH`. + +`Font` and `FontSel` exist ONLY in the SDL GUI and native macOS builds — a +terminal's font belongs to its emulator and a browser's to the page — so a +`Font` line is one of the silently-ignored ones everywhere else. Both builds +resolve the name by walking the font directories on every lookup, so a face +installed a moment ago is findable. + +What happens to a codepoint the chosen face has no glyph for differs by shell. +The SDL GUI falls back through a chain it builds itself: embedded Adwaita +Mono, then installed `NotoSansMono-Regular`, `DejaVuSansMono`, `SymbolsNerdFont-Regular`, `NotoSansSymbols2-Regular`, -`NotoSansSymbols-Regular`, and `DejaVuSans`, in that order. Missing entries are -skipped. Faces are discovered and opened once at startup, and each resolved -glyph is retained in the GPU atlas cache. +`NotoSansSymbols-Regular`, and `DejaVuSans`, in that order, missing entries +skipped; the rasterized glyphs are retained in its GPU atlas. The macOS shell +has none of that and needs none: it embeds no font, substitutes the system +monospaced face (else Menlo) when the NAME you asked for will not load, and +leaves per-codepoint fallback to CoreText's own cascade when it draws. What it +caches is glyph ids, not pixels. Blank, unknown, malformed, or unsuccessful lines are ignored silently, and a bad line does not prevent later lines from running. Top-level text that is not diff --git a/docs/design.pdf b/docs/design.pdf index ab211161..b5b8a427 100644 --- a/docs/design.pdf +++ b/docs/design.pdf @@ -2,990 +2,1489 @@ %���� 1 0 obj -<</Type/Pages/Count 5/Kids[262 0 R 263 0 R 264 0 R 265 0 R 266 0 R]>> +<</Type/Pages/Count 7/Kids[425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R]>> endobj 2 0 obj -<</Parent 10 0 R/Next 3 0 R/Title(What it is)/Dest 237 0 R>> +<</Parent 10 0 R/Next 3 0 R/Title(What it is)/Dest 398 0 R>> endobj 3 0 obj -<</Parent 10 0 R/Next 4 0 R/Prev 2 0 R/Title(The shape)/Dest 238 0 R>> +<</Parent 10 0 R/Next 4 0 R/Prev 2 0 R/Title(The shape)/Dest 399 0 R>> endobj 4 0 obj -<</Parent 10 0 R/Next 5 0 R/Prev 3 0 R/Title(Data structures)/Dest 239 0 R>> +<</Parent 10 0 R/Next 5 0 R/Prev 3 0 R/Title(Data structures)/Dest 400 0 R>> endobj 5 0 obj -<</Parent 10 0 R/Next 6 0 R/Prev 4 0 R/Title(Style)/Dest 240 0 R>> +<</Parent 10 0 R/Next 6 0 R/Prev 4 0 R/Title(Style)/Dest 401 0 R>> endobj 6 0 obj -<</Parent 10 0 R/Next 7 0 R/Prev 5 0 R/Title(Testing: the old program is the oracle)/Dest 241 0 R>> +<</Parent 10 0 R/Next 7 0 R/Prev 5 0 R/Title(Testing: the old program is the oracle)/Dest 402 0 R>> endobj 7 0 obj -<</Parent 10 0 R/Next 8 0 R/Prev 6 0 R/Title(Build)/Dest 242 0 R>> +<</Parent 10 0 R/Next 8 0 R/Prev 6 0 R/Title(Build)/Dest 403 0 R>> endobj 8 0 obj -<</Parent 10 0 R/Next 9 0 R/Prev 7 0 R/Title(What is deliberately absent)/Dest 243 0 R>> +<</Parent 10 0 R/Next 9 0 R/Prev 7 0 R/Title(What is deliberately absent)/Dest 404 0 R>> endobj 9 0 obj -<</Parent 10 0 R/Prev 8 0 R/Title(Appendix A: feature parity checklist)/Dest 244 0 R>> +<</Parent 10 0 R/Prev 8 0 R/Title(Appendix A: feature parity checklist)/Dest 405 0 R>> endobj 10 0 obj <</Type/Outlines/First 2 0 R/Last 9 0 R/Count 8>> endobj 11 0 obj -<</Type/StructTreeRoot/RoleMap<</Datetime/Span/Terms/Part/Title/P/Strong/Span/Em/Span>>/K[234 0 R]/ParentTree<</Nums[0 12 0 R 1 13 0 R 2 14 0 R 3 15 0 R 4 16 0 R]>>/ParentTreeNextKey 5>> +<</Type/StructTreeRoot/RoleMap<</Datetime/Span/Terms/Part/Title/P/Strong/Span/Em/Span>>/K[395 0 R]/ParentTree<</Nums[0 12 0 R 1 13 0 R 2 14 0 R 3 15 0 R 4 16 0 R 5 17 0 R 6 18 0 R]>>/ParentTreeNextKey 7>> endobj 12 0 obj -[17 0 R 19 0 R 20 0 R 21 0 R 21 0 R 21 0 R 21 0 R 22 0 R 22 0 R 22 0 R 22 0 R 23 0 R 25 0 R 24 0 R 25 0 R 25 0 R 25 0 R 26 0 R 30 0 R 28 0 R 30 0 R 29 0 R 30 0 R 32 0 R 34 0 R 34 0 R 34 0 R 40 0 R 37 0 R 40 0 R 40 0 R 40 0 R 38 0 R 40 0 R 40 0 R 40 0 R 39 0 R 40 0 R 41 0 R 42 0 R 50 0 R 43 0 R 50 0 R 44 0 R 50 0 R 45 0 R 50 0 R 46 0 R 50 0 R 47 0 R 50 0 R 48 0 R 50 0 R 49 0 R 50 0 R 50 0 R 50 0 R 50 0 R 51 0 R 53 0 R 53 0 R 52 0 R 53 0 R 53 0 R 53 0 R 53 0 R 53 0 R 54 0 R 68 0 R 55 0 R 68 0 R 56 0 R 68 0 R 57 0 R 68 0 R 58 0 R 68 0 R 59 0 R 68 0 R 60 0 R 68 0 R 61 0 R 68 0 R 62 0 R 68 0 R 63 0 R 68 0 R 64 0 R 68 0 R 68 0 R 65 0 R 68 0 R 68 0 R 66 0 R 68 0 R 68 0 R 68 0 R 67 0 R 68 0 R] +[19 0 R 21 0 R 22 0 R 23 0 R 23 0 R 23 0 R 23 0 R 25 0 R 25 0 R 25 0 R 24 0 R 25 0 R 25 0 R 25 0 R 26 0 R 28 0 R 27 0 R 28 0 R 28 0 R 28 0 R 29 0 R 36 0 R 31 0 R 36 0 R 32 0 R 36 0 R 36 0 R 33 0 R 36 0 R 36 0 R 34 0 R 36 0 R 35 0 R 36 0 R 36 0 R 36 0 R 38 0 R 40 0 R 40 0 R 40 0 R 40 0 R 47 0 R 43 0 R 47 0 R 47 0 R 47 0 R 44 0 R 47 0 R 47 0 R 47 0 R 45 0 R 47 0 R 47 0 R 46 0 R 47 0 R 48 0 R 49 0 R 66 0 R 50 0 R 66 0 R 51 0 R 66 0 R 52 0 R 66 0 R 66 0 R 53 0 R 66 0 R 66 0 R 54 0 R 66 0 R 55 0 R 66 0 R 56 0 R 66 0 R 57 0 R 66 0 R 58 0 R 66 0 R 59 0 R 66 0 R 60 0 R 66 0 R 61 0 R 66 0 R 66 0 R 62 0 R 66 0 R 63 0 R 66 0 R 64 0 R 66 0 R 65 0 R 66 0 R 66 0 R 66 0 R 66 0 R] endobj 13 0 obj -[70 0 R 69 0 R 70 0 R 71 0 R 71 0 R 71 0 R 71 0 R 71 0 R 71 0 R 71 0 R 71 0 R 71 0 R 71 0 R 71 0 R 71 0 R 71 0 R 71 0 R 71 0 R 71 0 R 71 0 R 71 0 R 71 0 R 71 0 R 71 0 R 71 0 R 72 0 R 73 0 R 73 0 R 73 0 R 73 0 R 73 0 R 73 0 R 73 0 R 73 0 R 73 0 R 73 0 R 73 0 R 73 0 R 73 0 R 73 0 R 73 0 R 73 0 R 73 0 R 74 0 R 74 0 R 74 0 R 74 0 R 74 0 R 74 0 R 74 0 R 74 0 R 74 0 R 74 0 R 74 0 R 74 0 R 74 0 R 74 0 R 74 0 R 80 0 R 76 0 R 80 0 R 77 0 R 80 0 R 80 0 R 78 0 R 80 0 R 79 0 R 80 0 R 80 0 R 81 0 R 82 0 R 83 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 85 0 R 85 0 R 85 0 R 85 0 R 85 0 R 85 0 R 85 0 R 86 0 R 86 0 R 86 0 R 86 0 R 86 0 R 87 0 R 87 0 R 87 0 R 87 0 R 87 0 R 87 0 R 87 0 R 88 0 R 88 0 R 88 0 R 88 0 R 88 0 R 88 0 R 88 0 R 89 0 R 89 0 R 89 0 R 89 0 R 89 0 R 90 0 R 90 0 R 90 0 R 90 0 R 90 0 R 90 0 R 90 0 R 91 0 R 91 0 R 91 0 R 91 0 R 91 0 R 91 0 R 91 0 R 91 0 R 93 0 R 94 0 R 94 0 R 94 0 R 94 0 R 94 0 R 94 0 R 94 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 96 0 R 96 0 R 96 0 R 96 0 R 96 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 98 0 R 98 0 R 98 0 R 98 0 R 98 0 R 98 0 R 98 0 R 98 0 R 98 0 R 98 0 R 98 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 100 0 R 100 0 R 100 0 R 100 0 R 100 0 R 100 0 R 100 0 R 101 0 R 101 0 R 101 0 R 101 0 R 101 0 R 101 0 R 101 0 R 101 0 R 101 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 104 0 R 105 0 R 105 0 R 105 0 R 105 0 R 105 0 R 105 0 R 105 0 R 105 0 R 105 0 R 105 0 R 105 0 R 105 0 R 105 0 R 105 0 R 105 0 R 109 0 R 107 0 R 109 0 R 108 0 R 109 0 R 109 0 R 109 0 R 110 0 R 113 0 R 111 0 R 113 0 R 113 0 R 112 0 R 112 0 R 113 0 R 113 0 R 114 0 R 116 0 R 120 0 R 121 0 R 122 0 R 122 0 R 122 0 R 124 0 R 125 0 R 126 0 R 128 0 R 129 0 R 130 0 R] +[67 0 R 72 0 R 68 0 R 72 0 R 69 0 R 72 0 R 72 0 R 70 0 R 72 0 R 72 0 R 72 0 R 72 0 R 72 0 R 72 0 R 71 0 R 72 0 R 72 0 R 73 0 R 96 0 R 74 0 R 96 0 R 75 0 R 96 0 R 76 0 R 96 0 R 77 0 R 96 0 R 78 0 R 96 0 R 79 0 R 96 0 R 80 0 R 96 0 R 81 0 R 96 0 R 82 0 R 96 0 R 83 0 R 96 0 R 84 0 R 96 0 R 85 0 R 96 0 R 86 0 R 96 0 R 96 0 R 87 0 R 96 0 R 88 0 R 96 0 R 96 0 R 89 0 R 96 0 R 90 0 R 96 0 R 91 0 R 96 0 R 92 0 R 96 0 R 93 0 R 96 0 R 94 0 R 96 0 R 96 0 R 95 0 R 96 0 R 96 0 R 98 0 R 97 0 R 98 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 100 0 R 101 0 R 101 0 R 101 0 R 101 0 R 101 0 R 101 0 R 101 0 R 101 0 R 101 0 R 101 0 R 101 0 R 101 0 R 101 0 R 101 0 R 101 0 R 101 0 R 101 0 R 102 0 R 102 0 R 102 0 R 102 0 R 102 0 R 102 0 R 102 0 R 102 0 R 102 0 R 102 0 R 102 0 R 102 0 R 102 0 R 102 0 R 102 0 R 108 0 R 104 0 R 108 0 R 105 0 R 108 0 R 108 0 R 106 0 R 108 0 R 107 0 R 108 0 R 108 0 R 109 0 R 110 0 R 110 0 R 110 0 R 111 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 113 0 R 113 0 R 113 0 R 113 0 R 113 0 R 113 0 R 113 0 R 113 0 R 113 0 R 113 0 R 113 0 R 114 0 R 114 0 R 114 0 R 114 0 R 114 0 R 115 0 R 115 0 R 115 0 R 115 0 R 115 0 R 115 0 R 115 0 R 116 0 R 116 0 R 116 0 R 116 0 R 116 0 R 116 0 R 116 0 R 117 0 R 117 0 R 117 0 R 117 0 R 117 0 R 118 0 R 118 0 R 118 0 R 118 0 R 118 0 R 118 0 R 118 0 R 118 0 R 118 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 121 0 R 122 0 R 122 0 R 122 0 R 122 0 R 122 0 R 122 0 R 122 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 124 0 R 125 0 R 125 0 R 125 0 R 125 0 R 125 0 R 125 0 R 125 0 R 125 0 R 125 0 R 125 0 R 125 0 R 125 0 R 125 0 R 125 0 R 125 0 R 125 0 R 125 0 R 125 0 R 125 0 R 125 0 R 125 0 R 126 0 R 126 0 R 126 0 R 126 0 R 126 0 R 126 0 R 126 0 R 126 0 R 126 0 R 126 0 R 126 0 R 126 0 R 126 0 R 126 0 R 126 0 R 126 0 R 126 0 R 126 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 128 0 R 128 0 R 128 0 R 128 0 R 128 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 130 0 R 130 0 R 131 0 R 131 0 R 132 0 R 132 0 R 132 0 R 132 0 R 132 0 R 132 0 R 132 0 R 132 0 R 132 0 R 132 0 R 132 0 R 133 0 R 133 0 R 133 0 R 133 0 R 133 0 R 133 0 R 133 0 R 133 0 R 133 0 R 133 0 R 133 0 R 133 0 R 133 0 R 133 0 R 133 0 R 133 0 R 133 0 R 133 0 R 133 0 R 133 0 R 133 0 R 134 0 R 134 0 R] endobj 14 0 obj -[132 0 R 133 0 R 134 0 R 134 0 R 136 0 R 138 0 R 140 0 R 140 0 R 140 0 R 142 0 R 143 0 R 144 0 R 147 0 R 156 0 R 148 0 R 156 0 R 149 0 R 156 0 R 156 0 R 150 0 R 156 0 R 156 0 R 156 0 R 151 0 R 156 0 R 156 0 R 152 0 R 156 0 R 156 0 R 156 0 R 153 0 R 156 0 R 154 0 R 156 0 R 155 0 R 156 0 R 158 0 R 157 0 R 158 0 R 158 0 R 158 0 R 158 0 R 158 0 R 159 0 R 159 0 R 160 0 R 161 0 R 168 0 R 162 0 R 168 0 R 163 0 R 168 0 R 164 0 R 168 0 R 168 0 R 168 0 R 165 0 R 168 0 R 166 0 R 168 0 R 167 0 R 168 0 R 168 0 R 168 0 R 169 0 R 173 0 R 170 0 R 173 0 R 173 0 R 173 0 R 173 0 R 171 0 R 173 0 R 172 0 R 173 0 R 174 0 R 176 0 R 175 0 R 175 0 R 176 0 R 176 0 R 177 0 R 182 0 R 182 0 R 182 0 R 182 0 R 182 0 R 182 0 R 178 0 R 182 0 R 182 0 R 182 0 R 179 0 R 182 0 R 180 0 R 182 0 R 182 0 R] +[135 0 R 135 0 R 135 0 R 135 0 R 135 0 R 135 0 R 135 0 R 135 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 136 0 R 137 0 R 137 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 139 0 R 140 0 R 140 0 R 140 0 R 140 0 R 140 0 R 140 0 R 140 0 R 140 0 R 140 0 R 140 0 R 140 0 R 140 0 R 140 0 R 140 0 R 140 0 R 141 0 R 141 0 R 141 0 R 141 0 R 141 0 R 141 0 R 141 0 R 141 0 R 141 0 R 141 0 R 141 0 R 141 0 R 141 0 R 141 0 R 141 0 R 141 0 R 141 0 R 141 0 R 141 0 R 141 0 R 141 0 R 145 0 R 143 0 R 145 0 R 144 0 R 145 0 R 145 0 R 145 0 R 146 0 R 149 0 R 147 0 R 149 0 R 149 0 R 148 0 R 148 0 R 149 0 R 150 0 R 150 0 R 150 0 R 150 0 R 151 0 R 153 0 R 155 0 R 159 0 R 159 0 R 159 0 R 160 0 R 161 0 R 162 0 R 162 0 R 162 0 R 162 0 R 162 0 R 162 0 R 162 0 R 162 0 R 162 0 R 162 0 R 164 0 R 165 0 R 166 0 R 167 0 R 167 0 R 167 0 R 167 0 R 169 0 R 170 0 R 171 0 R 173 0 R 172 0 R 172 0 R 175 0 R 176 0 R 177 0 R 178 0 R 179 0 R 179 0 R 181 0 R 182 0 R 183 0 R 184 0 R 184 0 R 184 0 R 184 0 R 184 0 R 184 0 R 184 0 R 184 0 R 186 0 R 187 0 R 188 0 R 189 0 R 189 0 R 189 0 R 189 0 R 189 0 R 189 0 R 189 0 R 189 0 R 189 0 R] endobj 15 0 obj -[182 0 R 182 0 R 181 0 R 182 0 R 183 0 R 190 0 R 190 0 R 190 0 R 184 0 R 190 0 R 190 0 R 185 0 R 190 0 R 186 0 R 190 0 R 190 0 R 190 0 R 190 0 R 187 0 R 190 0 R 190 0 R 190 0 R 188 0 R 190 0 R 189 0 R 190 0 R 190 0 R 190 0 R 190 0 R 191 0 R 206 0 R 192 0 R 206 0 R 193 0 R 206 0 R 194 0 R 206 0 R 206 0 R 195 0 R 206 0 R 196 0 R 206 0 R 197 0 R 206 0 R 198 0 R 206 0 R 206 0 R 206 0 R 199 0 R 206 0 R 206 0 R 200 0 R 206 0 R 206 0 R 201 0 R 206 0 R 202 0 R 202 0 R 206 0 R 203 0 R 206 0 R 204 0 R 206 0 R 206 0 R 205 0 R 206 0 R 207 0 R 213 0 R 208 0 R 208 0 R 213 0 R 209 0 R 213 0 R 210 0 R 213 0 R 213 0 R 211 0 R 213 0 R 212 0 R 213 0 R 213 0 R 214 0 R 216 0 R 216 0 R 215 0 R 216 0 R 216 0 R 216 0 R 216 0 R 216 0 R 217 0 R 227 0 R 218 0 R 227 0 R 227 0 R 227 0 R 219 0 R 227 0 R 227 0 R 220 0 R 227 0 R 221 0 R 227 0 R 222 0 R 227 0 R 227 0 R 227 0 R 227 0 R 223 0 R 227 0 R 224 0 R 224 0 R 227 0 R 225 0 R 227 0 R 226 0 R 227 0 R 227 0 R 227 0 R 227 0 R 228 0 R 233 0 R 233 0 R 233 0 R 233 0 R 233 0 R 229 0 R 233 0 R] +[191 0 R 195 0 R 192 0 R 195 0 R 193 0 R 195 0 R 194 0 R 196 0 R 198 0 R 200 0 R 200 0 R 200 0 R 200 0 R 207 0 R 207 0 R 207 0 R 203 0 R 207 0 R 207 0 R 207 0 R 204 0 R 207 0 R 205 0 R 207 0 R 206 0 R 207 0 R 207 0 R 208 0 R 208 0 R 208 0 R 209 0 R 218 0 R 210 0 R 218 0 R 211 0 R 218 0 R 218 0 R 212 0 R 218 0 R 218 0 R 218 0 R 213 0 R 218 0 R 218 0 R 214 0 R 218 0 R 218 0 R 218 0 R 215 0 R 218 0 R 216 0 R 216 0 R 218 0 R 217 0 R 218 0 R 220 0 R 219 0 R 220 0 R 220 0 R 220 0 R 220 0 R 220 0 R 227 0 R 221 0 R 227 0 R 222 0 R 227 0 R 227 0 R 223 0 R 227 0 R 224 0 R 227 0 R 225 0 R 227 0 R 227 0 R 226 0 R 227 0 R 227 0 R 227 0 R 227 0 R 228 0 R 250 0 R 229 0 R 250 0 R 230 0 R 250 0 R 231 0 R 250 0 R 232 0 R 250 0 R 233 0 R 250 0 R 234 0 R 250 0 R 235 0 R 250 0 R 236 0 R 236 0 R 250 0 R 237 0 R 250 0 R 250 0 R 238 0 R 250 0 R 239 0 R 250 0 R 240 0 R 250 0 R 241 0 R 250 0 R 250 0 R 250 0 R 242 0 R 250 0 R 250 0 R 243 0 R 250 0 R 244 0 R 250 0 R 245 0 R 250 0 R 246 0 R 250 0 R 247 0 R 250 0 R 250 0 R 248 0 R 250 0 R] endobj 16 0 obj -[233 0 R 230 0 R 233 0 R 233 0 R 233 0 R 233 0 R 233 0 R 233 0 R 233 0 R 233 0 R 233 0 R 231 0 R 233 0 R 233 0 R 232 0 R 233 0 R 233 0 R] +[250 0 R 249 0 R 250 0 R 250 0 R 251 0 R 260 0 R 252 0 R 260 0 R 260 0 R 260 0 R 253 0 R 260 0 R 260 0 R 254 0 R 260 0 R 255 0 R 260 0 R 260 0 R 256 0 R 260 0 R 257 0 R 260 0 R 260 0 R 258 0 R 260 0 R 260 0 R 259 0 R 260 0 R 260 0 R 263 0 R 261 0 R 263 0 R 263 0 R 263 0 R 262 0 R 263 0 R 263 0 R 264 0 R 266 0 R 265 0 R 266 0 R 266 0 R 266 0 R 266 0 R 267 0 R 272 0 R 272 0 R 272 0 R 272 0 R 268 0 R 272 0 R 272 0 R 272 0 R 269 0 R 272 0 R 270 0 R 272 0 R 272 0 R 272 0 R 272 0 R 271 0 R 272 0 R 273 0 R 285 0 R 285 0 R 285 0 R 274 0 R 285 0 R 285 0 R 275 0 R 285 0 R 276 0 R 285 0 R 285 0 R 285 0 R 285 0 R 277 0 R 285 0 R 285 0 R 285 0 R 278 0 R 285 0 R 279 0 R 285 0 R 285 0 R 285 0 R 280 0 R 285 0 R 285 0 R 285 0 R 282 0 R 285 0 R 285 0 R 285 0 R 284 0 R 285 0 R 285 0 R 285 0 R 286 0 R 346 0 R 287 0 R 346 0 R 288 0 R 346 0 R 289 0 R 346 0 R 290 0 R 290 0 R 346 0 R 291 0 R 346 0 R 292 0 R 346 0 R 293 0 R 346 0 R 294 0 R 346 0 R 346 0 R 295 0 R 346 0 R 296 0 R 346 0 R 297 0 R 346 0 R 298 0 R 346 0 R 299 0 R 346 0 R 300 0 R 346 0 R 301 0 R 346 0 R 302 0 R 346 0 R 303 0 R 346 0 R 346 0 R 304 0 R 346 0 R 305 0 R 346 0 R 306 0 R 346 0 R 307 0 R 346 0 R 308 0 R 346 0 R] endobj 17 0 obj -<</Type/StructElem/S/Strong/P 18 0 R/K[0]/Pg 262 0 R>> +[346 0 R 309 0 R 346 0 R 310 0 R 346 0 R 311 0 R 346 0 R 312 0 R 346 0 R 313 0 R 346 0 R 314 0 R 346 0 R 315 0 R 346 0 R 316 0 R 346 0 R 317 0 R 346 0 R 318 0 R 346 0 R 346 0 R 320 0 R 321 0 R 322 0 R 346 0 R 346 0 R 324 0 R 346 0 R 325 0 R 346 0 R 326 0 R 346 0 R 327 0 R 346 0 R 328 0 R 328 0 R 346 0 R 329 0 R 346 0 R 330 0 R 346 0 R 331 0 R 346 0 R 332 0 R 346 0 R 333 0 R 346 0 R 334 0 R 346 0 R 335 0 R 346 0 R 336 0 R 346 0 R 346 0 R 346 0 R 346 0 R 337 0 R 346 0 R 338 0 R 346 0 R 346 0 R 346 0 R 339 0 R 346 0 R 346 0 R 340 0 R 346 0 R 341 0 R 346 0 R 346 0 R 342 0 R 346 0 R 343 0 R 346 0 R 344 0 R 346 0 R 346 0 R 345 0 R 346 0 R 347 0 R 353 0 R 348 0 R 348 0 R 353 0 R 349 0 R 353 0 R 350 0 R 353 0 R 353 0 R 351 0 R 353 0 R 352 0 R 353 0 R 353 0 R 354 0 R 358 0 R 358 0 R 355 0 R 358 0 R 358 0 R 358 0 R 358 0 R 358 0 R 356 0 R 358 0 R 358 0 R 357 0 R 358 0 R 358 0 R 358 0 R 359 0 R 372 0 R 372 0 R 360 0 R 372 0 R 372 0 R 361 0 R 372 0 R 362 0 R 372 0 R 363 0 R 372 0 R 364 0 R 372 0 R 365 0 R 372 0 R 366 0 R 372 0 R 367 0 R 372 0 R 368 0 R 372 0 R 369 0 R 372 0 R 370 0 R 372 0 R 372 0 R 371 0 R 372 0 R 372 0 R 373 0 R 388 0 R 374 0 R 388 0 R 388 0 R 388 0 R 375 0 R 388 0 R 376 0 R 388 0 R 388 0 R 377 0 R 388 0 R 378 0 R 388 0 R 379 0 R 388 0 R 388 0 R 388 0 R 380 0 R 388 0 R 381 0 R 388 0 R 388 0 R 388 0 R 388 0 R 382 0 R 388 0 R 383 0 R 388 0 R 388 0 R 388 0 R 384 0 R 388 0 R 388 0 R 385 0 R 388 0 R 386 0 R 388 0 R 387 0 R 388 0 R 388 0 R 388 0 R 388 0 R 389 0 R 394 0 R 394 0 R 394 0 R] endobj 18 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[17 0 R]>> +[394 0 R 394 0 R 390 0 R 394 0 R 394 0 R 391 0 R 394 0 R 394 0 R 394 0 R 394 0 R 394 0 R 394 0 R 394 0 R 394 0 R 394 0 R 392 0 R 394 0 R 394 0 R 393 0 R 394 0 R 394 0 R] endobj 19 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[1]/Pg 262 0 R>> +<</Type/StructElem/S/Strong/P 20 0 R/K[0]/Pg 425 0 R>> endobj 20 0 obj -<</Type/StructElem/S/H1/P 234 0 R/T(What it is)/K[2]/Pg 262 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[19 0 R]>> endobj 21 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[3 4 5 6]/Pg 262 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[1]/Pg 425 0 R>> endobj 22 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[7 8 9 10]/Pg 262 0 R>> +<</Type/StructElem/S/H1/P 395 0 R/T(What it is)/K[2]/Pg 425 0 R>> endobj 23 0 obj -<</Type/StructElem/S/H1/P 234 0 R/T(The shape)/K[11]/Pg 262 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[3 4 5 6]/Pg 425 0 R>> endobj 24 0 obj -<</Type/StructElem/S/Strong/P 25 0 R/K[13]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 25 0 R/K[10]/Pg 425 0 R>> endobj 25 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[12 24 0 R 14 15 16]/Pg 262 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[7 8 9 24 0 R 11 12 13]/Pg 425 0 R>> endobj 26 0 obj -<</Type/StructElem/S/Strong/P 27 0 R/K[17]/Pg 262 0 R>> +<</Type/StructElem/S/H1/P 395 0 R/T(The shape)/K[14]/Pg 425 0 R>> endobj 27 0 obj -<</Type/StructElem/S/TD/P 31 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[26 0 R]>> +<</Type/StructElem/S/Strong/P 28 0 R/K[16]/Pg 425 0 R>> endobj 28 0 obj -<</Type/StructElem/S/Code/P 30 0 R/K[19]/Pg 262 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[15 27 0 R 17 18 19]/Pg 425 0 R>> endobj 29 0 obj -<</Type/StructElem/S/Code/P 30 0 R/K[21]/Pg 262 0 R>> +<</Type/StructElem/S/Strong/P 30 0 R/K[20]/Pg 425 0 R>> endobj 30 0 obj -<</Type/StructElem/S/TD/P 31 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[18 28 0 R 20 29 0 R 22]/Pg 262 0 R>> +<</Type/StructElem/S/TD/P 37 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[29 0 R]>> endobj 31 0 obj -<</Type/StructElem/S/TR/P 36 0 R/K[27 0 R 30 0 R]>> +<</Type/StructElem/S/Code/P 36 0 R/K[22]/Pg 425 0 R>> endobj 32 0 obj -<</Type/StructElem/S/Strong/P 33 0 R/K[23]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 36 0 R/K[24]/Pg 425 0 R>> endobj 33 0 obj -<</Type/StructElem/S/TD/P 35 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[32 0 R]>> +<</Type/StructElem/S/Code/P 36 0 R/K[27]/Pg 425 0 R>> endobj 34 0 obj -<</Type/StructElem/S/TD/P 35 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[24 25 26]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 36 0 R/K[30]/Pg 425 0 R>> endobj 35 0 obj -<</Type/StructElem/S/TR/P 36 0 R/K[33 0 R 34 0 R]>> +<</Type/StructElem/S/Code/P 36 0 R/K[32]/Pg 425 0 R>> endobj 36 0 obj -<</Type/StructElem/S/Table/P 234 0 R/A[<</O/Layout/BorderColor[0 0 0]/BorderThickness 0.4>>]/K[31 0 R 35 0 R]>> +<</Type/StructElem/S/TD/P 37 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[21 31 0 R 23 32 0 R 25 26 33 0 R 28 29 34 0 R 31 35 0 R 33 34 35]/Pg 425 0 R>> endobj 37 0 obj -<</Type/StructElem/S/Strong/P 40 0 R/K[28]/Pg 262 0 R>> +<</Type/StructElem/S/TR/P 42 0 R/K[30 0 R 36 0 R]>> endobj 38 0 obj -<</Type/StructElem/S/Code/P 40 0 R/K[32]/Pg 262 0 R>> +<</Type/StructElem/S/Strong/P 39 0 R/K[36]/Pg 425 0 R>> endobj 39 0 obj -<</Type/StructElem/S/Code/P 40 0 R/K[36]/Pg 262 0 R>> +<</Type/StructElem/S/TD/P 41 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[38 0 R]>> endobj 40 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[27 37 0 R 29 30 31 38 0 R 33 34 35 39 0 R 37]/Pg 262 0 R>> +<</Type/StructElem/S/TD/P 41 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[37 38 39 40]/Pg 425 0 R>> endobj 41 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[38]/Pg 262 0 R>> +<</Type/StructElem/S/TR/P 42 0 R/K[39 0 R 40 0 R]>> endobj 42 0 obj -<</Type/StructElem/S/Strong/P 50 0 R/K[39]/Pg 262 0 R>> +<</Type/StructElem/S/Table/P 395 0 R/A[<</O/Layout/BorderColor[0 0 0]/BorderThickness 0.4>>]/K[37 0 R 41 0 R]>> endobj 43 0 obj -<</Type/StructElem/S/Code/P 50 0 R/K[41]/Pg 262 0 R>> +<</Type/StructElem/S/Strong/P 47 0 R/K[42]/Pg 425 0 R>> endobj 44 0 obj -<</Type/StructElem/S/Code/P 50 0 R/K[43]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 47 0 R/K[46]/Pg 425 0 R>> endobj 45 0 obj -<</Type/StructElem/S/Code/P 50 0 R/K[45]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 47 0 R/K[50]/Pg 425 0 R>> endobj 46 0 obj -<</Type/StructElem/S/Code/P 50 0 R/K[47]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 47 0 R/K[53]/Pg 425 0 R>> endobj 47 0 obj -<</Type/StructElem/S/Code/P 50 0 R/K[49]/Pg 262 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[41 43 0 R 43 44 45 44 0 R 47 48 49 45 0 R 51 52 46 0 R 54]/Pg 425 0 R>> endobj 48 0 obj -<</Type/StructElem/S/Code/P 50 0 R/K[51]/Pg 262 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[55]/Pg 425 0 R>> endobj 49 0 obj -<</Type/StructElem/S/Code/P 50 0 R/K[53]/Pg 262 0 R>> +<</Type/StructElem/S/Strong/P 66 0 R/K[56]/Pg 425 0 R>> endobj 50 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[42 0 R 40 43 0 R 42 44 0 R 44 45 0 R 46 46 0 R 48 47 0 R 50 48 0 R 52 49 0 R 54 55 56 57]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 66 0 R/K[58]/Pg 425 0 R>> endobj 51 0 obj -<</Type/StructElem/S/Strong/P 53 0 R/K[58]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 66 0 R/K[60]/Pg 425 0 R>> endobj 52 0 obj -<</Type/StructElem/S/Strong/P 53 0 R/K[61]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 66 0 R/K[62]/Pg 425 0 R>> endobj 53 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[51 0 R 59 60 52 0 R 62 63 64 65 66]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 66 0 R/K[65]/Pg 425 0 R>> endobj 54 0 obj -<</Type/StructElem/S/Strong/P 68 0 R/K[67]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 66 0 R/K[68]/Pg 425 0 R>> endobj 55 0 obj -<</Type/StructElem/S/Code/P 68 0 R/K[69]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 66 0 R/K[70]/Pg 425 0 R>> endobj 56 0 obj -<</Type/StructElem/S/Code/P 68 0 R/K[71]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 66 0 R/K[72]/Pg 425 0 R>> endobj 57 0 obj -<</Type/StructElem/S/Code/P 68 0 R/K[73]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 66 0 R/K[74]/Pg 425 0 R>> endobj 58 0 obj -<</Type/StructElem/S/Code/P 68 0 R/K[75]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 66 0 R/K[76]/Pg 425 0 R>> endobj 59 0 obj -<</Type/StructElem/S/Code/P 68 0 R/K[77]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 66 0 R/K[78]/Pg 425 0 R>> endobj 60 0 obj -<</Type/StructElem/S/Code/P 68 0 R/K[79]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 66 0 R/K[80]/Pg 425 0 R>> endobj 61 0 obj -<</Type/StructElem/S/Code/P 68 0 R/K[81]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 66 0 R/K[82]/Pg 425 0 R>> endobj 62 0 obj -<</Type/StructElem/S/Code/P 68 0 R/K[83]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 66 0 R/K[85]/Pg 425 0 R>> endobj 63 0 obj -<</Type/StructElem/S/Code/P 68 0 R/K[85]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 66 0 R/K[87]/Pg 425 0 R>> endobj 64 0 obj -<</Type/StructElem/S/Code/P 68 0 R/K[87]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 66 0 R/K[89]/Pg 425 0 R>> endobj 65 0 obj -<</Type/StructElem/S/Code/P 68 0 R/K[90]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 66 0 R/K[91]/Pg 425 0 R>> endobj 66 0 obj -<</Type/StructElem/S/Code/P 68 0 R/K[93]/Pg 262 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[49 0 R 57 50 0 R 59 51 0 R 61 52 0 R 63 64 53 0 R 66 67 54 0 R 69 55 0 R 71 56 0 R 73 57 0 R 75 58 0 R 77 59 0 R 79 60 0 R 81 61 0 R 83 84 62 0 R 86 63 0 R 88 64 0 R 90 65 0 R 92 93 94 95]/Pg 425 0 R>> endobj 67 0 obj -<</Type/StructElem/S/Code/P 68 0 R/K[97]/Pg 262 0 R>> +<</Type/StructElem/S/Strong/P 72 0 R/K[0]/Pg 426 0 R>> endobj 68 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[54 0 R 68 55 0 R 70 56 0 R 72 57 0 R 74 58 0 R 76 59 0 R 78 60 0 R 80 61 0 R 82 62 0 R 84 63 0 R 86 64 0 R 88 89 65 0 R 91 92 66 0 R 94 95 96 67 0 R 98]/Pg 262 0 R>> +<</Type/StructElem/S/Code/P 72 0 R/K[2]/Pg 426 0 R>> endobj 69 0 obj -<</Type/StructElem/S/Code/P 70 0 R/K[1]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 72 0 R/K[4]/Pg 426 0 R>> endobj 70 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[0 69 0 R 2]/Pg 263 0 R>> +<</Type/StructElem/S/Strong/P 72 0 R/K[7]/Pg 426 0 R>> endobj 71 0 obj -<</Type/StructElem/S/P/P 75 0 R/K[3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 72 0 R/K[14]/Pg 426 0 R>> endobj 72 0 obj -<</Type/StructElem/S/P/P 75 0 R/K[25]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[67 0 R 1 68 0 R 3 69 0 R 5 6 70 0 R 8 9 10 11 12 13 71 0 R 15 16]/Pg 426 0 R>> endobj 73 0 obj -<</Type/StructElem/S/P/P 75 0 R/K[26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42]/Pg 263 0 R>> +<</Type/StructElem/S/Strong/P 96 0 R/K[17]/Pg 426 0 R>> endobj 74 0 obj -<</Type/StructElem/S/P/P 75 0 R/K[43 44 45 46 47 48 49 50 51 52 53 54 55 56 57]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[19]/Pg 426 0 R>> endobj 75 0 obj -<</Type/StructElem/S/Code/P 234 0 R/A[<</O/Layout/Placement/Block>>]/K[71 0 R 72 0 R 73 0 R 74 0 R]>> +<</Type/StructElem/S/Code/P 96 0 R/K[21]/Pg 426 0 R>> endobj 76 0 obj -<</Type/StructElem/S/Code/P 80 0 R/K[59]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[23]/Pg 426 0 R>> endobj 77 0 obj -<</Type/StructElem/S/Strong/P 80 0 R/K[61]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[25]/Pg 426 0 R>> endobj 78 0 obj -<</Type/StructElem/S/Code/P 80 0 R/K[64]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[27]/Pg 426 0 R>> endobj 79 0 obj -<</Type/StructElem/S/Code/P 80 0 R/K[66]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[29]/Pg 426 0 R>> endobj 80 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[58 76 0 R 60 77 0 R 62 63 78 0 R 65 79 0 R 67 68]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[31]/Pg 426 0 R>> endobj 81 0 obj -<</Type/StructElem/S/H1/P 234 0 R/T(Data structures)/K[69]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[33]/Pg 426 0 R>> endobj 82 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[70]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[35]/Pg 426 0 R>> endobj 83 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[71]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[37]/Pg 426 0 R>> endobj 84 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[72 73 74 75 76 77 78]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[39]/Pg 426 0 R>> endobj 85 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[79 80 81 82 83 84 85]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[41]/Pg 426 0 R>> endobj 86 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[86 87 88 89 90]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[43]/Pg 426 0 R>> endobj 87 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[91 92 93 94 95 96 97]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[46]/Pg 426 0 R>> endobj 88 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[98 99 100 101 102 103 104]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[48]/Pg 426 0 R>> endobj 89 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[105 106 107 108 109]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[51]/Pg 426 0 R>> endobj 90 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[110 111 112 113 114 115 116]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[53]/Pg 426 0 R>> endobj 91 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[117 118 119 120 121 122 123 124]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[55]/Pg 426 0 R>> endobj 92 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[]>> +<</Type/StructElem/S/Code/P 96 0 R/K[57]/Pg 426 0 R>> endobj 93 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[125]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[59]/Pg 426 0 R>> endobj 94 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[126 127 128 129 130 131 132]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[61]/Pg 426 0 R>> endobj 95 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 96 0 R/K[64]/Pg 426 0 R>> endobj 96 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[158 159 160 161 162]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[73 0 R 18 74 0 R 20 75 0 R 22 76 0 R 24 77 0 R 26 78 0 R 28 79 0 R 30 80 0 R 32 81 0 R 34 82 0 R 36 83 0 R 38 84 0 R 40 85 0 R 42 86 0 R 44 45 87 0 R 47 88 0 R 49 50 89 0 R 52 90 0 R 54 91 0 R 56 92 0 R 58 93 0 R 60 94 0 R 62 63 95 0 R 65 66]/Pg 426 0 R>> endobj 97 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 98 0 R/K[68]/Pg 426 0 R>> endobj 98 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[182 183 184 185 186 187 188 189 190 191 192]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[67 97 0 R 69]/Pg 426 0 R>> endobj 99 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 103 0 R/K[70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94]/Pg 426 0 R>> endobj 100 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[212 213 214 215 216 217 218]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 103 0 R/K[95]/Pg 426 0 R>> endobj 101 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[219 220 221 222 223 224 225 226 227]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 103 0 R/K[96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112]/Pg 426 0 R>> endobj 102 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[]>> +<</Type/StructElem/S/P/P 103 0 R/K[113 114 115 116 117 118 119 120 121 122 123 124 125 126 127]/Pg 426 0 R>> endobj 103 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 395 0 R/A[<</O/Layout/Placement/Block>>]/K[99 0 R 100 0 R 101 0 R 102 0 R]>> endobj 104 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 108 0 R/K[129]/Pg 426 0 R>> endobj 105 0 obj -<</Type/StructElem/S/P/P 106 0 R/K[284 285 286 287 288 289 290 291 292 293 294 295 296 297 298]/Pg 263 0 R>> +<</Type/StructElem/S/Strong/P 108 0 R/K[131]/Pg 426 0 R>> endobj 106 0 obj -<</Type/StructElem/S/Code/P 234 0 R/A[<</O/Layout/Placement/Block>>]/K[83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R 91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R 103 0 R 104 0 R 105 0 R]>> +<</Type/StructElem/S/Code/P 108 0 R/K[134]/Pg 426 0 R>> endobj 107 0 obj -<</Type/StructElem/S/Code/P 109 0 R/K[300]/Pg 263 0 R>> +<</Type/StructElem/S/Code/P 108 0 R/K[136]/Pg 426 0 R>> endobj 108 0 obj -<</Type/StructElem/S/Code/P 109 0 R/K[302]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[128 104 0 R 130 105 0 R 132 133 106 0 R 135 107 0 R 137 138]/Pg 426 0 R>> endobj 109 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[299 107 0 R 301 108 0 R 303 304 305]/Pg 263 0 R>> +<</Type/StructElem/S/H1/P 395 0 R/T(Data structures)/K[139]/Pg 426 0 R>> endobj 110 0 obj -<</Type/StructElem/S/H1/P 234 0 R/T(Style)/K[306]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[140 141 142]/Pg 426 0 R>> endobj 111 0 obj -<</Type/StructElem/S/Code/P 113 0 R/K[308]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[143]/Pg 426 0 R>> endobj 112 0 obj -<</Type/StructElem/S/Code/P 113 0 R/K[311 312]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167]/Pg 426 0 R>> endobj 113 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[307 111 0 R 309 310 112 0 R 313 314]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[168 169 170 171 172 173 174 175 176 177 178]/Pg 426 0 R>> endobj 114 0 obj -<</Type/StructElem/S/Strong/P 115 0 R/K[315]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[179 180 181 182 183]/Pg 426 0 R>> endobj 115 0 obj -<</Type/StructElem/S/TD/P 119 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[114 0 R]>> +<</Type/StructElem/S/P/P 142 0 R/K[184 185 186 187 188 189 190]/Pg 426 0 R>> endobj 116 0 obj -<</Type/StructElem/S/Strong/P 117 0 R/K[316]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[191 192 193 194 195 196 197]/Pg 426 0 R>> endobj 117 0 obj -<</Type/StructElem/S/TD/P 119 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[116 0 R]>> +<</Type/StructElem/S/P/P 142 0 R/K[198 199 200 201 202]/Pg 426 0 R>> endobj 118 0 obj -<</Type/StructElem/S/TD/P 119 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[]>> +<</Type/StructElem/S/P/P 142 0 R/K[203 204 205 206 207 208 209 210 211]/Pg 426 0 R>> endobj 119 0 obj -<</Type/StructElem/S/TR/P 146 0 R/K[115 0 R 117 0 R 118 0 R]>> +<</Type/StructElem/S/P/P 142 0 R/K[212 213 214 215 216 217 218 219 220 221 222 223 224 225 226]/Pg 426 0 R>> endobj 120 0 obj -<</Type/StructElem/S/TD/P 123 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[317]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[]>> endobj 121 0 obj -<</Type/StructElem/S/TD/P 123 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[318]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[227]/Pg 426 0 R>> endobj 122 0 obj -<</Type/StructElem/S/TD/P 123 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[319 320 321]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[228 229 230 231 232 233 234]/Pg 426 0 R>> endobj 123 0 obj -<</Type/StructElem/S/TR/P 146 0 R/K[120 0 R 121 0 R 122 0 R]>> +<</Type/StructElem/S/P/P 142 0 R/K[235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256]/Pg 426 0 R>> endobj 124 0 obj -<</Type/StructElem/S/TD/P 127 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[322]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285]/Pg 426 0 R>> endobj 125 0 obj -<</Type/StructElem/S/TD/P 127 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[323]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306]/Pg 426 0 R>> endobj 126 0 obj -<</Type/StructElem/S/TD/P 127 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[324]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324]/Pg 426 0 R>> endobj 127 0 obj -<</Type/StructElem/S/TR/P 146 0 R/K[124 0 R 125 0 R 126 0 R]>> +<</Type/StructElem/S/P/P 142 0 R/K[325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346]/Pg 426 0 R>> endobj 128 0 obj -<</Type/StructElem/S/TD/P 131 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[325]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[347 348 349 350 351]/Pg 426 0 R>> endobj 129 0 obj -<</Type/StructElem/S/TD/P 131 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[326]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370]/Pg 426 0 R>> endobj 130 0 obj -<</Type/StructElem/S/TD/P 131 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[327]/Pg 263 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[371 372]/Pg 426 0 R>> endobj 131 0 obj -<</Type/StructElem/S/TR/P 146 0 R/K[128 0 R 129 0 R 130 0 R]>> +<</Type/StructElem/S/P/P 142 0 R/K[373 374]/Pg 426 0 R>> endobj 132 0 obj -<</Type/StructElem/S/TD/P 135 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[0]/Pg 264 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[375 376 377 378 379 380 381 382 383 384 385]/Pg 426 0 R>> endobj 133 0 obj -<</Type/StructElem/S/TD/P 135 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[1]/Pg 264 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406]/Pg 426 0 R>> endobj 134 0 obj -<</Type/StructElem/S/TD/P 135 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[2 3]/Pg 264 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[407 408]/Pg 426 0 R>> endobj 135 0 obj -<</Type/StructElem/S/TR/P 146 0 R/K[132 0 R 133 0 R 134 0 R]>> +<</Type/StructElem/S/P/P 142 0 R/K[0 1 2 3 4 5 6 7]/Pg 427 0 R>> endobj 136 0 obj -<</Type/StructElem/S/Strong/P 137 0 R/K[4]/Pg 264 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36]/Pg 427 0 R>> endobj 137 0 obj -<</Type/StructElem/S/TD/P 141 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[136 0 R]>> +<</Type/StructElem/S/P/P 142 0 R/K[37 38]/Pg 427 0 R>> endobj 138 0 obj -<</Type/StructElem/S/Strong/P 139 0 R/K[5]/Pg 264 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[]>> endobj 139 0 obj -<</Type/StructElem/S/TD/P 141 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[138 0 R]>> +<</Type/StructElem/S/P/P 142 0 R/K[39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67]/Pg 427 0 R>> endobj 140 0 obj -<</Type/StructElem/S/TD/P 141 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[6 7 8]/Pg 264 0 R>> +<</Type/StructElem/S/P/P 142 0 R/K[68 69 70 71 72 73 74 75 76 77 78 79 80 81 82]/Pg 427 0 R>> endobj 141 0 obj -<</Type/StructElem/S/TR/P 146 0 R/K[137 0 R 139 0 R 140 0 R]>> +<</Type/StructElem/S/P/P 142 0 R/K[83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103]/Pg 427 0 R>> endobj 142 0 obj -<</Type/StructElem/S/TD/P 145 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[9]/Pg 264 0 R>> +<</Type/StructElem/S/Code/P 395 0 R/A[<</O/Layout/Placement/Block>>]/K[111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R 129 0 R 130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R]>> endobj 143 0 obj -<</Type/StructElem/S/TD/P 145 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[10]/Pg 264 0 R>> +<</Type/StructElem/S/Code/P 145 0 R/K[105]/Pg 427 0 R>> endobj 144 0 obj -<</Type/StructElem/S/TD/P 145 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[11]/Pg 264 0 R>> +<</Type/StructElem/S/Code/P 145 0 R/K[107]/Pg 427 0 R>> endobj 145 0 obj -<</Type/StructElem/S/TR/P 146 0 R/K[142 0 R 143 0 R 144 0 R]>> +<</Type/StructElem/S/P/P 395 0 R/K[104 143 0 R 106 144 0 R 108 109 110]/Pg 427 0 R>> endobj 146 0 obj -<</Type/StructElem/S/Table/P 234 0 R/A[<</O/Layout/BorderColor[0 0 0]/BorderThickness 0.4>>]/K[119 0 R 123 0 R 127 0 R 131 0 R 135 0 R 141 0 R 145 0 R]>> +<</Type/StructElem/S/H1/P 395 0 R/T(Style)/K[111]/Pg 427 0 R>> endobj 147 0 obj -<</Type/StructElem/S/H1/P 234 0 R/T(Testing: the old program is the oracle)/K[12]/Pg 264 0 R>> +<</Type/StructElem/S/Code/P 149 0 R/K[113]/Pg 427 0 R>> endobj 148 0 obj -<</Type/StructElem/S/Code/P 156 0 R/K[14]/Pg 264 0 R>> +<</Type/StructElem/S/Code/P 149 0 R/K[116 117]/Pg 427 0 R>> endobj 149 0 obj -<</Type/StructElem/S/Code/P 156 0 R/K[16]/Pg 264 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[112 147 0 R 114 115 148 0 R 118]/Pg 427 0 R>> endobj 150 0 obj -<</Type/StructElem/S/Strong/P 156 0 R/K[19]/Pg 264 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[119 120 121 122]/Pg 427 0 R>> endobj 151 0 obj -<</Type/StructElem/S/Code/P 156 0 R/K[23]/Pg 264 0 R>> +<</Type/StructElem/S/Strong/P 152 0 R/K[123]/Pg 427 0 R>> endobj 152 0 obj -<</Type/StructElem/S/Code/P 156 0 R/K[26]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 158 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[151 0 R]>> endobj 153 0 obj -<</Type/StructElem/S/Code/P 156 0 R/K[30]/Pg 264 0 R>> +<</Type/StructElem/S/Strong/P 154 0 R/K[124]/Pg 427 0 R>> endobj 154 0 obj -<</Type/StructElem/S/Code/P 156 0 R/K[32]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 158 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[153 0 R]>> endobj 155 0 obj -<</Type/StructElem/S/Code/P 156 0 R/K[34]/Pg 264 0 R>> +<</Type/StructElem/S/Strong/P 156 0 R/K[125]/Pg 427 0 R>> endobj 156 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[13 148 0 R 15 149 0 R 17 18 150 0 R 20 21 22 151 0 R 24 25 152 0 R 27 28 29 153 0 R 31 154 0 R 33 155 0 R 35]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 158 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[155 0 R]>> endobj 157 0 obj -<</Type/StructElem/S/Code/P 158 0 R/K[37]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 158 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[]>> endobj 158 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[36 157 0 R 38 39 40 41 42]/Pg 264 0 R>> +<</Type/StructElem/S/TR/P 202 0 R/K[152 0 R 154 0 R 156 0 R 157 0 R]>> endobj 159 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[43 44]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 163 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[126 127 128]/Pg 427 0 R>> endobj 160 0 obj -<</Type/StructElem/S/H1/P 234 0 R/T(Build)/K[45]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 163 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[129]/Pg 427 0 R>> endobj 161 0 obj -<</Type/StructElem/S/Code/P 168 0 R/K[46]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 163 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[130]/Pg 427 0 R>> endobj 162 0 obj -<</Type/StructElem/S/Code/P 168 0 R/K[48]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 163 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[131 132 133 134 135 136 137 138 139 140]/Pg 427 0 R>> endobj 163 0 obj -<</Type/StructElem/S/Code/P 168 0 R/K[50]/Pg 264 0 R>> +<</Type/StructElem/S/TR/P 202 0 R/K[159 0 R 160 0 R 161 0 R 162 0 R]>> endobj 164 0 obj -<</Type/StructElem/S/Code/P 168 0 R/K[52]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 168 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[141]/Pg 427 0 R>> endobj 165 0 obj -<</Type/StructElem/S/Code/P 168 0 R/K[56]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 168 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[142]/Pg 427 0 R>> endobj 166 0 obj -<</Type/StructElem/S/Code/P 168 0 R/K[58]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 168 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[143]/Pg 427 0 R>> endobj 167 0 obj -<</Type/StructElem/S/Code/P 168 0 R/K[60]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 168 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[144 145 146 147]/Pg 427 0 R>> endobj 168 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[161 0 R 47 162 0 R 49 163 0 R 51 164 0 R 53 54 55 165 0 R 57 166 0 R 59 167 0 R 61 62 63]/Pg 264 0 R>> +<</Type/StructElem/S/TR/P 202 0 R/K[164 0 R 165 0 R 166 0 R 167 0 R]>> endobj 169 0 obj -<</Type/StructElem/S/H1/P 234 0 R/T(What is deliberately absent)/K[64]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 174 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[148]/Pg 427 0 R>> endobj 170 0 obj -<</Type/StructElem/S/Strong/P 173 0 R/K[66]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 174 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[149]/Pg 427 0 R>> endobj 171 0 obj -<</Type/StructElem/S/Code/P 173 0 R/K[71]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 174 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[150]/Pg 427 0 R>> endobj 172 0 obj -<</Type/StructElem/S/Code/P 173 0 R/K[73]/Pg 264 0 R>> +<</Type/StructElem/S/Code/P 173 0 R/K[152 153]/Pg 427 0 R>> endobj 173 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[65 170 0 R 67 68 69 70 171 0 R 72 172 0 R 74]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 174 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[151 172 0 R]/Pg 427 0 R>> endobj 174 0 obj -<</Type/StructElem/S/H1/P 234 0 R/T(Appendix A: feature parity checklist)/K[75]/Pg 264 0 R>> +<</Type/StructElem/S/TR/P 202 0 R/K[169 0 R 170 0 R 171 0 R 173 0 R]>> endobj 175 0 obj -<</Type/StructElem/S/Code/P 176 0 R/K[77 78]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 180 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[154]/Pg 427 0 R>> endobj 176 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[76 175 0 R 79 80]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 180 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[155]/Pg 427 0 R>> endobj 177 0 obj -<</Type/StructElem/S/Strong/P 182 0 R/K[81]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 180 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[156]/Pg 427 0 R>> endobj 178 0 obj -<</Type/StructElem/S/Code/P 182 0 R/K[88]/Pg 264 0 R>> +<</Type/StructElem/S/Code/P 179 0 R/K[157]/Pg 427 0 R>> endobj 179 0 obj -<</Type/StructElem/S/Code/P 182 0 R/K[92]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 180 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[178 0 R 158 159]/Pg 427 0 R>> endobj 180 0 obj -<</Type/StructElem/S/Code/P 182 0 R/K[94]/Pg 264 0 R>> +<</Type/StructElem/S/TR/P 202 0 R/K[175 0 R 176 0 R 177 0 R 179 0 R]>> endobj 181 0 obj -<</Type/StructElem/S/Code/P 182 0 R/K[2]/Pg 265 0 R>> +<</Type/StructElem/S/TD/P 185 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[160]/Pg 427 0 R>> endobj 182 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[177 0 R 82 83 84 85 86 87 178 0 R 89 90 91 179 0 R 93 180 0 R 95 96<</Type/MCR/MCID 0/Pg 265 0 R>><</Type/MCR/MCID 1/Pg 265 0 R>>181 0 R<</Type/MCR/MCID 3/Pg 265 0 R>>]/Pg 264 0 R>> +<</Type/StructElem/S/TD/P 185 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[161]/Pg 427 0 R>> endobj 183 0 obj -<</Type/StructElem/S/Strong/P 190 0 R/K[4]/Pg 265 0 R>> +<</Type/StructElem/S/TD/P 185 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[162]/Pg 427 0 R>> endobj 184 0 obj -<</Type/StructElem/S/Code/P 190 0 R/K[8]/Pg 265 0 R>> +<</Type/StructElem/S/TD/P 185 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[163 164 165 166 167 168 169 170]/Pg 427 0 R>> endobj 185 0 obj -<</Type/StructElem/S/Code/P 190 0 R/K[11]/Pg 265 0 R>> +<</Type/StructElem/S/TR/P 202 0 R/K[181 0 R 182 0 R 183 0 R 184 0 R]>> endobj 186 0 obj -<</Type/StructElem/S/Code/P 190 0 R/K[13]/Pg 265 0 R>> +<</Type/StructElem/S/TD/P 190 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[171]/Pg 427 0 R>> endobj 187 0 obj -<</Type/StructElem/S/Code/P 190 0 R/K[18]/Pg 265 0 R>> +<</Type/StructElem/S/TD/P 190 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[172]/Pg 427 0 R>> endobj 188 0 obj -<</Type/StructElem/S/Code/P 190 0 R/K[22]/Pg 265 0 R>> +<</Type/StructElem/S/TD/P 190 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[173]/Pg 427 0 R>> endobj 189 0 obj -<</Type/StructElem/S/Code/P 190 0 R/K[24]/Pg 265 0 R>> +<</Type/StructElem/S/TD/P 190 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[174 175 176 177 178 179 180 181 182]/Pg 427 0 R>> endobj 190 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[183 0 R 5 6 7 184 0 R 9 10 185 0 R 12 186 0 R 14 15 16 17 187 0 R 19 20 21 188 0 R 23 189 0 R 25 26 27 28]/Pg 265 0 R>> +<</Type/StructElem/S/TR/P 202 0 R/K[186 0 R 187 0 R 188 0 R 189 0 R]>> endobj 191 0 obj -<</Type/StructElem/S/Strong/P 206 0 R/K[29]/Pg 265 0 R>> +<</Type/StructElem/S/Strong/P 195 0 R/K[0]/Pg 428 0 R>> endobj 192 0 obj -<</Type/StructElem/S/Code/P 206 0 R/K[31]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 195 0 R/K[2]/Pg 428 0 R>> endobj 193 0 obj -<</Type/StructElem/S/Code/P 206 0 R/K[33]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 195 0 R/K[4]/Pg 428 0 R>> endobj 194 0 obj -<</Type/StructElem/S/Code/P 206 0 R/K[35]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 195 0 R/K[6]/Pg 428 0 R>> endobj 195 0 obj -<</Type/StructElem/S/Code/P 206 0 R/K[38]/Pg 265 0 R>> +<</Type/StructElem/S/TD/P 201 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[191 0 R 1 192 0 R 3 193 0 R 5 194 0 R]/Pg 428 0 R>> endobj 196 0 obj -<</Type/StructElem/S/Code/P 206 0 R/K[40]/Pg 265 0 R>> +<</Type/StructElem/S/Strong/P 197 0 R/K[7]/Pg 428 0 R>> endobj 197 0 obj -<</Type/StructElem/S/Code/P 206 0 R/K[42]/Pg 265 0 R>> +<</Type/StructElem/S/TD/P 201 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[196 0 R]>> endobj 198 0 obj -<</Type/StructElem/S/Code/P 206 0 R/K[44]/Pg 265 0 R>> +<</Type/StructElem/S/Strong/P 199 0 R/K[8]/Pg 428 0 R>> endobj 199 0 obj -<</Type/StructElem/S/Code/P 206 0 R/K[48]/Pg 265 0 R>> +<</Type/StructElem/S/TD/P 201 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[198 0 R]>> endobj 200 0 obj -<</Type/StructElem/S/Code/P 206 0 R/K[51]/Pg 265 0 R>> +<</Type/StructElem/S/TD/P 201 0 R/A[<</O/Table/Headers[]>><</O/Layout/BorderStyle/Solid>>]/K[9 10 11 12]/Pg 428 0 R>> endobj 201 0 obj -<</Type/StructElem/S/Code/P 206 0 R/K[54]/Pg 265 0 R>> +<</Type/StructElem/S/TR/P 202 0 R/K[195 0 R 197 0 R 199 0 R 200 0 R]>> endobj 202 0 obj -<</Type/StructElem/S/Code/P 206 0 R/K[56 57]/Pg 265 0 R>> +<</Type/StructElem/S/Table/P 395 0 R/A[<</O/Layout/BorderColor[0 0 0]/BorderThickness 0.4>>]/K[158 0 R 163 0 R 168 0 R 174 0 R 180 0 R 185 0 R 190 0 R 201 0 R]>> endobj 203 0 obj -<</Type/StructElem/S/Code/P 206 0 R/K[59]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 207 0 R/K[16]/Pg 428 0 R>> endobj 204 0 obj -<</Type/StructElem/S/Code/P 206 0 R/K[61]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 207 0 R/K[20]/Pg 428 0 R>> endobj 205 0 obj -<</Type/StructElem/S/Code/P 206 0 R/K[64]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 207 0 R/K[22]/Pg 428 0 R>> endobj 206 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[191 0 R 30 192 0 R 32 193 0 R 34 194 0 R 36 37 195 0 R 39 196 0 R 41 197 0 R 43 198 0 R 45 46 47 199 0 R 49 50 200 0 R 52 53 201 0 R 55 202 0 R 58 203 0 R 60 204 0 R 62 63 205 0 R 65]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 207 0 R/K[24]/Pg 428 0 R>> endobj 207 0 obj -<</Type/StructElem/S/Strong/P 213 0 R/K[66]/Pg 265 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[13 14 15 203 0 R 17 18 19 204 0 R 21 205 0 R 23 206 0 R 25 26]/Pg 428 0 R>> endobj 208 0 obj -<</Type/StructElem/S/Code/P 213 0 R/K[68 69]/Pg 265 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[27 28 29]/Pg 428 0 R>> endobj 209 0 obj -<</Type/StructElem/S/Code/P 213 0 R/K[71]/Pg 265 0 R>> +<</Type/StructElem/S/H1/P 395 0 R/T(Testing: the old program is the oracle)/K[30]/Pg 428 0 R>> endobj 210 0 obj -<</Type/StructElem/S/Code/P 213 0 R/K[73]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 218 0 R/K[32]/Pg 428 0 R>> endobj 211 0 obj -<</Type/StructElem/S/Code/P 213 0 R/K[76]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 218 0 R/K[34]/Pg 428 0 R>> endobj 212 0 obj -<</Type/StructElem/S/Code/P 213 0 R/K[78]/Pg 265 0 R>> +<</Type/StructElem/S/Strong/P 218 0 R/K[37]/Pg 428 0 R>> endobj 213 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[207 0 R 67 208 0 R 70 209 0 R 72 210 0 R 74 75 211 0 R 77 212 0 R 79 80]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 218 0 R/K[41]/Pg 428 0 R>> endobj 214 0 obj -<</Type/StructElem/S/Strong/P 216 0 R/K[81]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 218 0 R/K[44]/Pg 428 0 R>> endobj 215 0 obj -<</Type/StructElem/S/Code/P 216 0 R/K[84]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 218 0 R/K[48]/Pg 428 0 R>> endobj 216 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[214 0 R 82 83 215 0 R 85 86 87 88 89]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 218 0 R/K[50 51]/Pg 428 0 R>> endobj 217 0 obj -<</Type/StructElem/S/Strong/P 227 0 R/K[90]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 218 0 R/K[53]/Pg 428 0 R>> endobj 218 0 obj -<</Type/StructElem/S/Code/P 227 0 R/K[92]/Pg 265 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[31 210 0 R 33 211 0 R 35 36 212 0 R 38 39 40 213 0 R 42 43 214 0 R 45 46 47 215 0 R 49 216 0 R 52 217 0 R 54]/Pg 428 0 R>> endobj 219 0 obj -<</Type/StructElem/S/Code/P 227 0 R/K[96]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 220 0 R/K[56]/Pg 428 0 R>> endobj 220 0 obj -<</Type/StructElem/S/Code/P 227 0 R/K[99]/Pg 265 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[55 219 0 R 57 58 59 60 61]/Pg 428 0 R>> endobj 221 0 obj -<</Type/StructElem/S/Code/P 227 0 R/K[101]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 227 0 R/K[63]/Pg 428 0 R>> endobj 222 0 obj -<</Type/StructElem/S/Code/P 227 0 R/K[103]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 227 0 R/K[65]/Pg 428 0 R>> endobj 223 0 obj -<</Type/StructElem/S/Code/P 227 0 R/K[108]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 227 0 R/K[68]/Pg 428 0 R>> endobj 224 0 obj -<</Type/StructElem/S/Code/P 227 0 R/K[110 111]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 227 0 R/K[70]/Pg 428 0 R>> endobj 225 0 obj -<</Type/StructElem/S/Code/P 227 0 R/K[113]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 227 0 R/K[72]/Pg 428 0 R>> endobj 226 0 obj -<</Type/StructElem/S/Code/P 227 0 R/K[115]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 227 0 R/K[75]/Pg 428 0 R>> endobj 227 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[217 0 R 91 218 0 R 93 94 95 219 0 R 97 98 220 0 R 100 221 0 R 102 222 0 R 104 105 106 107 223 0 R 109 224 0 R 112 225 0 R 114 226 0 R 116 117 118 119]/Pg 265 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[62 221 0 R 64 222 0 R 66 67 223 0 R 69 224 0 R 71 225 0 R 73 74 226 0 R 76 77 78 79]/Pg 428 0 R>> endobj 228 0 obj -<</Type/StructElem/S/Strong/P 233 0 R/K[120]/Pg 265 0 R>> +<</Type/StructElem/S/H1/P 395 0 R/T(Build)/K[80]/Pg 428 0 R>> endobj 229 0 obj -<</Type/StructElem/S/Code/P 233 0 R/K[126]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 250 0 R/K[82]/Pg 428 0 R>> endobj 230 0 obj -<</Type/StructElem/S/Code/P 233 0 R/K[1]/Pg 266 0 R>> +<</Type/StructElem/S/Code/P 250 0 R/K[84]/Pg 428 0 R>> endobj 231 0 obj -<</Type/StructElem/S/Code/P 233 0 R/K[11]/Pg 266 0 R>> +<</Type/StructElem/S/Code/P 250 0 R/K[86]/Pg 428 0 R>> endobj 232 0 obj -<</Type/StructElem/S/Strong/P 233 0 R/K[14]/Pg 266 0 R>> +<</Type/StructElem/S/Code/P 250 0 R/K[88]/Pg 428 0 R>> endobj 233 0 obj -<</Type/StructElem/S/P/P 234 0 R/K[228 0 R 121 122 123 124 125 229 0 R 127<</Type/MCR/MCID 0/Pg 266 0 R>>230 0 R<</Type/MCR/MCID 2/Pg 266 0 R>><</Type/MCR/MCID 3/Pg 266 0 R>><</Type/MCR/MCID 4/Pg 266 0 R>><</Type/MCR/MCID 5/Pg 266 0 R>><</Type/MCR/MCID 6/Pg 266 0 R>><</Type/MCR/MCID 7/Pg 266 0 R>><</Type/MCR/MCID 8/Pg 266 0 R>><</Type/MCR/MCID 9/Pg 266 0 R>><</Type/MCR/MCID 10/Pg 266 0 R>>231 0 R<</Type/MCR/MCID 12/Pg 266 0 R>><</Type/MCR/MCID 13/Pg 266 0 R>>232 0 R<</Type/MCR/MCID 15/Pg 266 0 R>><</Type/MCR/MCID 16/Pg 266 0 R>>]/Pg 265 0 R>> +<</Type/StructElem/S/Code/P 250 0 R/K[90]/Pg 428 0 R>> endobj 234 0 obj -<</Type/StructElem/S/Document/P 11 0 R/K[18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 25 0 R 36 0 R 40 0 R 41 0 R 50 0 R 53 0 R 68 0 R 70 0 R 75 0 R 80 0 R 81 0 R 82 0 R 106 0 R 109 0 R 110 0 R 113 0 R 146 0 R 147 0 R 156 0 R 158 0 R 159 0 R 160 0 R 168 0 R 169 0 R 173 0 R 174 0 R 176 0 R 182 0 R 190 0 R 206 0 R 213 0 R 216 0 R 227 0 R 233 0 R]>> +<</Type/StructElem/S/Code/P 250 0 R/K[92]/Pg 428 0 R>> endobj 235 0 obj -[/ICCBased 284 0 R] +<</Type/StructElem/S/Code/P 250 0 R/K[94]/Pg 428 0 R>> endobj 236 0 obj -[/ICCBased 285 0 R] +<</Type/StructElem/S/Code/P 250 0 R/K[96 97]/Pg 428 0 R>> endobj 237 0 obj -[262 0 R/XYZ 62.362206 729.37256 0] +<</Type/StructElem/S/Code/P 250 0 R/K[99]/Pg 428 0 R>> endobj 238 0 obj -[262 0 R/XYZ 62.362206 576.02637 0] +<</Type/StructElem/S/Code/P 250 0 R/K[102]/Pg 428 0 R>> endobj 239 0 obj -[263 0 R/XYZ 62.362206 659.4719 0] +<</Type/StructElem/S/Code/P 250 0 R/K[104]/Pg 428 0 R>> endobj 240 0 obj -[263 0 R/XYZ 62.362206 268.60852 0] +<</Type/StructElem/S/Code/P 250 0 R/K[106]/Pg 428 0 R>> endobj 241 0 obj -[264 0 R/XYZ 62.362206 675.4436 0] +<</Type/StructElem/S/Code/P 250 0 R/K[108]/Pg 428 0 R>> endobj 242 0 obj -[264 0 R/XYZ 62.362206 432.31186 0] +<</Type/StructElem/S/Code/P 250 0 R/K[112]/Pg 428 0 R>> endobj 243 0 obj -[264 0 R/XYZ 62.362206 312.73364 0] +<</Type/StructElem/S/Code/P 250 0 R/K[115]/Pg 428 0 R>> endobj 244 0 obj -[264 0 R/XYZ 62.362206 221.11694 0] +<</Type/StructElem/S/Code/P 250 0 R/K[117]/Pg 428 0 R>> endobj 245 0 obj -<</ProcSet[/PDF/Text/ImageC/ImageB]/ColorSpace<</c0 235 0 R>>/Font<</f0 250 0 R/f1 253 0 R/f2 256 0 R>>>> +<</Type/StructElem/S/Code/P 250 0 R/K[119]/Pg 428 0 R>> endobj 246 0 obj -<</ProcSet[/PDF/Text/ImageC/ImageB]/ColorSpace<</c0 235 0 R/c1 236 0 R>>/Font<</f0 253 0 R/f1 256 0 R/f2 250 0 R>>>> +<</Type/StructElem/S/Code/P 250 0 R/K[121]/Pg 428 0 R>> endobj 247 0 obj -<</ProcSet[/PDF/Text/ImageC/ImageB]/ColorSpace<</c0 235 0 R>>/Font<</f0 253 0 R/f1 250 0 R/f2 256 0 R/f3 259 0 R>>>> +<</Type/StructElem/S/Code/P 250 0 R/K[123]/Pg 428 0 R>> endobj 248 0 obj -<</ProcSet[/PDF/Text/ImageC/ImageB]/ColorSpace<</c0 235 0 R>>/Font<</f0 253 0 R/f1 256 0 R/f2 250 0 R>>>> +<</Type/StructElem/S/Code/P 250 0 R/K[126]/Pg 428 0 R>> endobj 249 0 obj -<</ProcSet[/PDF/Text/ImageC/ImageB]/ColorSpace<</c0 235 0 R>>/Font<</f0 253 0 R/f1 256 0 R/f2 250 0 R>>>> +<</Type/StructElem/S/Code/P 250 0 R/K[1]/Pg 429 0 R>> endobj 250 0 obj -<</Type/Font/Subtype/Type0/BaseFont/ISLOEJ+NewCM10-Bold-Identity-H/Encoding/Identity-H/DescendantFonts[251 0 R]/ToUnicode 268 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[81 229 0 R 83 230 0 R 85 231 0 R 87 232 0 R 89 233 0 R 91 234 0 R 93 235 0 R 95 236 0 R 98 237 0 R 100 101 238 0 R 103 239 0 R 105 240 0 R 107 241 0 R 109 110 111 242 0 R 113 114 243 0 R 116 244 0 R 118 245 0 R 120 246 0 R 122 247 0 R 124 125 248 0 R 127<</Type/MCR/MCID 0/Pg 429 0 R>>249 0 R<</Type/MCR/MCID 2/Pg 429 0 R>><</Type/MCR/MCID 3/Pg 429 0 R>>]/Pg 428 0 R>> endobj 251 0 obj -<</Type/Font/Subtype/CIDFontType0/BaseFont/ISLOEJ+NewCM10-Bold/CIDSystemInfo<</Registry(Adobe)/Ordering(Identity)/Supplement 0>>/FontDescriptor 252 0 R/DW 0/W[0 0 280 1 1 786 2 2 559 3 3 474 4 4 639 5 5 527 6 6 454 7 7 319 8 8 383 9 9 869 10 10 800 11 11 607 12 12 447 13 13 756 14 14 639 15 15 607 16 16 319 17 17 575 18 18 958 19 19 1189 20 21 639 22 22 319 23 23 639 24 24 607 25 25 510.99997 26 26 831 27 28 639 29 29 351 30 30 671 31 31 607 32 32 882 33 33 575 34 34 319 35 37 575 38 38 818 39 39 692 40 40 319 41 41 1092 42 42 831 43 44 447]>> +<</Type/StructElem/S/H1/P 395 0 R/T(What is deliberately absent)/K[4]/Pg 429 0 R>> endobj 252 0 obj -<</Type/FontDescriptor/FontName/ISLOEJ+NewCM10-Bold/Flags 131076/FontBBox[21 -249 1164 750]/ItalicAngle 0/Ascent 806/Descent -194/CapHeight 686/StemV 168.6/CIDSet 267 0 R/FontFile3 269 0 R>> +<</Type/StructElem/S/Strong/P 260 0 R/K[6]/Pg 429 0 R>> endobj 253 0 obj -<</Type/Font/Subtype/Type0/BaseFont/NSBQKY+NewCM10-Regular-Identity-H/Encoding/Identity-H/DescendantFonts[254 0 R]/ToUnicode 271 0 R>> +<</Type/StructElem/S/Code/P 260 0 R/K[10]/Pg 429 0 R>> endobj 254 0 obj -<</Type/Font/Subtype/CIDFontType0/BaseFont/NSBQKY+NewCM10-Regular/CIDSystemInfo<</Registry(Adobe)/Ordering(Identity)/Supplement 0>>/FontDescriptor 255 0 R/DW 0/W[0 0 500 1 1 556 2 2 444 3 3 394 4 4 278 5 5 500 6 6 556 7 7 333 8 8 306 9 9 500 10 10 392 11 11 389 12 12 556 13 13 722 14 14 1000 15 17 500 18 18 333 19 20 500 21 21 681 22 22 500 23 24 528 25 25 833 26 26 444 27 28 278 29 30 556 31 31 278 32 32 556 33 33 528 34 34 278 35 35 556 36 36 278 37 37 722 38 38 686 39 39 528 40 40 681 41 41 528 42 42 361 43 44 389 45 45 556 46 46 764 47 47 625 48 48 500 49 49 514 50 50 750 51 51 917 52 52 500 53 53 722 54 54 444 55 56 750 57 57 778 58 58 278 59 59 583 60 60 500 61 61 750 62 62 778 63 63 750 64 64 306 65 65 736 66 66 785 67 67 708 68 68 556 69 69 500 70 70 611 71 71 778 72 73 500 74 74 778 75 75 750 76 76 653 77 77 1000 78 78 1028 79 79 750]>> +<</Type/StructElem/S/Code/P 260 0 R/K[13]/Pg 429 0 R>> endobj 255 0 obj -<</Type/FontDescriptor/FontName/NSBQKY+NewCM10-Regular/Flags 131076/FontBBox[-41 -260 1009 760]/ItalicAngle 0/Ascent 806/Descent -194/CapHeight 683/StemV 95.4/CIDSet 270 0 R/FontFile3 272 0 R>> +<</Type/StructElem/S/Code/P 260 0 R/K[15]/Pg 429 0 R>> endobj 256 0 obj -<</Type/Font/Subtype/Type0/BaseFont/OYWFYY+DejaVuSansMono/Encoding/Identity-H/DescendantFonts[257 0 R]/ToUnicode 274 0 R>> +<</Type/StructElem/S/Code/P 260 0 R/K[18]/Pg 429 0 R>> endobj 257 0 obj -<</Type/Font/Subtype/CIDFontType2/BaseFont/OYWFYY+DejaVuSansMono/CIDSystemInfo<</Registry(Adobe)/Ordering(Identity)/Supplement 0>>/FontDescriptor 258 0 R/DW 0/CIDToGIDMap/Identity/W[0 80 602.0508]>> +<</Type/StructElem/S/Code/P 260 0 R/K[20]/Pg 429 0 R>> endobj 258 0 obj -<</Type/FontDescriptor/FontName/OYWFYY+DejaVuSansMono/Flags 131077/FontBBox[0 -235.83984 602.0508 844.2383]/ItalicAngle 0/Ascent 759.7656/Descent -240.23438/CapHeight 759.7656/StemV 95.4/CIDSet 273 0 R/FontFile2 275 0 R>> +<</Type/StructElem/S/Code/P 260 0 R/K[23]/Pg 429 0 R>> endobj 259 0 obj -<</Type/Font/Subtype/Type0/BaseFont/HCGNIB+LibertinusSerif-Regular-Identity-H/Encoding/Identity-H/DescendantFonts[260 0 R]/ToUnicode 277 0 R>> +<</Type/StructElem/S/Code/P 260 0 R/K[26]/Pg 429 0 R>> endobj 260 0 obj -<</Type/Font/Subtype/CIDFontType0/BaseFont/HCGNIB+LibertinusSerif-Regular/CIDSystemInfo<</Registry(Adobe)/Ordering(Identity)/Supplement 0>>/FontDescriptor 261 0 R/DW 0/W[0 0 500 1 1 527]>> +<</Type/StructElem/S/P/P 395 0 R/K[5 252 0 R 7 8 9 253 0 R 11 12 254 0 R 14 255 0 R 16 17 256 0 R 19 257 0 R 21 22 258 0 R 24 25 259 0 R 27 28]/Pg 429 0 R>> endobj 261 0 obj -<</Type/FontDescriptor/FontName/HCGNIB+LibertinusSerif-Regular/Flags 131078/FontBBox[0 0 500 698]/ItalicAngle 0/Ascent 894/Descent -246/CapHeight 658/StemV 95.4/CIDSet 276 0 R/FontFile3 278 0 R>> +<</Type/StructElem/S/Code/P 263 0 R/K[30]/Pg 429 0 R>> endobj 262 0 obj -<</Type/Page/Resources 245 0 R/MediaBox[0 0 595.2756 841.8898]/StructParents 0/Parent 1 0 R/Contents 279 0 R>> +<</Type/StructElem/S/Code/P 263 0 R/K[34]/Pg 429 0 R>> endobj 263 0 obj -<</Type/Page/Resources 246 0 R/MediaBox[0 0 595.2756 841.8898]/StructParents 1/Parent 1 0 R/Contents 280 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[29 261 0 R 31 32 33 262 0 R 35 36]/Pg 429 0 R>> endobj 264 0 obj -<</Type/Page/Resources 247 0 R/MediaBox[0 0 595.2756 841.8898]/StructParents 2/Parent 1 0 R/Contents 281 0 R>> +<</Type/StructElem/S/H1/P 395 0 R/T(Appendix A: feature parity checklist)/K[37]/Pg 429 0 R>> endobj 265 0 obj -<</Type/Page/Resources 248 0 R/MediaBox[0 0 595.2756 841.8898]/StructParents 3/Parent 1 0 R/Contents 282 0 R>> +<</Type/StructElem/S/Code/P 266 0 R/K[39]/Pg 429 0 R>> endobj 266 0 obj -<</Type/Page/Resources 249 0 R/MediaBox[0 0 595.2756 841.8898]/StructParents 4/Parent 1 0 R/Contents 283 0 R>> +<</Type/StructElem/S/P/P 395 0 R/K[38 265 0 R 40 41 42 43]/Pg 429 0 R>> endobj 267 0 obj -<</Length 14/Filter/FlateDecode>> +<</Type/StructElem/S/Strong/P 272 0 R/K[44]/Pg 429 0 R>> +endobj +268 0 obj +<</Type/StructElem/S/Code/P 272 0 R/K[49]/Pg 429 0 R>> +endobj +269 0 obj +<</Type/StructElem/S/Code/P 272 0 R/K[53]/Pg 429 0 R>> +endobj +270 0 obj +<</Type/StructElem/S/Code/P 272 0 R/K[55]/Pg 429 0 R>> +endobj +271 0 obj +<</Type/StructElem/S/Code/P 272 0 R/K[60]/Pg 429 0 R>> +endobj +272 0 obj +<</Type/StructElem/S/P/P 395 0 R/K[267 0 R 45 46 47 48 268 0 R 50 51 52 269 0 R 54 270 0 R 56 57 58 59 271 0 R 61]/Pg 429 0 R>> +endobj +273 0 obj +<</Type/StructElem/S/Strong/P 285 0 R/K[62]/Pg 429 0 R>> +endobj +274 0 obj +<</Type/StructElem/S/Code/P 285 0 R/K[66]/Pg 429 0 R>> +endobj +275 0 obj +<</Type/StructElem/S/Code/P 285 0 R/K[69]/Pg 429 0 R>> +endobj +276 0 obj +<</Type/StructElem/S/Code/P 285 0 R/K[71]/Pg 429 0 R>> +endobj +277 0 obj +<</Type/StructElem/S/Code/P 285 0 R/K[76]/Pg 429 0 R>> +endobj +278 0 obj +<</Type/StructElem/S/Code/P 285 0 R/K[80]/Pg 429 0 R>> +endobj +279 0 obj +<</Type/StructElem/S/Code/P 285 0 R/K[82]/Pg 429 0 R>> +endobj +280 0 obj +<</Type/StructElem/S/Code/P 285 0 R/K[86]/Pg 429 0 R>> +endobj +281 0 obj +<</Type/StructElem/S/Code/P 285 0 R/K[]>> +endobj +282 0 obj +<</Type/StructElem/S/Code/P 285 0 R/K[90]/Pg 429 0 R>> +endobj +283 0 obj +<</Type/StructElem/S/Code/P 285 0 R/K[]>> +endobj +284 0 obj +<</Type/StructElem/S/Code/P 285 0 R/K[94]/Pg 429 0 R>> +endobj +285 0 obj +<</Type/StructElem/S/P/P 395 0 R/K[273 0 R 63 64 65 274 0 R 67 68 275 0 R 70 276 0 R 72 73 74 75 277 0 R 77 78 79 278 0 R 81 279 0 R 83 84 85 280 0 R 87 88 281 0 R 89 282 0 R 91 283 0 R 92 93 284 0 R 95 96 97]/Pg 429 0 R>> +endobj +286 0 obj +<</Type/StructElem/S/Strong/P 346 0 R/K[98]/Pg 429 0 R>> +endobj +287 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[100]/Pg 429 0 R>> +endobj +288 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[102]/Pg 429 0 R>> +endobj +289 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[104]/Pg 429 0 R>> +endobj +290 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[106 107]/Pg 429 0 R>> +endobj +291 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[109]/Pg 429 0 R>> +endobj +292 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[111]/Pg 429 0 R>> +endobj +293 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[113]/Pg 429 0 R>> +endobj +294 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[115]/Pg 429 0 R>> +endobj +295 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[118]/Pg 429 0 R>> +endobj +296 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[120]/Pg 429 0 R>> +endobj +297 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[122]/Pg 429 0 R>> +endobj +298 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[124]/Pg 429 0 R>> +endobj +299 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[126]/Pg 429 0 R>> +endobj +300 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[128]/Pg 429 0 R>> +endobj +301 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[130]/Pg 429 0 R>> +endobj +302 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[132]/Pg 429 0 R>> +endobj +303 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[134]/Pg 429 0 R>> +endobj +304 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[137]/Pg 429 0 R>> +endobj +305 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[139]/Pg 429 0 R>> +endobj +306 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[141]/Pg 429 0 R>> +endobj +307 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[143]/Pg 429 0 R>> +endobj +308 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[145]/Pg 429 0 R>> +endobj +309 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[1]/Pg 430 0 R>> +endobj +310 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[3]/Pg 430 0 R>> +endobj +311 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[5]/Pg 430 0 R>> +endobj +312 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[7]/Pg 430 0 R>> +endobj +313 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[9]/Pg 430 0 R>> +endobj +314 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[11]/Pg 430 0 R>> +endobj +315 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[13]/Pg 430 0 R>> +endobj +316 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[15]/Pg 430 0 R>> +endobj +317 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[17]/Pg 430 0 R>> +endobj +318 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[19]/Pg 430 0 R>> +endobj +319 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[]>> +endobj +320 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[22]/Pg 430 0 R>> +endobj +321 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[23]/Pg 430 0 R>> +endobj +322 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[24]/Pg 430 0 R>> +endobj +323 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[]>> +endobj +324 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[27]/Pg 430 0 R>> +endobj +325 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[29]/Pg 430 0 R>> +endobj +326 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[31]/Pg 430 0 R>> +endobj +327 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[33]/Pg 430 0 R>> +endobj +328 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[35 36]/Pg 430 0 R>> +endobj +329 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[38]/Pg 430 0 R>> +endobj +330 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[40]/Pg 430 0 R>> +endobj +331 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[42]/Pg 430 0 R>> +endobj +332 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[44]/Pg 430 0 R>> +endobj +333 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[46]/Pg 430 0 R>> +endobj +334 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[48]/Pg 430 0 R>> +endobj +335 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[50]/Pg 430 0 R>> +endobj +336 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[52]/Pg 430 0 R>> +endobj +337 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[57]/Pg 430 0 R>> +endobj +338 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[59]/Pg 430 0 R>> +endobj +339 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[63]/Pg 430 0 R>> +endobj +340 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[66]/Pg 430 0 R>> +endobj +341 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[68]/Pg 430 0 R>> +endobj +342 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[71]/Pg 430 0 R>> +endobj +343 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[73]/Pg 430 0 R>> +endobj +344 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[75]/Pg 430 0 R>> +endobj +345 0 obj +<</Type/StructElem/S/Code/P 346 0 R/K[78]/Pg 430 0 R>> +endobj +346 0 obj +<</Type/StructElem/S/P/P 395 0 R/K[286 0 R 99 287 0 R 101 288 0 R 103 289 0 R 105 290 0 R 108 291 0 R 110 292 0 R 112 293 0 R 114 294 0 R 116 117 295 0 R 119 296 0 R 121 297 0 R 123 298 0 R 125 299 0 R 127 300 0 R 129 301 0 R 131 302 0 R 133 303 0 R 135 136 304 0 R 138 305 0 R 140 306 0 R 142 307 0 R 144 308 0 R 146<</Type/MCR/MCID 0/Pg 430 0 R>>309 0 R<</Type/MCR/MCID 2/Pg 430 0 R>>310 0 R<</Type/MCR/MCID 4/Pg 430 0 R>>311 0 R<</Type/MCR/MCID 6/Pg 430 0 R>>312 0 R<</Type/MCR/MCID 8/Pg 430 0 R>>313 0 R<</Type/MCR/MCID 10/Pg 430 0 R>>314 0 R<</Type/MCR/MCID 12/Pg 430 0 R>>315 0 R<</Type/MCR/MCID 14/Pg 430 0 R>>316 0 R<</Type/MCR/MCID 16/Pg 430 0 R>>317 0 R<</Type/MCR/MCID 18/Pg 430 0 R>>318 0 R<</Type/MCR/MCID 20/Pg 430 0 R>>319 0 R<</Type/MCR/MCID 21/Pg 430 0 R>>320 0 R 321 0 R 322 0 R<</Type/MCR/MCID 25/Pg 430 0 R>>323 0 R<</Type/MCR/MCID 26/Pg 430 0 R>>324 0 R<</Type/MCR/MCID 28/Pg 430 0 R>>325 0 R<</Type/MCR/MCID 30/Pg 430 0 R>>326 0 R<</Type/MCR/MCID 32/Pg 430 0 R>>327 0 R<</Type/MCR/MCID 34/Pg 430 0 R>>328 0 R<</Type/MCR/MCID 37/Pg 430 0 R>>329 0 R<</Type/MCR/MCID 39/Pg 430 0 R>>330 0 R<</Type/MCR/MCID 41/Pg 430 0 R>>331 0 R<</Type/MCR/MCID 43/Pg 430 0 R>>332 0 R<</Type/MCR/MCID 45/Pg 430 0 R>>333 0 R<</Type/MCR/MCID 47/Pg 430 0 R>>334 0 R<</Type/MCR/MCID 49/Pg 430 0 R>>335 0 R<</Type/MCR/MCID 51/Pg 430 0 R>>336 0 R<</Type/MCR/MCID 53/Pg 430 0 R>><</Type/MCR/MCID 54/Pg 430 0 R>><</Type/MCR/MCID 55/Pg 430 0 R>><</Type/MCR/MCID 56/Pg 430 0 R>>337 0 R<</Type/MCR/MCID 58/Pg 430 0 R>>338 0 R<</Type/MCR/MCID 60/Pg 430 0 R>><</Type/MCR/MCID 61/Pg 430 0 R>><</Type/MCR/MCID 62/Pg 430 0 R>>339 0 R<</Type/MCR/MCID 64/Pg 430 0 R>><</Type/MCR/MCID 65/Pg 430 0 R>>340 0 R<</Type/MCR/MCID 67/Pg 430 0 R>>341 0 R<</Type/MCR/MCID 69/Pg 430 0 R>><</Type/MCR/MCID 70/Pg 430 0 R>>342 0 R<</Type/MCR/MCID 72/Pg 430 0 R>>343 0 R<</Type/MCR/MCID 74/Pg 430 0 R>>344 0 R<</Type/MCR/MCID 76/Pg 430 0 R>><</Type/MCR/MCID 77/Pg 430 0 R>>345 0 R<</Type/MCR/MCID 79/Pg 430 0 R>>]/Pg 429 0 R>> +endobj +347 0 obj +<</Type/StructElem/S/Strong/P 353 0 R/K[80]/Pg 430 0 R>> +endobj +348 0 obj +<</Type/StructElem/S/Code/P 353 0 R/K[82 83]/Pg 430 0 R>> +endobj +349 0 obj +<</Type/StructElem/S/Code/P 353 0 R/K[85]/Pg 430 0 R>> +endobj +350 0 obj +<</Type/StructElem/S/Code/P 353 0 R/K[87]/Pg 430 0 R>> +endobj +351 0 obj +<</Type/StructElem/S/Code/P 353 0 R/K[90]/Pg 430 0 R>> +endobj +352 0 obj +<</Type/StructElem/S/Code/P 353 0 R/K[92]/Pg 430 0 R>> +endobj +353 0 obj +<</Type/StructElem/S/P/P 395 0 R/K[347 0 R 81 348 0 R 84 349 0 R 86 350 0 R 88 89 351 0 R 91 352 0 R 93 94]/Pg 430 0 R>> +endobj +354 0 obj +<</Type/StructElem/S/Strong/P 358 0 R/K[95]/Pg 430 0 R>> +endobj +355 0 obj +<</Type/StructElem/S/Code/P 358 0 R/K[98]/Pg 430 0 R>> +endobj +356 0 obj +<</Type/StructElem/S/Code/P 358 0 R/K[104]/Pg 430 0 R>> +endobj +357 0 obj +<</Type/StructElem/S/Code/P 358 0 R/K[107]/Pg 430 0 R>> +endobj +358 0 obj +<</Type/StructElem/S/P/P 395 0 R/K[354 0 R 96 97 355 0 R 99 100 101 102 103 356 0 R 105 106 357 0 R 108 109 110]/Pg 430 0 R>> +endobj +359 0 obj +<</Type/StructElem/S/Strong/P 372 0 R/K[111]/Pg 430 0 R>> +endobj +360 0 obj +<</Type/StructElem/S/Code/P 372 0 R/K[114]/Pg 430 0 R>> +endobj +361 0 obj +<</Type/StructElem/S/Code/P 372 0 R/K[117]/Pg 430 0 R>> +endobj +362 0 obj +<</Type/StructElem/S/Code/P 372 0 R/K[119]/Pg 430 0 R>> +endobj +363 0 obj +<</Type/StructElem/S/Code/P 372 0 R/K[121]/Pg 430 0 R>> +endobj +364 0 obj +<</Type/StructElem/S/Code/P 372 0 R/K[123]/Pg 430 0 R>> +endobj +365 0 obj +<</Type/StructElem/S/Code/P 372 0 R/K[125]/Pg 430 0 R>> +endobj +366 0 obj +<</Type/StructElem/S/Code/P 372 0 R/K[127]/Pg 430 0 R>> +endobj +367 0 obj +<</Type/StructElem/S/Code/P 372 0 R/K[129]/Pg 430 0 R>> +endobj +368 0 obj +<</Type/StructElem/S/Code/P 372 0 R/K[131]/Pg 430 0 R>> +endobj +369 0 obj +<</Type/StructElem/S/Code/P 372 0 R/K[133]/Pg 430 0 R>> +endobj +370 0 obj +<</Type/StructElem/S/Code/P 372 0 R/K[135]/Pg 430 0 R>> +endobj +371 0 obj +<</Type/StructElem/S/Code/P 372 0 R/K[138]/Pg 430 0 R>> +endobj +372 0 obj +<</Type/StructElem/S/P/P 395 0 R/K[359 0 R 112 113 360 0 R 115 116 361 0 R 118 362 0 R 120 363 0 R 122 364 0 R 124 365 0 R 126 366 0 R 128 367 0 R 130 368 0 R 132 369 0 R 134 370 0 R 136 137 371 0 R 139 140]/Pg 430 0 R>> +endobj +373 0 obj +<</Type/StructElem/S/Strong/P 388 0 R/K[141]/Pg 430 0 R>> +endobj +374 0 obj +<</Type/StructElem/S/Code/P 388 0 R/K[143]/Pg 430 0 R>> +endobj +375 0 obj +<</Type/StructElem/S/Code/P 388 0 R/K[147]/Pg 430 0 R>> +endobj +376 0 obj +<</Type/StructElem/S/Code/P 388 0 R/K[149]/Pg 430 0 R>> +endobj +377 0 obj +<</Type/StructElem/S/Code/P 388 0 R/K[152]/Pg 430 0 R>> +endobj +378 0 obj +<</Type/StructElem/S/Code/P 388 0 R/K[154]/Pg 430 0 R>> +endobj +379 0 obj +<</Type/StructElem/S/Code/P 388 0 R/K[156]/Pg 430 0 R>> +endobj +380 0 obj +<</Type/StructElem/S/Code/P 388 0 R/K[160]/Pg 430 0 R>> +endobj +381 0 obj +<</Type/StructElem/S/Code/P 388 0 R/K[162]/Pg 430 0 R>> +endobj +382 0 obj +<</Type/StructElem/S/Code/P 388 0 R/K[167]/Pg 430 0 R>> +endobj +383 0 obj +<</Type/StructElem/S/Code/P 388 0 R/K[169]/Pg 430 0 R>> +endobj +384 0 obj +<</Type/StructElem/S/Code/P 388 0 R/K[173]/Pg 430 0 R>> +endobj +385 0 obj +<</Type/StructElem/S/Code/P 388 0 R/K[176]/Pg 430 0 R>> +endobj +386 0 obj +<</Type/StructElem/S/Code/P 388 0 R/K[178]/Pg 430 0 R>> +endobj +387 0 obj +<</Type/StructElem/S/Code/P 388 0 R/K[180]/Pg 430 0 R>> +endobj +388 0 obj +<</Type/StructElem/S/P/P 395 0 R/K[373 0 R 142 374 0 R 144 145 146 375 0 R 148 376 0 R 150 151 377 0 R 153 378 0 R 155 379 0 R 157 158 159 380 0 R 161 381 0 R 163 164 165 166 382 0 R 168 383 0 R 170 171 172 384 0 R 174 175 385 0 R 177 386 0 R 179 387 0 R 181 182 183 184]/Pg 430 0 R>> +endobj +389 0 obj +<</Type/StructElem/S/Strong/P 394 0 R/K[185]/Pg 430 0 R>> +endobj +390 0 obj +<</Type/StructElem/S/Code/P 394 0 R/K[2]/Pg 431 0 R>> +endobj +391 0 obj +<</Type/StructElem/S/Code/P 394 0 R/K[5]/Pg 431 0 R>> +endobj +392 0 obj +<</Type/StructElem/S/Code/P 394 0 R/K[15]/Pg 431 0 R>> +endobj +393 0 obj +<</Type/StructElem/S/Strong/P 394 0 R/K[18]/Pg 431 0 R>> +endobj +394 0 obj +<</Type/StructElem/S/P/P 395 0 R/K[389 0 R 186 187 188<</Type/MCR/MCID 0/Pg 431 0 R>><</Type/MCR/MCID 1/Pg 431 0 R>>390 0 R<</Type/MCR/MCID 3/Pg 431 0 R>><</Type/MCR/MCID 4/Pg 431 0 R>>391 0 R<</Type/MCR/MCID 6/Pg 431 0 R>><</Type/MCR/MCID 7/Pg 431 0 R>><</Type/MCR/MCID 8/Pg 431 0 R>><</Type/MCR/MCID 9/Pg 431 0 R>><</Type/MCR/MCID 10/Pg 431 0 R>><</Type/MCR/MCID 11/Pg 431 0 R>><</Type/MCR/MCID 12/Pg 431 0 R>><</Type/MCR/MCID 13/Pg 431 0 R>><</Type/MCR/MCID 14/Pg 431 0 R>>392 0 R<</Type/MCR/MCID 16/Pg 431 0 R>><</Type/MCR/MCID 17/Pg 431 0 R>>393 0 R<</Type/MCR/MCID 19/Pg 431 0 R>><</Type/MCR/MCID 20/Pg 431 0 R>>]/Pg 430 0 R>> +endobj +395 0 obj +<</Type/StructElem/S/Document/P 11 0 R/K[20 0 R 21 0 R 22 0 R 23 0 R 25 0 R 26 0 R 28 0 R 42 0 R 47 0 R 48 0 R 66 0 R 72 0 R 96 0 R 98 0 R 103 0 R 108 0 R 109 0 R 110 0 R 142 0 R 145 0 R 146 0 R 149 0 R 150 0 R 202 0 R 207 0 R 208 0 R 209 0 R 218 0 R 220 0 R 227 0 R 228 0 R 250 0 R 251 0 R 260 0 R 263 0 R 264 0 R 266 0 R 272 0 R 285 0 R 346 0 R 353 0 R 358 0 R 372 0 R 388 0 R 394 0 R]>> +endobj +396 0 obj +[/ICCBased 451 0 R] +endobj +397 0 obj +[/ICCBased 452 0 R] +endobj +398 0 obj +[425 0 R/XYZ 62.362206 729.37256 0] +endobj +399 0 obj +[425 0 R/XYZ 62.362206 562.0299 0] +endobj +400 0 obj +[426 0 R/XYZ 62.362206 423.88345 0] +endobj +401 0 obj +[427 0 R/XYZ 62.362206 629.7523 0] +endobj +402 0 obj +[428 0 R/XYZ 62.362206 558.2716 0] +endobj +403 0 obj +[428 0 R/XYZ 62.362206 231.16089 0] +endobj +404 0 obj +[429 0 R/XYZ 62.362206 747.77954 0] +endobj +405 0 obj +[429 0 R/XYZ 62.362206 538.4159 0] +endobj +406 0 obj +<</ProcSet[/PDF/Text/ImageC/ImageB]/ColorSpace<</c0 396 0 R>>/Font<</f0 413 0 R/f1 416 0 R/f2 419 0 R>>>> +endobj +407 0 obj +<</ProcSet[/PDF/Text/ImageC/ImageB]/ColorSpace<</c0 396 0 R/c1 397 0 R>>/Font<</f0 413 0 R/f1 416 0 R/f2 419 0 R>>>> +endobj +408 0 obj +<</ProcSet[/PDF/Text/ImageC/ImageB]/ColorSpace<</c0 396 0 R/c1 397 0 R>>/Font<</f0 419 0 R/f1 416 0 R/f2 413 0 R>>>> +endobj +409 0 obj +<</ProcSet[/PDF/Text/ImageC/ImageB]/ColorSpace<</c0 396 0 R>>/Font<</f0 413 0 R/f1 416 0 R/f2 419 0 R>>>> +endobj +410 0 obj +<</ProcSet[/PDF/Text/ImageC/ImageB]/ColorSpace<</c0 396 0 R>>/Font<</f0 416 0 R/f1 419 0 R/f2 413 0 R/f3 422 0 R>>>> +endobj +411 0 obj +<</ProcSet[/PDF/Text/ImageC/ImageB]/ColorSpace<</c0 396 0 R>>/Font<</f0 416 0 R/f1 419 0 R/f2 413 0 R>>>> +endobj +412 0 obj +<</ProcSet[/PDF/Text/ImageC/ImageB]/ColorSpace<</c0 396 0 R>>/Font<</f0 416 0 R/f1 419 0 R/f2 413 0 R>>>> +endobj +413 0 obj +<</Type/Font/Subtype/Type0/BaseFont/ZGVEDR+NewCM10-Bold-Identity-H/Encoding/Identity-H/DescendantFonts[414 0 R]/ToUnicode 433 0 R>> +endobj +414 0 obj +<</Type/Font/Subtype/CIDFontType0/BaseFont/ZGVEDR+NewCM10-Bold/CIDSystemInfo<</Registry(Adobe)/Ordering(Identity)/Supplement 0>>/FontDescriptor 415 0 R/DW 0/W[0 0 280 1 1 786 2 2 559 3 3 474 4 4 639 5 5 527 6 6 454 7 7 319 8 8 383 9 9 869 10 10 800 11 11 607 12 12 447 13 13 756 14 14 639 15 15 607 16 16 319 17 17 575 18 18 958 19 19 1189 20 21 639 22 22 319 23 23 639 24 24 607 25 25 510.99997 26 26 831 27 28 639 29 29 351 30 30 671 31 31 607 32 32 882 33 33 575 34 34 319 35 41 575 42 42 818 43 43 692 44 44 319 45 45 1092 46 46 831 47 48 447]>> +endobj +415 0 obj +<</Type/FontDescriptor/FontName/ZGVEDR+NewCM10-Bold/Flags 131076/FontBBox[21 -249 1164 750]/ItalicAngle 0/Ascent 806/Descent -194/CapHeight 686/StemV 168.6/CIDSet 432 0 R/FontFile3 434 0 R>> +endobj +416 0 obj +<</Type/Font/Subtype/Type0/BaseFont/SMWKFL+NewCM10-Regular-Identity-H/Encoding/Identity-H/DescendantFonts[417 0 R]/ToUnicode 436 0 R>> +endobj +417 0 obj +<</Type/Font/Subtype/CIDFontType0/BaseFont/SMWKFL+NewCM10-Regular/CIDSystemInfo<</Registry(Adobe)/Ordering(Identity)/Supplement 0>>/FontDescriptor 418 0 R/DW 0/W[0 0 500 1 1 556 2 2 444 3 3 394 4 4 278 5 5 500 6 6 556 7 7 333 8 8 306 9 9 500 10 10 392 11 11 389 12 12 556 13 13 722 14 14 1000 15 17 500 18 18 333 19 20 500 21 21 681 22 22 500 23 24 528 25 25 833 26 26 444 27 28 278 29 30 556 31 31 278 32 32 556 33 33 528 34 34 278 35 35 556 36 36 764 37 37 653 38 38 278 39 39 722 40 40 686 41 41 528 42 42 681 43 43 528 44 44 361 45 46 389 47 47 556 48 48 625 49 49 500 50 50 514 51 51 750 52 52 917 53 53 500 54 54 722 55 55 778 56 56 750 57 57 778 58 58 444 59 60 750 61 61 583 62 63 472 64 64 785 65 65 736 66 66 278 67 67 500 68 68 750 69 69 556 70 70 306 71 71 708 72 72 500 73 73 750 74 74 670 75 76 500 77 77 778 78 78 611 79 79 1028 80 80 750 81 81 1000 82 83 778 84 84 833 85 85 750]>> +endobj +418 0 obj +<</Type/FontDescriptor/FontName/SMWKFL+NewCM10-Regular/Flags 131076/FontBBox[-41 -260 1009 760]/ItalicAngle 0/Ascent 806/Descent -194/CapHeight 683/StemV 95.4/CIDSet 435 0 R/FontFile3 437 0 R>> +endobj +419 0 obj +<</Type/Font/Subtype/Type0/BaseFont/TGLLPI+DejaVuSansMono/Encoding/Identity-H/DescendantFonts[420 0 R]/ToUnicode 439 0 R>> +endobj +420 0 obj +<</Type/Font/Subtype/CIDFontType2/BaseFont/TGLLPI+DejaVuSansMono/CIDSystemInfo<</Registry(Adobe)/Ordering(Identity)/Supplement 0>>/FontDescriptor 421 0 R/DW 0/CIDToGIDMap/Identity/W[0 92 602.0508]>> +endobj +421 0 obj +<</Type/FontDescriptor/FontName/TGLLPI+DejaVuSansMono/Flags 131077/FontBBox[0 -235.83984 602.0508 844.2383]/ItalicAngle 0/Ascent 759.7656/Descent -240.23438/CapHeight 759.7656/StemV 95.4/CIDSet 438 0 R/FontFile2 440 0 R>> +endobj +422 0 obj +<</Type/Font/Subtype/Type0/BaseFont/HCGNIB+LibertinusSerif-Regular-Identity-H/Encoding/Identity-H/DescendantFonts[423 0 R]/ToUnicode 442 0 R>> +endobj +423 0 obj +<</Type/Font/Subtype/CIDFontType0/BaseFont/HCGNIB+LibertinusSerif-Regular/CIDSystemInfo<</Registry(Adobe)/Ordering(Identity)/Supplement 0>>/FontDescriptor 424 0 R/DW 0/W[0 0 500 1 1 527]>> +endobj +424 0 obj +<</Type/FontDescriptor/FontName/HCGNIB+LibertinusSerif-Regular/Flags 131078/FontBBox[0 0 500 698]/ItalicAngle 0/Ascent 894/Descent -246/CapHeight 658/StemV 95.4/CIDSet 441 0 R/FontFile3 443 0 R>> +endobj +425 0 obj +<</Type/Page/Resources 406 0 R/MediaBox[0 0 595.2756 841.8898]/StructParents 0/Parent 1 0 R/Contents 444 0 R>> +endobj +426 0 obj +<</Type/Page/Resources 407 0 R/MediaBox[0 0 595.2756 841.8898]/StructParents 1/Parent 1 0 R/Contents 445 0 R>> +endobj +427 0 obj +<</Type/Page/Resources 408 0 R/MediaBox[0 0 595.2756 841.8898]/StructParents 2/Parent 1 0 R/Contents 446 0 R>> +endobj +428 0 obj +<</Type/Page/Resources 409 0 R/MediaBox[0 0 595.2756 841.8898]/StructParents 3/Parent 1 0 R/Contents 447 0 R>> +endobj +429 0 obj +<</Type/Page/Resources 410 0 R/MediaBox[0 0 595.2756 841.8898]/StructParents 4/Parent 1 0 R/Contents 448 0 R>> +endobj +430 0 obj +<</Type/Page/Resources 411 0 R/MediaBox[0 0 595.2756 841.8898]/StructParents 5/Parent 1 0 R/Contents 449 0 R>> +endobj +431 0 obj +<</Type/Page/Resources 412 0 R/MediaBox[0 0 595.2756 841.8898]/StructParents 6/Parent 1 0 R/Contents 450 0 R>> +endobj +432 0 obj +<</Length 12/Filter/FlateDecode>> stream -x�������? +x��� endstream endobj -268 0 obj -<</Length 549/Type/CMap/Filter/FlateDecode/WMode 0>> +433 0 obj +<</Length 563/Type/CMap/Filter/FlateDecode/WMode 0>> stream -x�m�O��@��|���sp�q4�DQ�'�d��t�HC8��7�+��fj^WU��Uw��x?N7�9�4��w�`K�f/E����)��M�ʬYߣݒZ۔��vS���Ly4�s����Ke �eC�7����U�%M�@�':h6}��(|�|�ۮj̒"���FgM=6�y�xP�n���=�+��8�i��"E�*{Q��o]��������V2����T]oo4q�=��3"oV��̅&�f��C�^yl�B��F��`�-j�@��V������e� ���軈�b�h�ڢd[�{�0�5��<�ף�?�$A��\�)�K�ִ -�Y�vJ9�FP�Ss� �@͠fP)2c��S���)%�q��]��b�g�Jb;ԉ��{���S�8�0LP�Ks(��A�o6�>�G����|i�s��7?�D��8�o&1�Q�T�/}��1�:���`6 -�1\zU`���c�Ε��ԁ1��E��Vr���c*F�)*0����r��k9���wPֲ���s�~���W�6�X�>����IF����s?� +x�m�M��@������sp�A�1Q���|d�작.]i���~K�l��������q�nt}�i�ӧO��-x���㺻�*6��f}��Դu�qO�aw0e����A��%[���Y0fP:t}]9��U�W^�d{��fӗ����uqە�YR���贮��:Ǔ�>ں8rO���V��4�:�"]���.���������`�5���C#�DD�'_ʮoo4�����3f�[�mi.4�7�m�84͕�&ɷ�l���F���b�D�1*�<��n
����Z�!@�E��k���\�Y���i�eY�����Xv:�֖kZ���_[R�� +�_�s ��H�b�D +�!RzUp���c��C����_�3���c(y�(yp�dO8F�G�����#I��Bz?��/�����<����)��e��Kk/�x3JÏ����~����h���/ϜJ� endstream endobj -269 0 obj -<</Length 4357/Filter/FlateDecode/Subtype/CIDFontType0C>> +434 0 obj +<</Length 4818/Filter/FlateDecode/Subtype/CIDFontType0C>> stream -x��XiX������F�lL�T�ApBp�I���&F��(((eZ����4�$3�A@ZQJ�c4�!1כ�I�C5&!<�v�C�}_��r�}�{��>��9{�Zk��[���3 -��iah��c}�gDm�
�˃�!�(�/+�~���ӑ���ރC��!��ؗF��l{Ƹ��0����Pۗ����Ŏ��B��꧇D� ��4|��q�c_��;�/n�#c�"�c�b�6Dm�
������!48&4�-.2$4�-6,�m�{����"c�懯
�� u��vs�
u���4��'6n�����>�"cc|6<^�c�������ϝ�p�ߘ��X�uQ�n!����b�0��`F� -T�R�Cx�~��ɖØ׆���p6���'TNѠ���Ib�D2�w(��-?A;��O�l$e0�x�"�+:h���,x��� ������3��w֍�]����}��&���x��M�v�..4C1����̺HG�KU�ƯnJ�W�PuH���e��r�E@�h -��
�i����:Fa����+�ڪ!~��x��,�=Z��F�F�l�^����ฒc�����%EYՏ���t@��(/��5'ޫ[*����� � -�Tб�s!D+����:��.��H� 8���U�@br䚆�:����U���%-+��H�KP7� -� �."gJ��y� ���PD��4Gf���ӫ����W|�'���!����r��F�c - - - -j -koojji����T4E�Y ������U�����צ@2D��Դ$Bͽ?����ԩ@�u:X�8
�D�ak����V�9�9@�6[�C;��mh2z
�44��zV��,���␄i8S%e�I��ģ���O
����@ �z�Sow҂J8g�p�FRo���<�oP��� a����v�f�t2�Dte�Krr�����:��LEi�`ڵ���=�V -���! -��"�r����F��J�X�?|��KK�ݼ� -X{�� -�)g�����lQt1CX -�NB��)�ʽ -5�2T� sK�#�aف����:��RV������Eހ#'4����Bw/k�}a��́ w},�0�]aSg�.�������:��Nx�Y���IV%Z�3XR�7��ߔfZ�� -�:�Q��*$)��W>!r�i�3"�)����*`�s~��=v%�2b�,�&s�%?���Hc̞��ĐeҚs�5����3#�@6����o7C��ܪ�Y�袔��AS�
v�I�aJ߾y���e@�Ы�4�+j�MPf,6&m1��N��aݤ$g�=��З��1���HrE�?V�����bM3b���%�ߙ�ׂ�h�0��4�r�xږgd�!8s�����U�� -B�ճk������� -���:WHCE���2cu<��w3������T��+SqDF9d�=��{�|����%�w
6��~ٮ'��O�����t6�>5�+4ҷ��.�__�dƛƽ'Ea�禷�n7�~k��q�L�U��r�%�dU�2w�Y)ϕ{4���2�2��=�龠����Kԩ�G�/���ِ
�����DH$AM�����DՉ>�`��Ưu�|��ʞ�r��}��)b,J�mnZq@���J�i����lA�'�Ѝ� -w=u8����o]�d>�Y�K ���ѵ�-)�ϽD�7�a3�ۀ]c^*����Y����тNOغ�����E�l~Ji��$�.�������@�p 〉���O���+y z){>��4���D
]!��x�a�39\�#���R/��"eIĪ���oYh��;��]�o;����͆1DT/�C���)E��Ex ��yQC��X�^�۲�2�MD��0��J�|Y\��Y�sʀ�.).1>)n��IN�NCN��}I����h����lSA��B&4�9�>=E��zͧ�gnZ�/�C�*�,�T���$>ɐn4���(ܑ���MԊ� };v[qE��(��]�p��P��`
�y^�Nb,����sw�NZ?�r8`��%��>=il$�5Q--{j��b�s_�H�E���F��4�˘+@P���8H+<�C25�0�S\ -�ZRK�4�U('�rR:%އi^ZU��� �Ϡ������r Fkt�1a�[���i��⤖��G�Ѕܷ$�O��oԝ:y/��ѭ{Z���p<�tkVݞ�B+܄��0
�Cg��"4���S� $I��h�G?�b��X�
7�rL'nBe�M��Bw�|Jv��$7�[Ag\F�������@= ` -����5
�D�Ufx���l�Z���8#�e�������"���O�X���0 -lz�n&¯U�s��PY�s�:b>4��S�� -Hэ[K��Ve��)ݴ$�,�V�-�أ��5�`�xQ�����˷oÜUZ�� d{�4�Cޣ��qEGǹO�DD�YX�U�$<b�2I�^8O�Pʣ��ǀ5�����|"��T\<�����^�g< �pҷ���xC���#E�e8��*���_iR��"��Gp W "����D�7#?��Iʞ�}�C�2Gg���`�[m� -X��B-���W�g践����=���'�~B�]��Y]%��w���f>���&4����ɵ�~��O7�mG�� .##�c4A�h��.g��qh3)�O�dsRf�%��D��<�����O(J/�J��O�A�f -w1����L��42�v��9峁�L�MG�`��tfj�md�y��NE�RV�M�1��}�>������\�!�E;T��m6C6B2�KJ&ԗ�����ԥ��I�]���s*��X -�66<P��h� +x��XyXW�玲���F�h�DS
���6I��\��Q�VAA!( ��� +��}�fߔM���,"�[\bb\���h̨�1�L��)rɛ�5./c���S�������S����^��_?�\.w\?k�8����l~� i08��r��L����
��|���\��~ۙ�e2�������L��9��X��a{-u&S�嬲vFP���yA��1�1�#f�t�3�-��>���6#<&"<4�mYt��-�1��cݖ��F��GD���F�Eo�r�
+�r� v����en~�1nB7�G�yy��E����DN�����46"j��ƈ�h��OE{����x�2��f�.Z�;6&!�mcD�[PpL`���2��L.��ԺB�|\[YP� +��-�p��v�����-�93˜�����+bΑ�BK^V����A���e2�l�-�.f +�E���ߖ~"3�Ie��z���3�@����,{�����_ {��h�뎛�*�(��;�
2��y�s�*R�͏���vIu�����8�r�Z�(GO���� �R�h7�ot��;I���*Ӳ����Z�'h4��0}9� � +�5��u6�CG�5<��X�fi���[D\\�c���h�:�Dd�8��>uU +���PUø�ٗ����rׄu
�k�*�p0�Ԑ�QN����
��4�/�6�ܝ@��h��%��e���m�5���E�OC� �����)Q�� +�2_r�B���r���� ʨ��Q��K��~�?8�B��
+c@��/��i�e.�B��o����,L#\���qw��?CBR������f���洤��1/^Ո.��,.��*rӡI�c�o��/���ʦ9�ÇL���Oߏ����ؾ�j��Cy����˦U�#\�cp�������As��p���7�z�lUա�=Zu�,�D{uYdI`��'ǭ~?l>�n�WOj��� +8�p�V�^��o8 +oP�(u b�(��ugst +�F{te�Krr� +* NF��)�ʽĖ�6�y��@շ�C�(�[��U\(yr�u:��|��UZ��K���*A���F�o�x��F*�袐�0\��yw�7�>��t�}O|���B'���'�Q��{����C减T�#p$yoHe(,��D�_�fd1Y����ۿ�C��+����m �����0;�������~���C{��y��s�QJ_�����{x��E�B�k!�&�r�p����Jk�`�@L����Z��`�������LNr֎j�����=gJ�qf��F����Rsf��"�� +�.%9K��������>�$WPb�Sv�i�s*Ƹ�
d�ͩ��&���@��|�b�Y�c�� ���d3ў�*W� +�Q�1�*G{�u��B�'���lj�:��)#����v�A�v#'R�.��ɯ�!r��ti �@j�U�ʏ���ͺ��6��:)zR�u�ƣS�X���ذb�P%L�k<_��dA�g�Ѝh�����^�N]r�e� y�e�1��^mQ���`#$�ƕ�w��'�ˍ�Zث/��\���gT�ߐ�s�� +��4D�V ��%vXyi�.�#AZ���@6t|����˩(!]T���ٙ)��;�yϜ
� +�L��D��}d�w��������#�(T�UB���',i�+q:��iV��.[�z΄�E���ԁ���p'�o��K�q�~t��W]SE��N�Lϟ�4��꙽=+.˔o, Z`��!4W�������P +���� q���i�Yt���,���/����T�oh!�s��BȄ�>��'��*�R��"�ܒ5�C6�>)�AE�ŒF���%�3Г�;�v?��A�k�n+�jRC���KU�F��ש�K!p)� +5?~��i��tp�z8�.��Ȧ�=�up�:���`��F +w�}L��9�� ]C��T0B<I�fp}�8ـY�`xQG��|���H��T�s�p&�.VK��/+�����ƴԝ�2�ݷj#۪������
ͫ�;��.|)t�P�z�єa�a2� + ���tD�}zf�TT��;3��%��t���:��*X�!�B^�~�{�z�k���5PJ�Ϩ~���o����*R�ԁ2�n�bA�(B�{kh�T��u}�2ʶŧ,ĚL�h�"�D�2�4�8-"Fq��dN���̰�H����ޟ�����B����Y��$j��].X-�Z�[�Ub�N�~U�KJ;m㸞\�WW����� ��t�u\4���V|�=��5��ZP���K������Ѵ���$��U@j̙5�!�=UU;�hLK'��c��[6ͤ^t$
���EGb�#�N�i�t�:�����
� ���Y �l�k��pp�I�v�ؽ�l�l(�aI�$ܘ�D������s=�L�sˁ�X +��;� endstream endobj -270 0 obj -<</Length 11/Filter/FlateDecode>> +435 0 obj +<</Length 13/Filter/FlateDecode>> stream -x��� +x���� +� endstream endobj -271 0 obj -<</Length 700/Type/CMap/Filter/FlateDecode/WMode 0>> +436 0 obj +<</Length 734/Type/CMap/Filter/FlateDecode/WMode 0>> stream -x�m�Io�@���5K�!Co�C���b�C�h�L�
c ږ��~�� -�FsH��*W�� -*���óm�܃�)�����U�a��k�4]5�xr~xu�:{��O�vMջ������C��_G�.9�KY�C�o �-�~hNI�~���=�P��6����$�4�庾n��$M��.�S�O&܃&�]Sm�@��ێ;�W�HE��V�wuڵ�����i��
idٱ�L"�ɇ;��Н�.vO��y��j��˰߂۱m�.I">u�ƿ� -�>�L�� -|����P��������.*f̯P�̹8
&T�,����.�T�G�Sq�Q�4������L
N�48
:hpx���0
F�U�Xp�e ��o4�W |*,7���Wl]�Q�<��1f�����]b��5̈O�aF���pˀSs]pf\������S�sN
2�=j8i���F*���<`�xV0f�x��քcn���Uc�9?ēO]�k�w���6mx+�ģ���[�lG� +x�m�MO�@���Ӄ%8��MP ,�@A���ݤ�����!���}'IU� +� +� �kY!�j��=/i����*�4N��Bh�K�i�K�5�4Δ��`��| +�I(�L��d�c���~�b��{��dw�)d*��U�+1>����LM�Ѡo +��+0*�P��r�y���(�d'pT�x���� +���;N�1pZtK�ӀZ�9N�Njp����`T�7
F�p�Uk��i�S���f>�M��=G_5�*sDF��aFl���dMdTq���]�����WO��W�k������EL�Tq��}��
85��sD�hُ�*F��mdTr�Z,�{n���|ߤN^6����<]o|�ŋ.�痛���އ1]���wf��е]|+������k����� endstream endobj -272 0 obj -<</Length 10970/Filter/FlateDecode/Subtype/CIDFontType0C>> +437 0 obj +<</Length 11748/Filter/FlateDecode/Subtype/CIDFontType0C>> stream -x�}zw\���]`wF�5��%���K�-1���wAЕ" �K�ݳ�Ti�aQQQl��F��%��آ�`��=�g0��}>��|^��|f��9��s��{��89�B��ϐ��������`������� R[��LD�/m#�
K������ƩJٖ���ܾhږ�F��Wu���mԑ8:Q�B��o���垾A>Aa]F����<�������wp�~}�
p�����:3�O��'�'����Lo�@��5�\}]�x�<�=���.�\����:vڤo���ڳ�k����wP���CBBz��
��fEo����o�g`����^����V�ڏ��
��������<�'0h�ϲ������˨�]�ݗ/�\����:�ӣ����~^�c���)o���OO�I_�q���y�y��z���t
� �vu�t]�����߿��oP`/Bd9M��j�j���9�7=�P%8;��k� ��34jhw.4[��9�bi��RÒ*k�%�j�&5j�H�2M>�ff -��b�tk�1 -xď��"��_���;IӃ�D*rH��i+G2p���� -HR� ~z��A���S� -$
�7F��o��^o��ߌ�u8���WT�8$m"���o�S�e��,�G5M��s�7y�D�g�{1�y�2o�V��[��f�J#���J�8�s�"��V��d -�u�%eYFm���ڻ��5�mmn�~�ABƹ!鰷Z�� nz$���Iؕ�*�u�J�[u�lDt�xL�qA�Ժxo�g��tJ�ɴ�+�s�y�����lY1�v�n�"}���#!L+�K��vd� �s�4Z��]KC�x�}@�Ϧ��&�#`i��b?^�~ݚH���m�4���q��0�'�#_�H@���[@|������H�&�!�����y�HF��`�{P�܃��À����U���!'%gc�m��
{�)\9�`ۆ��6$M�[�6��j$-tD��}��& -�0��
����b��07& dmxĺH?�?q�����L|w�\������2� -��Ws�������#/��z��H�����s��Y�B.\5f�x{7+I�&ݑ���]T�Kj��^iR��:\x�������w������CvfƂ�` -���r��M��]e�F����������<�0Oש��g�^�GLeF��O�*��lR�B�,m��H�Yک��*�ޞ�
����ݥH��!���mH:�l����v�n���[��y���ׅ�_�l*�4�.��f�߳Ƭi7�`M��mwڀ6�yI5��m�?}�����h���]�,�8V�q6�W��ӆ|Y�� �x��{�ќ�M;]�*�$�B�iCLt$���ᅛJ7VT�,]&L�9��y����_��!ݐ���#�f�Q6�YQP�˛�kJ��%���UkO�L�F �?\=
q[ݏ��Q���~N�%��܀B՟�]O�/��f+�Hۯ�4U�������+[���$}��"є�_ѳ�Eԫ|c�U��ޗ5�b�f *~v�E�����H�|ī��b��I��p���T�#~>�vB�q��u)��hC�,$N
��f��/ Q���`AB���CB�Iיߊ4���u�١����)6�C�MQ������+������0Xs
A� -�'&��<n�>e\�y�M;��1�r�S$I$NN]���^��ԡ\!y�;J^m;��7l��Ӂj�ڃ�v��Q$>��R�(�!֥��4H*�Y+�W"~Ⱦ���A���={#Q��<�e���l�G�E��8�?"����*������4.L^�>�G���Mėmݑ8��L�c:`,�"8b�,�G�����d�+D��2��u7D@�kz ���bÐ(�G��X�װ�g4[�D�F�D��3�ҎD�r Q��#i�� -|��}�����!�2��������A��8�Rx��i�i��^Y�7'H�y\�_��e�g� �ֺI�Gn��'�«Y�z졠%4M;�F��?>F���9�5ǣ�e�w� -��$�S�"qH$H�(�� -�XCeKT ���|\�m-����I�u�Z@��6 -�ڙi��j�?����~�������]@Ҵ� �k��R��/d�LV�y�����:�������۹�-U"�9�~�*9�@���dҊj$�3ݖ�X�W*@�e�>3��ֲ�U#>~T��yk�����Ed��
w�|,�*��s����\�%�e�dh�\N��i1�C�B�ucn*փ[�j�,踀���2X$�`���D���@Կ�]bv�6M}DSm�����;���.6o�X���JQ*�*�IG��Y�o�\G!��@�E�dT������}ĺR�3:�5BU���
2A� -]�����^�� ��s�H-kKy՟���
ٱ� a���R�%;�x���٣�n'0N�Y�s��0N -@�|�ɴD�+�L1������ҟ�[��u�iT�
I[EZx��
�FƉ��m�=�.6��{4���4�5�J'�9 -a:�
�[�� -�l�(F�Xw���F�O�G�V�A<4�
qG�jēWݐ,n�����;�6$?�"�����"g -W`ۤ�i��U�;Im�ȑ��k�u*�$���M>F�n�nZӷ�@s��(+C�@���x�t�൹����b��D`9�r�+��ۂ�e�sґ��V-�ۨx�5�R=��)�v�I+_R\������>=⇟ �����E+o��#^��x���ܖ�]V�&�`B9kr��Dlk��+���7�W�!i0�Y�ʌ�f�y���"���Z�ė��� - $^�1�m|�Ąo���9f�T��S�tݗ���ס�זEd����_Q��>�T���ljk2����xъ������⢂��͗^o�b�����k��������.�\?N�k�q�� �l�$X�ɐ��3sZVF._P�ܳ���m@�y����d�Y H���x��ĺ8=�q�:=�v���,�7�!��m��s�#��0NõsG/�� �r �~ʾ�Y�!��6"U�B�x�����4H�D�%���\V�%^H -)WTQ'���cu�fqɶ����W�V�� *$N/�?t�D��Hw�K������N����!�m$� Y�� -"J^\eTj��f�Vo��Ys���C��b�'���
$!^�T�x䃿�X9�+g�t�=�
�d������V�e+H�|1�C��̦GX6� *�թ*,����q8a�0�^��P;��k�m!Ϯ -6v3���0ż������H�E�#4��������_��Դ�_e˨�N��k'ֶ��]�����1�&�l=Ǡ�P�=�k=,JY��ԻB���Q�����g~u'�*�2�f��~�e�nn���R�Y�#�ɩ���L6y��6�����6��VXcR�!����������
w9�`AZ����J$N�V iܬ;��H���=4%4��� -�Wͺ#��3��g�?����ˋ͋M�M��տ����+����K�.���l*��}˖2:���Sh�7�%m� ɑ5j2�� F"A�T���:�I;_� -�*�Q�|�ɲY�ok�H��H� � -�o^M�����_�`B��c��O�p$�����&GYc �כBt\����0�c���*]��r�!q��)Ox��C� -���{�ӆ\$3C��#'_�5���6#�����WG"7F����!8&�6�I3�,XUI���A o6*!>9�=;ͫ��^$ݴ���v�\wA�[�Ak1F�8��qQ��mJ�O�L�t��Q��4�G� -V�x�+�n;�H:urC��\��i�H��葴}��0�[$���W#>��d���eV�G|�Mcy:��T[d[-h2}B����U�o.���Lvz����P�����M!��ϴWs^���?y�z -삮\u2��\N�aė��,�rv�v�\�DC��D�.��7H�����^i���`6O��`�n�5����& yp�[N�Ƥ(�!>r��RO��G�+��G��g�_���0+�ku�{������)�=��h��\dI9 ��(=�)���r��́/x5ml�XK��R'�˱��w�W�i�~S;K+�u{?���c�xDi���=\9����r��֝�`?�y�7������-e���2�OL�d�t<�Œ�C(+W1�A9�4��e�u?s�S#�9X -X�X�� -!�)$M.P�S��?��)idFh%uT������y���9��NX��&������l�����)?�76E��O���<��\DL���uO��kn�� -��+�`��{�Fs��Ȕ�W���[*S�/9��?�e�H�sj�K;�gC��wGi`s9�e��c�n�c '/9gףE5/��2Iz!Z���S�6Z�{;߸�D��s�o�p9Y|]6'��O�4J��ȮF���C�
ռ�+�WV�������=�B�\��d�&�8J�4_[�2ֳ�`��rk� K�L$ -��\�������c�x:����9�-(Y��1�5�Gz��B��ň���Gُ��g8�th_�u�'�=(�0�z'�v�
]�K!)w9JJ�^�*����7nL*h%�� -�6n��1Xd��RU�,�J�g|TTTRT��;mU.�
Q�#Wi�t^[׀8������7��c�,-�2�B$ ~��@��'?$�@|]8�g'�@G� -�6������I!
�vX��H����13�H �a�O�b>cU�$X�355j5�w��8��۞��E�y ���ci�<f �a����*�..*Z_��[�65d�N��`:�/�b+dTH��E{�R�5Z�J�O���=/�]�-�I�$>�KH�O����� qqų�N�����6V�X���,Θ�o5�
�.Ϯ��b�Aϫk�`S�F3Ak����N�ӟ���3m��#}�|�e��>|�'Ʋ�߳�����6��QH�i�4$ı�#'r��.��,x
(èt�u��jj4x�,�(�rW�1��r6�s,���x{�^$d�PĬ��(j;�X�jŦ���6���-\Kê<�hX����Ǒ4Q��O�J�}t����C����'�'�%ŧ$��O &ed�1LԸ�e3Mum�I�.*t��P�y��Q�]������7&�'nL��R~��Qg-���[V˵]Tn�ʉ�!�x$_��A�․��2�3�8����iC��� ��7lX³9u/� ���H� {��Hu���blH_���@ ذ�\�)!.!���c -�<j��آ�9�G�U68b8 -��z"!��"�U�A����X������T�FDV*�NX7�eWm2�2��A8k�,���-��]��v|���tG��=Z��캋�N�E�Hi����z��>�{�H�]����K�~�q��7��9���$�bA���I���j�"�|�
��f��q3���2y#�������|@o����3O'�Ct(-Q"Qwꌤ�3ĺ7�tm�4E���xĴ -�%SF�r�w�a��wG�+�8�-[>��߀-Q"��AJq�!�8�T�l�
S��d,�(˼WT�(Y� +x��zwTT�`�^Q��8��{�i��c�=�. :R�2���3C��aPQQl��F�k�=�� �s���.��}o��[o����f�}������ NND�P|0�+t��!�|�2D�V�n����Z RW��LD���V\��ve���S��+! +s���mWB[}$�ܪ���L���с(������^�Vx�������������!_�d�'_������
r���_��4��y��o�k���ծ�A�k�t^�A^+\C�Vx�u
��r�0cʧ�Əs0�5����'88 �A�BCC���v� ����_�WР����}��躏���������<�7(x��GH������q}��W��Z����:�˳�����ޮ�� 0�u�������z��\�}܃]=��x�����:{����{�{7����4�YO�%C�ƮڐiL>��J-Q �N��[�Hm��ZڝK���bN�XZ��в�֚jI�Z�)�Z;!�̕����,UWB�W�I����������;Mp���r��j�j��Ň-��`Γ�q~�rO+�V�Z��Y�������miۻ.K5����>j�C�N{�}������ar��;Vv���H�Ν�}8�Ka�g]�^���Id�!�?t����ћ���z�����^�-���/���s�o�ǣ>>�oJ���6���Z���Ltpp����ɺO�Ai�A��������R�����`��4��5M���%z�ԩ����Tߢ/hP�^�v�5��Iɜ&��e�v�께���$��x�E�.�;��-�`n�Υŋ�g��3E����,y� Y{Y!h��h�!0/�lՎ��6��=%�V��P��|!����eF�f�16�+�n����4��Q�H9��A#c���rB +ܷ��|��m�X�)��M�b��]Yk&�H9��=U�Rc�xHJJ��� +��C��^sɨb���t��� b��n0&z}�>�E�1����Ɉ�q5b��(D��^��b��oV�Gl����O.��ƊT䐴�SV$�dh����Hһ �}��Aw��m�J$-�F���$��_ >�߄�u��d`L�$]���9�g���oU��\�{
m������y�D5x�{�y��p��u[.�v�*�K7�ʑ8�u�"�&���b��M�%eev(������q������s?�#!ݐ��S'�jI�$7=UX��JM-u͂&g%��&U":�9*�`Xn]�,0�D:���؋K������}���j�QFg��UJ�T_��p�/3*�_�^v\�X/��hW��@^�\X�q1�)��hX^��̟���_�6: +�k�t������ZT���U�B.P����zT۰x� a4,^4���J�U�M�P�1#��� �2����sכ& +:��Zˠ +Z/�i�foÅ��6!�V厸gv���8īC�ߝs�$�a>j�p٘c���ܜ$-��Cұ�gQ�.�ٓf[�)� +�p��o�t�%-�IUvւ���ܿ�$'�$S`����U;6m,����\0���z ���Ʈs+�������=p�Ti���}�Qc��Ȱ���#��j�Ò��z{�V8g�wUT#�~yI��"�y��N���`_p�_�o�;L�ar��^�p��t�i ]���z�b�Yۏ���e��hں�)�j��|��W��~��}���#�8A�q6��,�)C��֏!�x��ېiNϣ���B +X!�
�|@qD�Ɗ���U�d�6�� ������ɫ̉�z�j�c�ڕW�<����v.�l�'�Z{�|7�Ρ��[��A��}���-�4g�(Q�n�����/Wi��ɴ�jNS˺��q� +d4��O@2$fM���{;�XJ��2C]����\����њe��ީ�ɢG +l�#���/?k���'x�!������q�ゎ���!��d� qpj H4G���/�H�$$��&$� +�����H#��A[ �A� ��R`�8ği�o�-�$�(e
�e0�,��sr�nQ*����&6��
�#X��{"�L� qrꋤ�f(�U +ɻ�Q�6h���?b���o��!6 ��c�ߎ%���. �^��D��)Ì�EJ�:I��u�E$��5">��Dq��%ʆ
y��XK��q� +I��K�7[�;�H�t����]v(��y��)�����]�o���
{"kο3�t�/⫔��z_1ʚKr�WWː(|�wE���x5}A3J4��MDɻ�~���7�]����4/�/�[�� + jXL<"{������w�BDv�w���O(���FR8����3�������z�:#�:̾�h|��)G2pyet��VXm*!M�.eU��(����z�IV��Ɉ'�D�z����m��".�l��D�� ��,D�M�M>� �W��6v(Q�CS�8R5����[�ԅ��٧�s���}�\���~A?��g}�l�H'��ڗ���9l"��csX_A�I������K��}����&z���V� +���I +��FOW)h����G�'�����#���ɲnԙ�/2G���-���'���bS5�e�Z�ԩ���8����}��#Ҷ�4�.�ߦe�M��lk��@E?�n#�SQSJÊ+�-u���0���r�[ɕn�BmR��f���c��9t�7��`��M���� +e�{7n����_�[�0uL��O�O�18���9l�S�W*�,���;n^�>:4<�0~���o=���E��uH��s`����4^�Z7� +ZN3�#���}$�� ���?D�x�K��@���#isi +��+ͼZ$�����b�7x��%D��}�����p��Έw;V!黦���$}j�!��]���-�x���T��Lq��f�C|x* +�-����]j�ќ��$HH A�;��d����5 q��������!��vRv�����@Bϐ(ZlFB��������ab&��k��8ϟ
H>����r}�D5�3�6�됨!I�]�n?`��Ha"���CO?�7[�����y<��E>���^Bl�ڊH��t\���v�a(���w��0�"q�^���b$⍅�?=|���49L�� �aV_�˟MC2���_}�D��=�1�$���!&���v.ܴʸ +V��%X�?����`������F +�V%���l��l�M�=�,�H4E��.۩*?5�+Ɓ�h���b�70�<�?�(ؿ����4��®Ȓ~�1�"����J[aA�;F3�'LŜ��ŜiA_Q�W��^9�ْZ�9���/(�ϯ,h�沲����|ל;7*�^�z�:�vY�Q/��b�'x�R�Z���eY���f��ˬ��r;푥T�)��KNU�w�P�E�}^�_�j�z��r�"O� ��NaH&vC2έN�K� �3�(�J�O{g��\���*�1�z$C�z$_��C����@�q5a�KMyx���o���'�L�z �k��K�����ˋ4���MR�����b�*�3��ms���5 +ડ@~��z�'ұ\��þG�|m��/=��Z"��_���b��n/-��� n�Lꕚ?Y���f7�4���(۳wۏ���8�uD\��}�x������T�� +~��K���;�d��}H'M�sv������� ++Ȱl�kF|����{u����!i���"�'
s�#2Gڅ�o>�\��79p����2�x�RC���͋�="-��E�.���M��s�Ӎ�<���%2
���BA��.�48n�ku����hG�9G��.�6Fd#��X��Zn���s~Q �������3*Ei?g�J�/U��z։M��ܙ^T'��~o��W*���l���H_�_a�`� 3a�����s���D���.��1H�i�$ı�+�u`���&���T>�>��jz,x�,��tg�1�� +7�kx�/D��q�ub�IH���9,Y�rc�Ua��X��B�5�O`��]��F���t�c�a���;��"<��M���8�"6�F�*�jk��XE�A�g.�� ��4Qe!6P����5��Ū��D_����c-�0�z��<Rf`hJ�u�xwυ�l�A==+�Ѳ��W���� +y��k������ʶ{o�;����Un�& +��*�r'|;
�AD�שF�����6s�ͣ�m�6]:#��v67z����9���Ej����;���3}ԓ����L�@{V�˫z�U)ݮ��Д5;X:%67;�������oa�1��,2���d.Ϙ����'|�x���M)X�y$���X�q�ش���dN��Zw�N�c(��o�#³3G�b� ��ψ/r� i�q?�?Wւ���Ǯ�g��Xj`#�3Lﳈ�vZ������6��QN�6Z�b�k%,�I�m��m����`��<�_�4��$�Nyw�i��T�y��z +:�n� +e +��=r^��j&�����e-�(�7�b'ų�M�f@$[,�<
�r�-�B ��!g2c��M��u���ӍFޤ������dNl���>0A7�Ժ��~Y��Q��:�� ���ϋG�a��K[ �c�C<�{# ������xe�NĚ���*����ɹ8ڊ�<2(q�P$-$WDf9�ā���-�������;6G��ҮUm`��Ng݀�Z+��rnGz�a�]��8���̾^Ẅ͝\'6�p>�1�� �T�R�l�Bi�2�7�*w�������n��qD�H�B���:x>{TÉu�� 3?�y�:�7���/�rC���Uć �=��u{O$N�3!��I�F�b��2K���}l?�}�:/q�.^}4�d+����-���>��+?{0�:R��*u����LQz���%�����X�nc'�]]�����t�P]�@P�CJ��Rh���:Ѿwk��6�K��n��$H�*0�WLR!qzZ���G�n��!^��d¬n���yI�c�|�K���$����Ĥ��쪭�+�qۚ�n�f���8��n��"���:�ïĚ��Xm8��߮و�H���W7�����j��R��{��� {�<z��q+
��:�������j�앛� +���Ǧ50���Xx]!w��+�hv��q����������XI�vj���8�����7?�0B�&7�E�i8 +u�J���W��C����JI�%���xU x��t���*clFK��k]��Zf��ؔ�͙�@.�X��w�n�o���/��yL��p7����&[i�KKJ�THM���j��MD�������k��7ÕH�~�FҺ]?$�����}�sXZXb�Ո��Ȇ�B|��g�=~7\��^_�Z��ë +�j�oW}!��;J}�h�t�9��-g�t(B��!�iG�:R�� .f�T֏}��1ZA���i�}�*D��{��X/K$r���b��p���� ��������'G��[�r������R�-O�!ԓz��t0�Ƴ�l0�d�tBNj6�^��#�M�����S�ŲY����f�Z`���*�T���a���!q�ـ�r�Y$]�~����JĦ-nHZd�!��U�D��-�%'�r� b�$�M3�to�2�G�~���ө�u�P'��&���
�(I���#I�(�)�����B<e(@�3�'Ĝ��rqfbk�n�/]��|V4�������x�QٲX�ֲU
%۩b;%�٨����W씬�c�#���LH�������Dq�bӣ��k��zS�w���4��b�͘-�lHY�ǐ<��ix��_)�D::#�8϶��Fopw����m�߰^�������v��������&5���gW���������ܝ�ؕbS�0.�f��r�|������}fB�b�$�ӪD:�S3w�ImK�6z��qS�R�8��E�:�ĩЊD5�/�VI�YKP�?;a(�����(7Z�DH2M��r���?k�SW���Dj_�t��QI���!����oyS�(5�-}��J��X�s�a�!V�Tk��{����#��8ֳ���{�c�n�%��������M�9����F�<M]�Nߟ\�4l���(��m:�E&%� +r
��@��Cl��+$3bӛ>���7m�t�Ϛs�E���O�LݹU�Ҹ*c��h�3Ti���t$3�t"�i�rk�Ώ;g���f����7�iZ�Փ�] +y���wlׅ�о4��5�7�ttE�[d����d6O������`�dd��D�|Wȃ��4CT��H�
H��EO$�*�/����\",���!�*��fߣǔ!"k-g<W��zӿ������aR�L]����m�$�*eh����־�B)lK,�\� ����d�3��%.6N^�9���%ԭD� +fim�+V +���`2M +�
�N�8HL�O�dHM����ו��s��]��C��ȵ��6�.�C�Ҳ=!�4�)�N{���!������Ȟÿ ����[B��ȸ$%k?9a�_\�����*.���^�w�>�̷���m�άQ�14��O�$h��tf�7"�Z:kv +q��x���X���AdJ�q�4��C +��)`�-ҫ��=a��5{V(�����ˉ�4?峯�SIt�����ϸm���j��Mq�Ϧ|�
b5+F�������Hz�rC��\����EH���t}z�0�S$��S��!>��d��ȱQ�� ����� +mE�m����
�_PXY]��\T��*z���r��m���1
IZJ�O�.����Á��G{�S����b�).iCl��:ꡢ�� +�T��6��Í��*�gѴB���Q"�ު���1v�p�
P����w���a#�� ����
ɥ���v��P
��Q�^�7"��e��x���[����P�K�\�!E/Ī�,�f +�f������h<W"q��.?�o��dV���'��}7yu� QrY����j�SpͰM�n&���L����r��fV���������$������S��.TA_v�uR���3p�`6_k_ύ4fn��m�-��r���B4 ��Fĥ'_��B|V�ώ7y��|��5F���r8i}{ځW�l���v����R{�[��C�\RH_j{,�zS���Q3�I[ �`�o�R>{u�X�355j5o����8��՝��yر��0��c�<�+�#3�Ƨ�*��JK7���ׇ�w�m
���K�%�沕��j醝 +I��QR�
ZVÅd&fff�����p%)�����!"��5�����������#cbbRbJD�TK�lҔrG��i�U&�� >�i9�.rE�A��zȝ_/�(�H8֊���1���e�����o�Y��03DZ,�� q"$ b�D�M""��(\�7unzK�����-7�h?^-��!�џ:k��� ��ѱN�/���\�������8�[�H:=�D<}��\�2T���L�q��02r��5=Q&E�!Rv�����3��ِ��R˳���MJSRBRĘ-�4�y6���i�lpذ��1K�������C!�}�cĆ�)�=|�? +Lw���ԛ+e��Bn&���ޥ�H�I�_p��dv����J$�^�������H�vH�&�Sb<l� %pƒ#c�\/��}$���(<�x�Vij�'`˔��n'�8��*�8_�t�\�Ӎ���}/GT�?~�� endstream endobj -273 0 obj -<</Length 12/Filter/FlateDecode>> +438 0 obj +<</Length 13/Filter/FlateDecode>> stream -x��� -w +x���~ endstream endobj -274 0 obj -<</Length 692/Type/CMap/Filter/FlateDecode/WMode 0>> +439 0 obj +<</Length 735/Type/CMap/Filter/FlateDecode/WMode 0>> stream -x�m��N�@E�����%X0��� -�zܵQ��b<�zx���y��Um���j������.>�ҟc�r�U�0y����1��j���jR���C5�Tr��/��USߪ4�ㇺ\5ǩ�>�����tM����Wuى�z�|�T��*Q�oqܵ���������2D�c+�J)5{�������]����y�J�U�A]��������OE�$���߳ �iw�j&���B�ү��S�%���cS�EJ�ES�������%I�,�]���br�g�:�������Bx�PwI2w��4*A��2���刔��=�2J_����P7D>��Dޠ�4�J�֜�,(���B��Ԁ$�k|� -��=�o�D _��9J��Q�ͩ:>hS�w�2ك/�s�'9��R'|s�_F'4|�:�����˨Z��苆ϐS�gp��i� ��/>'��9���4|Z"��j�,�E�>����3����gy>˫3�9|��,�9���3��=>'��99��e��7�>���g��Y:o���Z��>�������ىO;���Yܭ�O�>Q�>�i+|�'|t���M+|���ޝ���a +x�m�MO�@���ۃ%8���� +;5e|�rߕ���7sr,�/�ӡm��X�ɦ�X���l����G3��(M�����F���kʣ�)�h�ط�"v��-&WY�e��j��l�nj��/,�^^�nrϯ�U��Wד���CY���"Cl9j�M�lu� +�<�fR���&�JQ�x��n��Q2%�e�\|���(�%���g�(�ݠ�'��(�I��P-�!�oN'r���T5|��,|,|��Y�Tf�[0#��
>�(�Y�Y��>+O��|�Z��2��>��Ye��3i'>�|����st��d�����9�sp�yΙ�/h|^�G>;�I�Z_PL�"�������9��u>���d���A�� ����O�������y�3��/�>�(�Y�=|��{�O��G�A|t0����#J���C��B�0�� �0�٠��O�����|j������(���E�q�2Ǘ��.]�az�y�}�:~�0mӎ����4_�Q�o� endstream endobj -275 0 obj -<</Length 12534/Filter/FlateDecode>> +440 0 obj +<</Length 13892/Filter/FlateDecode>> stream -x��| XTW����9��:E� H�AD)q�9jM�q@����Q�kԀ�� 8%o�6�mcF�b5�1Jҙ��t� 1�\5����s�A3t����{���^�_��� -gM��Z��) -��!� ��Ŭ �/��#�e=�=�����E�1ѝ���?��r�} �4��Ν�y4�M<�: � -���
�$'"T�i����EX�7����$�/_��l��fd�x�5�����T+���E�cc�%��Zv�pҶ����療m���u�>�أ��oj9-+�N������t�?j���:Oew.Q�d�xJ���Ҁv�����4Dp�kN@4�1�� -�=�p����oY�'���x��G����1cR�����*��n�SI��RgTLLA��,v�ŬF_Vc�&V����f!b -R��j��K՝�Vq�ͧL)9�ŹZބ�3�DeK�ofl�sO�D}��Σe��N0���
���:$U�WC+��E��j� �����}�j<X/_o�,��^�j�P3R���G�aA1Q�Z!-�&��<ߥc/�/�s�A~������}=}bú}V<e����2^NH@(���zj��vB��;R"� -�ǃ+����@����
-�^oLmn��u��Ok�p�;�4'��}z��������2�O��7mk����ّ�����2?���� -}��H^�:���^l�*�!�dž����� -�rAh~�Of�כۣ�mz)M�:z�^�@2T�@�Yd�RBV(��An��<�/�Ė�x��^������qU-�hy�Kt��g��
�*lPay�`@l��!Z����j -j�Rz��8�!�>.�x��M�?����7��r�&�����>���w�w����JD�1��� -���I1��E�ZM2$�����Y��SwGg��N�V���NO�>hѺ�d��H�D8�t����!�f�4�B,�DZ,^��c���܃eHr��e������+y� ���<��9l�a�i)^��+�1,2%Cq$���,�iL� �/�˲�C��s�Vh,ëH)]EW��WC&��jZ8����;Y���u�ց��|�pNK�x��l�}����`�S�L�iP��d�$1��`�)+3��0��I��1L� �a�F�d@�4 -�{+3�\�������{o��܌?��=3{�,ru������ex�7�˾lY��\[(>�iYكZs{����w�|}������/�C���V b8@Hv0@ -p��u�6n\�n=K�6�����ߖt�0N�7}�a�cc'��HE�(s���o�>�����!P�+<�@l�A�� -WpE ���� -<���}q� �K6�{�}z��Q�X���Fp7�Av��*��w�M&�_�~s�U���c���3j�?���֢Ư�j�_�\�3ν���s|�?�q_��(+�<�2���9~�:�� -��LیP�>n�;��o&~�yΩ4tߦq�� -C����� -tG�X}�;F�|Y$[=�Y�� -�l|��V�u�,� ���KM�'&��;`c�¥Q��
5o��8@p��&0@go�TM���?+u����$Ө���j��1WHq�CxVˎ�����m�a)r�H͗��~zJ5��1�F2ͬ��h�C��p�"K[���-��1�2AyPm�%�^ -B�{u�ej�A"F�B'1��R����2�D��7T�IR��f[��no�[G�.��!IH�"�V�Hme -�a�1g?88�l�gQ�M$=���'Ol�~�j/��Q鳓[6��O�}���r����٨���hv
" ��
�`V�鮼� -u��GP����Q����EQ۩��!t7}�٥�2oD^1e���k��:u����?@�ˆ�@ըX$���F��s�m~�7E��{@��= -F�Qx�q�i*LES�T�T�.v�]d��vI��]�.�.�.�~؏���d?���K����~�~�~�18���c�=ƎI��c�1�1�1Ӡ_bƿ�J����Ty�2� �%B�'�ɨ�V���
�G/1��.���k���^��m*/ߴ��|�7n|�����j�ѣ{�9���������'J�����[�m@��Uh���:I������Kg��C�Ǟlu!Oy�͑]*]��ͨ��vY��Y���$��.Q��H��EgV�3�l�]��
�_Km���k7���7/���q�9��Z&�ҩj�b��4����j�2>��7?-,)��� -N��?;�3��Q��=����z�(�G�%��g�GOӅS���>�YR���9����z���믙+�O ɔ�yb���
z� ��!Zm�+���6%��X7rA�^�h�J��3�* �`�n5f�Y�l��gYS�N�+�ޒ���;��C���
2T�jGU�H5��Rm�!Z�Ҿ�Ԫ۴T[P�c�q��m��o۾���--7���|���\���_����(��|5zm@��j�Z�k< -� 5f<� �( -<�on�7^aM- -��V��}C�n} -j�����!
� �A��X�:Y�B�/�bs�.o�D�����NR�S�EK�U���p�i��Q�rG�nlz�P�c��A����=ӌ��;������س����f�"o'a�%Y�.rHa��J��*�[�od�=C�����H��X'��q��K����\����!R,���\i�� -%Q��A��S� -�|5�wffᄃtyZkb&z��G���w�<+� �"�y:$a�0�d�Y�Y�A�C�^�������z�G�Ѽ�[$�"��w�e~�?o�P?1�0��'a�BE�Ԝ�V?�(�h��2Ffɫ�8?�2ڽ�n�]���U�u+}��#1}����Q{"�o
�w��bhA���Y0s*�,V���%ϐ�W�R��`�Q���eqS�*%ȱJ&�%����d˓�� �<��,����fo<��}�r���C�` -�֖g|�p�s-�6{�P���� -#�]�&�f�L1U��L5?mD�*�b6��D0�R�!4@�
�cM*Qd�4W'lΌ�d��(�KD=���zhߎ -2����@*��3���h4����g�zTzv��3ϢR���� -}C3�p(��p>A[�x -�tM�rȃӰ�`+��r�� އ�ڛ�{�#�*ȃu �Q/��p[qdA8�A9�C`x 6��ba -�k� -�g��%H#U�B]t(�F����G%*����K��)C��mC���a��C����8¸��`��kcz�Toz����� -������O�ׯ#���1>���i�c!�w�������Fa�cd�,�q@P,Z�?�@�}'�bX����l(�%]`&�C�B -�@D�(�(ȁ9��X�`:AW��\X -�����P3`>́��PE0]�v/��Aa�(�(�b�������, Ҡ�]Ϸ>���ݴ���DK�� ��BȄdѯ��_ -%���J`̄Yڳ�4�`̂%0��Vi[Q�)��@P�5f�|(�e�a�I��Ϯ�#7�����Vc���ƷX������s�( -��3B��E0�� -�%/B���"�Z�
��k��r��V(���ꬶ�t
��$�/�b�����v��P3`�_��g�_��~�[i.Ѹ��Ƨ�L��"X��JAܭ�[�,�kt��`%њ�ij�ڧ��f���O���PE��6| -`���q�6�W�.�_��v.Vl�D�Y���D㳝�|M��90J4~�q��u��L�%�e�
j>�ď������o���mܖhv��q,pi�u��.�B����ѵM�d-�Di�u�i��z��]�V�tnu;�%����%Z��Q�o���
Z�\��P����!I���b
��0fj��{:��|�lՐ�\H0�M�!S��q����(�"C�:Ƣv~ D�t��-���V_Y��1��sB*�ۺ�D����t4�H>�W�)(��B�H�l���.�@��o�������g&�m����[#��]�颶3:��V)�>;Z]k���x��|��v�ij��~+��
�5i -��u��B:���mk܋��)S���� I��_��������x�Q\��$$�娮kI���E����6�l��{��,����L�*_{>�g�bt���>!�oͺ��M���������Zy�0��&�B1���f�r
g�z��BX��b��E�i}���u��c��5��ϣX���E���b��Z��u7�ѿZ�Dߥ��S�1v~[�n��V���{"/���^�♙0�k��z^V�����E��e��JKGQ�ł6���@m�Q0�i댂A0&@?�]˅��a���` ���O�"�Gk�8r5�����Nc��hO�(���TGj
�\ �gB���@�Qc4�#`4�\mM�� �a8< -�jx -���dc���8�5�s�F�h���1��8���8����q�<B3#�U�igu�F��,�۩�>@���!�߶�XM��0\�V�;V[a �mt[mg�FA��&��/W�P�����mw����~����y!�@d��J�J�n���u�� h � ��kw���0�k��3�=�j���c����^� �^�'����f��w���B��������Y��E�s+?�����q���W+ -�Ƅ�t�u��h��~�l�������G���;�C�պ��x -�t�H2�ߢ�Ǯ��\�{�ym�O2w�걽*�Xv�k;Vz��[t�}�g�������c
�s���K�zO��Z}�[�:V��Z��ׂ�۪=�U&���+�֮Et�"����-���%���)-����-�4-C��! -^F��2�X̒�a�v��W�_qOW�����U���8�Xˢ���!,��$?�Em�Y;&}�Ut��ۭOP��I*0�݁s���5��+Ě���|-Y�{́d�G��rHҪ���|OE)�K��;�I� ��_�k��0hq��~0�xx -T�c`����A
�`8L�@�!��Pm��D@_�B,X�+��Tp@8�x�=!�!�t��7� ��bۜ@L�nZ<�Y I �,����}����a�9>9���P9`�����@P���6 HՎ���@�Y�〃_f�<( -�='��7oLd7+������Xvc"���c�}�����.��/N�q�m*�j'�T���fN����ޡ_&_]�g_U�+�䟜�������=�|���y�';B��<�}q�|J>�"�r� '�`s�|XE>���}��_7��_����LҴ�Ě2�EN.�kd8y�H�s�'�SٹN��`�'oV���v��3��^I���uN^���� -o��GH'�8��d������.2��i�L�d�$�b!���Co�'�v2�D&r�g'8����T2���������d4'��d$'#P"���#dX247�
�Ir��Xn20�
�dp�O
a����!d@Г��QY�_��^���rT�S��k����/���Gǽ��63��x��j��f�
,�L��כO�r�%�>�H'���LN2���Ozuc������H����#�S�X�a$-%��q���TN�%�Y�0�F��,9�$�Y���5�%�Ib=�v���k�*ح� �yX'���}�3Y<']8��$6�x�s�g �Hb8�dќ���{%�J$�ÈK�a.N"8��:qVJ�8 �$�gps"��D�Cv+s$����ىM�a6NT���b
dV�Xu�-fHu�,Ff1��]����$�yQ����m��&N��`f��L+�9�P"�8avBp&#�F�gV� X �G��6���������W�o��V +x��| XTW����9�j��b,(�@���(J�#�Q�h�q@�1*Q�m5^J�Ԙ�x���v��!84�$jc��3�v�&�&�x��$Zl߷�)���������Uu�}�^�^�_k + +/�ˉx�G��9�hƴ�#������iKH�f�� +ة�YA���\�3� ���rΡ��FW�6��B�a�"���ԓ\� +��2 +)�Щ��r!^B���.����X��pv��c�H6�^�|� ;�� +�]��;�6��͘�!tɂ +XN��6�
+���ow^:I~| +0�$;� +F���-#�����N���jT���Ն�A������P�d��{zZ�5&̈́��t���%�kr�5��B������l���ý_Y������{�n˔��-;�'6 +�>�`悋G�oY�'���w=���G����1cR����� +EY�!�Z��^���u4�F�-����He��f� ']�{Yξ�Ç���xR���_�n�H�~�det'M���^�6ɮ�C�7�����ѳD���V�a����{�Ӛ���Zl�)AHUe��dR]�p��_�����K-+[���\��l�8v�Ȋ�'p�z��[�ɥ���0�A��t��Z$���C���Gn�I�n��yk�ڄX�57]N`i�a�C������RSl�f^��z�����O=����Q������K���)������Z|<�@�Ȉ����w�t`' h�{�Jt9�A��`�&�3ҥ谬w�"]��`��IP�NP{��Dp���{��;G�
�a2� +�L9�d�������k�&h�¿�a��ͩ�����ՙ!����C3�=(���.����B���p"J��#5%��3�z�叼6t�Ʀ���Ιulܲu�)w=���I{hơ���c +ݹb�ј����Wuæ�-+���V}V��Q7 `���E +���$|�"�P7������v�3&�u����k֬��ں�J�]㽿�����:��+�� ��B:$���B��Q�D���%��@��N2��́�����)亖����lQ�/����q�d�I)D��aƓ���TJE1y��@4�8_�5��G�ݩv�at�}v�7��#,�PaKՎZ�ʼ�#��X����h��9��.���w�^fĵ-��ԽSgC"���ĵ�T:��A�`j3�,�|���:M
�9�X��aK��#�>�Y#ٚx��xf�?�W��7D<�p�*��'�x�r�E.������7XuF�����Z�AZ��8��
�?�T�Ƨ��x��[_^�u�\����O>i����}�_�3~% ��_6Ѓj�?���8u +���$�s�8e�`�&�: �� +Ä��g���(�tH��@����)Ū�7���^+_����o�*2B��c$�(A8�+i�;����?Ό:�(!�I�Y�*+�I�,�&�i:ːӕ�$G�(M���t�4[.!KY�T"�O�Ɂ�V��C1H��4գ����O�P/�}��>�e�^ͳ��'�!�{C��Z �ó&�ʠcR��p謁�"�U�M��#&Z�@bmƈ5)"��0cZ�W։E��+�}���fT��ȅ��u�d���R�� +�rfg�d�f�e�gEd�V�Ut[%��W)�t���AΊ����Њ����� +W���Р�a�߿��ѳ��/ڛ6ht�Cs2^|�=#k�Lrc���J����E�?oY�W�\ >�ԩ�Y���χP��ƅ]aq:b+ҕ���ͤ�S��|����B@2�l6����)���ڵ
+���JRBW�e�7�����h�55�(ƀbjOU?��T-�}����T���RO6ܩ��-;4]��t5� +6��p��:
XgQ�괁��4[@|X-� +ȶ�IW.���NZ-� +x�;�9%Y�NBe��(81F' �;uz$>zY�uNE���2ET����p�"�����Mʼ���EY����=.��|4[~�Ȓ�dY�;��hw�$:^�LF�u8F�btBZ:���F^�7�:^�6���Ԗ�ԡ�y���\���D]!��
5���@Yȉ�rb)�Փ���6#H�B-�
)�ə7D��iE�� g +*���ύ�>� � ����9[&����}S��ˈ�G=��Q���ޯ���;�Y�Њs�\u/�y��qN�����9���� +���0�;�:�4YcPŗ����ȇ�C��w�|y�%��ߺv�=W?��_-{5�\�I�d�N��M1;�GjqDX����V��
ݛ���W=F��u + +�=�v� +�73O{Z��5��R����lNQ��]Lf{�A�c�u���[C +���s+�\�Y��bq�7��j������t�ڇJ���������N���P�P��f��^�w��t��ѽ�����_�vÆ�k��Є�3�\��ټ퉇�x��i���'�ND�Ȋ�P� c+~����[��y��Z�ՠ0�IUum=B�w.u߹"^ظg���i0Ё���TC�� +H����K�K>�����jr"�V����-O������f�t�D�
�R�\�]D�j㲹!Y$0RR�q�5�XX��i�_� +G������w����,�k��d�s�) +��(�����iĉ7�k��������-�A��[���[��^WZ����+��ys������B�h3Z�6F��;��G��Ǘ�1`���V�I-z� ١���b��%Mv�[�r�<��M���_+$*dGp�b���X��TQ\�Je��)1��@2X.�>��"V��mei�TadB���h�Y���V
-^7�v�p]��,jv\
˽����(yBBCŘyBCC�#B�R�"-e�ƪ���un)*$H��F� ]� 3�"�1��K�ĊU��Ֆ�7n����5#�5�S
ڨ�QLZ�Y�/Җ����KfdB��:b��>�&�MZS8���)��\�?%w`��s����7���;������y���k�=�O����ۃ��xv�0���` +ٚřq���HFH
i��ҙ5���|����(���@������S��������S'g�C%|�9-.�1j��Bg�C�ҕB�Y�N&)�n�˒l����֛S�'���뎱�@���Cp�왻05�G�1^�/칃��aw�,aI|+_ş�ψ��m<�K@���W)P�5�,��Ud���I?�"�l�1�&�Ã�.�a %�0�$�l��ŀ*{%�*=Fz�3�B:EX|
��'��P8f�ۭ�O5>�ڙ21�#*��~���.�&���˾�(8-oЖU��`֛�>A��y=kjjN�ľ˪F�ؔ���n)��<���~_ +��z���U���sZy�
�+��o�:{���3h����v�U���Z!j:��s�=u�L���P�<��l���PG��^Pj������X!�D�!)��ͮw�#T�� ��U��V��k��$�j�B����B�������pNj�w����ǜ�����3^?��o!����.o�T�~�^�����'�l`�}�Q<����V���|�s`��! +� +�%�ӳ�r�fP���d
644��Uԯ1Lʢ���Y8��B߽�{��Iuuv�yŝ�Sw��~]��u +bq�Z\$:Ү��b�54��.i�5������du[�v�V�����l�ɿ�n���ߘ����m;v��ܼnb}Aɟs>Fl��{�w���t&�{��'��YV�hy��G��>yu�x�r����<^:�)�T+.��Ѝv�����='6%��t���G�|^�����W�Pv��?�}�=Y�˿)뉌te�;������*+z^�U�J���.mC66,���.gD'w����gCVSLk�տۚ�*X�E�ɘ��~�}[���2 �I��6?rxJŞ�g�����}i�w +��o���1pe|=��N�̵��(� �����KH�0g���� +I��~�� + �:�SdI}�Hǒ�˧Z�ȼ�kjM��f���Ñ�!���!Ճ*�(AL���dIY�6`Eh�����MbpA#�����0��yXL%/ߎGk�rQ!5d�Z���51��B�KTnM����ٔ�f�KV�|�e��҈��0߽Ji��@]��T9*�ۃ!��CJ���Ⱦ}�5Ϧ��;�
�wl_�~����oi�����{|�P����/P����*�[T�֣U\<����_7��.#��$Kٲ� +������l�d}k��vS2:�+*:�N$T���r+��'�<<G.��d}���H�P�4�B�Ps�[<��F֘2�Sw�+�X�T���x�ΝT��q��f7!2��P"�U�AU$��AK���lw�����#0EJs D��~I-13~��鬇x��MG?x�q~�7 /���o�5��>}���3�|�v,6U�"4mO�q~D?���gxc�m�+����k�(�u�*���V�����B"��� +b)��t�%��f�ѴrM]��*Z�"���%D���@���~���kVo�Cё�X�fˋ����gZ./������.X�Xޞ7^��;{���s��x +&N%X���X���� =��:�Y6�f=��n(� k�xdBQd>�om��a�- +��v<��}MoԺ_����w +�jJi�-�EK|/�1�N^�'�����=h���a�u��-t��n��;�:�ɨ�N�;u��ָN�㝮�������F����h��� �i�O�|
����8���K�TCc�ڀi�'&{�� ���rH�n����� +�0��a:�ޠW<�bڳ8�wv=c +>=�w�^�����m�&ZB��^2P3�hu�
�
�`�����/��/�L<�'f��n�S�-V1j�cA��RGm���ش��F��Ƀ6�˽�S���;���A�L��0�'p����'A�#bM�����j2�<��Ýqd�o�����s�3$H��v�����f ����۷o�ۉ=" Ҽ!L��3e�*(%� ��!R,�
����x8(��Ⱦ�//b�%�5���ZtTܽJT���FS9"�J��Y6٫D��]�q8]H
�H�hZ���7�`��jG�7p���Ch�<nni�����¯~����G�L{�գ/>�c��X7[��ƗM�fT�;)��>�� +`��z�\�#Sz���5����P +[��q��)�� +���{�&�,��JS�?��C�i�,j��~�,��2u�qy�x����9�uN��~�����3 I~9�kV�{趞Y�晭���,2����3-Q��S�����&��w��Y7���ikg�}yF�E�M�� +o����C���̈́���5�`�?���/�M������+F�Q\���<�y~�_4�~.�����{5��x%���Yc����U���֞�KZ~����g̅i�AYˋ«~�?�oD�_�JCZ�E^�o����3 +F�8u�Q0���c�k90�`4��Q0r` +��K�Y������[_P<��#�Yx�O�"֟�D�^ ��jA����ƹ�^�9Z����?[W����ۺ�Z��;�C��:���z�8�"������R5�-��E?���c;*�?�v������c��~V��Z�j�y:b���\�Ur���o+��b�VuD�y*Nװ�6T�叢6d"п�Z�Q
��ro��H�W�L�맴4|)�i�-�m�Z���B� �K�c�K��4u�+�/��*�d��m�*˿ҿ8�H͢��V5,�d���¶��]'BZw��>��{����'8T�`V�E}�a�+Ĝ��A-I��\�
I*��ޥ�����t��d��ݿ��ֿz��g2 +��(�a��V9����O�[�Md��ɭU���X��D�6ǒ~���y�|�D�����|�Bn��ו����������w�W�ɗ��ؗ��z�'�"����/���\�K�r�_G�ga��&!W*�_9��ɧ�8ا�|� W����`q���p��i�h`���%N.��g9y_O.p�'矴����� �'oW�sev�����YA���MN���� endstream endobj -276 0 obj +441 0 obj <</Length 9/Filter/FlateDecode>> stream x�; endstream endobj -277 0 obj +442 0 obj <</Length 343/Type/CMap/Filter/FlateDecode/WMode 0>> stream x�mQ=k�0��+�� R�I�B�uj���Ύtv�$$y�/�夔��w����ѧS�x�ꊋ�s @@ -994,7 +1493,7 @@ g��7��քҝb}��9�)kנ�b�宔�JK�n=lj��[!�yo����n���@�%G� �J?�X� �� endstream endobj -278 0 obj +443 0 obj <</Length 380/Filter/FlateDecode/Subtype/CIDFontType0C>> stream x�cd`aa`dd���LJ-*��+-N-�L�
JM/�I,ɹ���!��#�C��A��A��B��<��=EFB��OVY�����\�����(��>W<�̌�l|ގ)�I��)�y%�%����E��% @@ -1004,123 +1503,199 @@ x�cd`aa`dd���LJ-*��+-N-�L�
JM/�I,ɹ���!��#�C��A��A��B��<��=EFB��OVY����� b��W}��c�3��w�������Od�����`�.��?L��}� ���w�3{V�N��#�[����zJ����J3'v���)�G�����]��� endstream endobj -279 0 obj -<</Length 5481/Filter/FlateDecode>> +444 0 obj +<</Length 5493/Filter/FlateDecode>> stream -x��=]��q��-�ں=y���H�K|����\N�7��8���}0���f}��=�ȋVҒ�bU�X��~���?���~7��?�t����t�����~����Lfғ��d�WZ7��T�!���Ϗ����/������껏��>~y|ғI�ǧe���ǟ�����?jm�n/?�姿�����3�~:�y\��p_�����i5���7qY�<C�V�X3����������ϯ~��տ����ׄ4�~�e}qSrE�`#K>3#�o7��oZ�-pS3֮yhW�̇3+ ���MK����1��y�[D�h����8%]���I��$�����ڌ%�ZGs'`�V.�"ɌVA�<��<�=6\��)�?k�-�̢�C.��_A1�����8�{�d+��2�?�쯻 tVXB8ˠ��> -���ʴ?��� ��9���0T�u -a��Θ�i�\�G��-�U�o˙�&��qG�]mۉma<��� -lh��+�!B�qL-�����:�xp]˱���ל1R�g�U/�ޣ���!���C�3�Z'�|�f��
�KH>�K���*��RZ�R�Z�Q�#��LN[���c����
nnλ��q���J��ހ9k�2C�ȍ��?���.\���m��tЅ>��QdsA��tB��=�+wC�u%��?1 -��6�m�58o�@����J� �OH�9��=NXps�����)a�Y��kU�6n~~�=��!�U%�m���CW$;p,B����.XYM�7;����ű<| -��OQ�K-d�& ��6��-h3�|f��캹�����Ʒ˫)xtV%G�w#1��j�^��!���0�T�3��b�w�w5mp���_�������������?=����_��}�*�h��?Lz��ÿLZ��'?}���Ur6L����V+Q�d�/�Z8ɥq�E�V�!���r4���OZ�`L����bP��[�j���y�zͱO�S&�*��+�]����LM2�IJi0�T�^Y㣘+�A��
բ�4�!�O��6��v�6"�Ip���YBt���(���x� z0��2q��d��A��$�'�9�@��L5�~���UIy�E&�F81�rp�|��{�?�E<�I7�|;e�o_%1��u�ϤP}�ݥ&F�M0q`S���f1��\�1>�>����1ހ95�'��y�-�$�c�
Y���-i��j"JŹ@���gn��q�&��>�ɤ �
�0�m2�҆���W�[7d��� {��TɁV���^Ԃ'�|�a�����6�,���tH�
�����@��Sb���p���o�%�6ATa�J�II9g��%pa8@��^E~."�Q l�k�����`^�0� ����Aﹴxُʤp����;,Upr���2�$'[���I.J�8��$簰����AJ,�݈���y��w�,b� -!Zps�'����́t���+�eVqF2��p��A��,�þ�^�HI�.YeC�5�/�t n.O��K`�/t��\pt��Cv\� M�I�@ ��c���Y��CG8ˋW��"�P7�2o�7L���5�>�3�>�4�ƅ�T�rd�v��O���i�[1���v���p�����t"b�: -�����.���(�61�z�)Y�Ȗ��5�<k�]4{�?[��I�FN����F���[{���AK�-�AMg�`6���+{W -�[@��'�X��M�Y]��Ny��3�'�/�4�NJ{��
/��h������d鐳��j�6RG��C!w���~��ؒ<��Sŗ{N*��� -�����)�B'-���q�� -~_e�p�c͖��\��@��+ل��02��Y�Wd�xG�h�ƫ���Qß�Yᒕ���nY.���o�*[�� -��:�T��Psq@(��i3�Hg� -�=��R�p�� _ݭ��� -ĺj�F�=��p��WY��flO<���ނ�z����A�d�F"^�<sAI=Q=�"�m���[8���m^���Nz~���݀��j^L�*gmv~�o� o�T���L���z �@�S����T)Z~�]6�J`���Mp�� -�H��kE\���)w:W�\��?�-�
M�$��Utv�i`��H��?ۀpj�\�#�B��",I���G!bT!�9X�j?� #h���>}!�X�vue_U�U0�Q��*%{s�c_]��|gC��Ҧ�����P��vh'�� �#���X�x}�F����cO�F�{�B������:m���@㽿S+%�ZvJ�l�vۼe�'����EYg|�2ۑ��l�"LbLj������v����^20��F_�D:���s -) #�x>�6��^N�%5��>��d.����E��W�kZȷ[5���U��b�(�M�{b�0Mt{����eI9Ƚ�9$3��_��k!�_�2�d�E�����f�:���Re�N���+���z-�Yr٥�h(#g@��5?�.CZ��Vx���Ƹ +x��k�$7�����\n�����#@.A%H(���!wb�p,B���g�{����{n������r�\.����������_��������__��x��Ͽx��߃���;3����
)&�c~x���{=��Ϡ���?>��������`�����w�x���^}���Vkspv��^>���_>��3^>�����������Wus���h���M��l���5�Lm/[ +���緿���g|���o4�~�e}qCrE�`#K>3#�o7��75��pS��.y�G��=g���������1��<�-"|��Eku�.���$��Jb�����ڄ%�?�#��0�E+b�xF� a6O��j9~J��w&&3��o6�����lbk�#�p�W읮�9.�z�yg���c~�I����Y%�P�0�͓3�gw����]�� +挸���b����ԟpI�I��~u;��R�9O|�4UL�� N�˭����N��}��̦���/��?a�q!
�\��
����4��� g� +%l��?C���e���bQ�4)h��{Pw6�fi��`y�P7�79txر{�k�Q���(�1,�ч +�W&�s��cʺW���ijn�.- �
�&hUb6�˳`��|�Fծ���;5����P��z1E0M�+�6���>B�.]G�H�%��39�S��Q4Lkr���E�s� D�M�dj!<
D�ʶ�� 48۞T�n֣�JF���*9��y'�9/� +�����A�à��7���S��=��U2&�x�ͺ�JT:���F�4�?�h�*3��<9�K̭�|ҪcҠ���Q���j<k�N�n� +�rIb�y3ier���63�/�j¥�bۭ�f�क5y&��4k�J�ɠ������)"6�䶇Tc� �]fu�!�.! +!{�_މp����}"�f?$�%�`�;��s\�K�9bY�X���#�J��L���F��|+����FG-�d�ْ���wU���W������b;��QeL�N��w�(l���·:Wo~N�\i�S>Es�%��k'��������c��Ӧ����#�إ�)S�a�RW�%����x'ѽ䀽����w9憳�h.K'>�b�U���UZBQ�R�|E�筲v��9�-)�]�g�OgM⾅܆� �!x� l":�9��/:
�H�����Eo�mhu���c"�s2�w�����*Б8�c\ +W�F�l`��%��`��~����v�.�;i�N*f�sǦ���|n%lm6]������<|�wf�"J@���y�Ǫe�_0E6�䒈P��+&�o
-g"!H�RX�|N���F��d�T�uSB���ծ�����"#īF?���4�n�N�/� +{6nڴ�r��kr���WM��v6^Yg�UK�YXdy3{�",L6*�(��h�h�Ū��N��Xݓ���vU$
���[w(���� 0��ͪ� ��#���!K������[�]��yRtrM8lUp�)��ϼ/iJ}��U�, �'v'�sQl�[���lė0zA���Ǝ�6�Ey���.�ޔ-��4��*!�|�8�6����]��Ǫ�Q"(TTk�0˥��)�J�4"R ����6AsX���v�Ә��{
���@ +wꦣ��V*n�D��iDZ#���r6t\��4k|'��^������:V�k��S檺I/�H��~��E�P6QSt�%n��� +ܞRqM�`�f8h���)�hT������鄚<V��k�
�(��S�h����R��C,xwH���ɩд|Q���]X���Z���W�
TA�J�ye�%��w;������:�P + +r���(Q�U��٣v��´��1(�\�X���2���y����"},Z�P��Kb��T��}��R�����|�8(�{h!�;��%yϷ�:Rp�Wk����T�3�T��:�l�������B��Fxú��ܱJ�ƱFPr��*�����Ī�}+J��SR&۱�
��H_�\�*`��h�����������s'Y!/T�z/{��S�S�Wa +��k,����x=�]mEƪ`��3I��8��
�_B�U�lW2����W�[��8R��I¨�Zl �"J}���@/�B̄t� ���`�U�d#>�-�����x�{ճ��a�U�eہ]_�k���R��Z����YLKZ�����f�]����q +DԗKʗ��Ǥ\������u�� +���+"��X��l�J>x��J�*.�y��������`4j+DR�-����{��S |Vet��3/�AP�&��}b��6V/>�r�5t� +%��iK�^(� +��*��̓���}MP��`o�q�H��'*�6��]�7��'MM9�%�N��&�K��@T��|��U�<��Z4;���t��?�j�ZZʺ�d +pR|��OFCB�NY?��ODp^K��_=B��n|�`<���蜈�U�6��S�+���?��K"թ����� 3h��� +9���mP%���)/s�����u?�2���T�!c�������a�aN�Ht؉�Ak�>��p����No(>�N~옧��8^���t$��9������`!0���R
O�;�F_�����B U���>;��^� endstream endobj -280 0 obj -<</Length 6543/Filter/FlateDecode>> +445 0 obj +<</Length 8031/Filter/FlateDecode>> stream -x��]ݓ�q�_��%Q�8��0�eJ��R�ߢ<�,�+)��ϕ��O��f�h��KU�喼����ݍ������ի�^����|�����I���:9�Hw���N������<���I������oޜ�����<))��������͟������?I�O�ڌ�wO�J�?ߝ>�ޏW��O���������0�]���f��r\KO�tg�_'5����7�~G�u\-{���:����^�3:�������L<Zm�F�Q<��,pӿ?�������Ǟ�v�<m�=q��?���ٷo��۳ox}�� - -嫼�Ţ��J�ެQ.S�Gd)��(WЬ��{09��U������(�V��a�I -?|Jw �~5r m��=d<QH�:�B�� v�]$V
h��ٙ�����WPN+���J�V.�t�Enih �eQ%b���\O&�����Jպ�6�UK�U1�(���["0H-�3��^6�����%���Bi��m��K\0BEmlO��@X�b#۟#��K`c�Ю#ϡ?0QO�ϡ?�FX��~��Y��U���E�e�rP�x#���`��/[��(@lt�>��i9��(a5,�9cM�*:������v�OӏA�f���<�I��[:zw9��F����1v���'}`�+�փ0�9k}+`���u%�nd������(�\^)h!M��U<��K!%�ꮷ?y�u�^��:&��.�f��b���4\�ћe�Lq���r�PA���F�q�M;,d�'ß��d��9O��- -B����
�[�bҘ��V�l��;R������.������Ƞ�w�RVSq�B�;�;�Be �[��"�bi\���P�Il�i�D ��� ��ju�ۗdN���!��͚E�|�ِ'9l�S�߿���g?���� ̰�k�O�K��x"�ݍ��r6Ϭ�� -��xFL��F+c�n��k��[L���rM� -|�{�ȋ$�9�Fy>�CQf�J��d3��'�� �#�X��Tj��usV^��J�s��f�����T��H��(�7/��`��k��/��&�[b���w?�E�n����0A$��-i��r���Ę���)�>�rfE�{�U�]�_d�BJ��RԆ!��Vy���\��B�E����)هݤ���&�S,q2�Y���^�����dM�HI��� -�~y���p�n^q�)�0�@���efr!������nCNp~�P����v -�:�9<�xR������q�����ށ�G�a���K7{\��&#�`]�,I�D�4\���NQ}` -�).w-2���:�#��ϑwf�_�<�C�{�Q�c��&ݣ�p�U����?=���R7�9c�{�TG��3�0���fVd��kP���k_qD(A�R�C%��A3К��Տؐ; �iz�;�Ak�zRH.��V�İ��j��!��)��� -N�TU+Ǟ���bp묈&�o��$H�ܻ����f�e����b�^א.2
��e���dJ�2�����h5��ys�����5�G��8Uo�`4�T�3ਙ�h/-+Z
�4'�%���/)<x�~y����������<���� ���ŧRA&p�����8�� -*Y�|�z�T�?��0$SCm��Q���f`�7��>��a�b���(a�%C��5�VAX�\�hP�N�Ӑ�E�[bB�]�6jR���sM��I5��Hm���;����J%D��K��� --�¿9�B �S���r�Džd�W>L�(� -��dNN�S��>��`80m�a��C&�Z���͏�s
L��D0=PDDE�*Z�iF��`:� fu��+b��"a�&.v��6���%�E�9��+��g�ft�F2Aiu�E_*v���J�R�3b���i�<�V㋂��B�*"��1� j2Q�rZ�ܬ��\+�3n�ej�����'��� ϓ�H��j.!�Eu��cI�)�S�rt|���[��L~b6O;/]-S��s�5å*�� ~��q��W�O�9'u����(�����"�K-P�����)b���� Z�gb�T:p��(<�
=&}���_o�;����B9�C���, 1Q*Տ5/�N����yQs|Ю���ÔCEL������Wb��Z8P*v�;���@o35���2�bڍ��M�vZ�4]%D�JD!Ay�n$�vfN -܄�F�#q�J���CO��J���!b��<0���Ü�9}e�냳�w� -(�d&��$Z��x�H��
i.�*��� -܌�+���
�}�o7�{F�j�hl�zYq��*a��Z*f��wѮX��.�l�
�1}���\߹�h;_8��4��߲j�y���3\�~�\a�S|ᇶ-���\��%�q�,�!*�d��{���˭�#h�V1d�kS���zr�j��}�v�A��q{*`�r`J�W/|�1p�'G+p{jF��J��j�������Y�.���Ǖ��hK�*c��I�M3)R*�w�%��m3 EK1G�ej��R�����sF�8 d��qL�^{�4ڲ�L֞��RGP�œ���!\�$&r ��|m�d~�aV�L�Ŋ��k6(-H.�������M9�9�e;�3Dq��]���7���s��hT^d�z��S�K�s -Q�w��3� r�w3�dх�� �횤B3��*�z80�SE�mܸV:�N�e -+�aj�.'�}]��rw���,�P6���3��﹙���w�z��T�I[��)^$���]�Z��Ʋ�;9�����+���h������'�h��`R0}��ዙ�y�⎪�/�9�"WM��ש'�w�F��H�ڄ!��`��g�銱D���4�rM�T��f�3�O��m� ϯ% -� ���nwM��Fi��
�[<� �<��#����9L�V�9<R�vlD�Y�]e��Z�P{A�+�B�;��NMe��m&�U�����#������M��4���C��6�l����D�xz�|Nj7p&:��]���^�
D#��i���p&��qH�HPm76�KJ���0N�_�
I����07���
-�y�;���!y*�l�!.�
�s��/��c�jV6�X|�t��g�� -�C1��9D�7��O�S}�i��^|md+:��8��FO�%���F;�g1>PR;' �`��컲����:�D;��N�-`�Ѐ��^�F�he�M
��4a��>L#ɪk��D��w�����K���/q����A�X�"˞\����#�F&�q&?���K�D��"~��n�o_�ar��u�v�7�� -\q�P��B���
^7~+�;���\-Y�y�zs(PԉW -��K~�
!=��>��Ƚ�LĪᤌ��ew7:!�DLd��C����^5��� [�ˉ�H�֕ �!���A!]ƻ���w�(����=��uL%��D��&�p���qM�W����
�K|�R<�)��p5ʥ��Gq�7Ԃϫw�c8��T�y��̤�Q��a�n�yPj)���Pjb^�qQX� -׀Ce�s��d��G������a�Z���fy|�cS-g1���������X:b��t͢�v�̿]��.oML6�����SQ�dqcQ)���uM���Lq�QL���es�>�,�dȰ��dMXӝ���`)evrV�لuc���?�u�h +x��]ݓ$�m�_1��ӭ�� +3�.??�������֥x�a�����3��о�n����Ĩ��t0?�n}����O_�����y��%��~"Yp�_�ܽf7��7���sc��&w�/q[W��^�wY��ϗ>Hb��~��>���KQ����D��6?m6!�Wi){i�pQA���!�U�� ���{��i�\��}����1Z�h4��_��Gq��k�Rir6��g�Bm�6��wg�/C���w�_��ǧw�*i�ޖw��P�h^�=�@���+ц�wH�tjIJ���5�������sF��s�b����%�&c���-���y��m�'����Ϳ�oX��O����T��I���*�Z����͢2)Ť�����?��ЭK��ά�U���_����%U%W�OYV��q϶�%���E +�g>��Q�<E�'~��ș�K�PH�~>��_��� K�7u�l(����y�sø +O�K�|� ��z�E�9��"���6]�V�6�iG�Z2"�j쉔D��5�����y��Y�v1&g+kW�
Z�4����s{y��J�>�NO��i(��!�rm���
����r��*������2#� +=�_�������:u�[��J�,K�� +|�?ip�#����豻èɨ�P�*��w�Hc�C�f�1J�x���'�o̾�yI�_�ug��B�3����X��r����bϿ}���[�">��_����WF��a�mY��Wq��+�xA���A�Ο��_IM�50i�B�O\��]��=� �wܗ�K��(j$K +�5�ڔS;\-�VR0��Pj\PK�^�m~������<sc�X2�G>�ʩ%f�Ь̎V>��`�i���!��\~��9�� +�Y)_�e��g��~O�|ꋼ�T*�F�Aɶ��wr����]��h�Nƹ텽y�v�P�&������eѦn�#��v��&U:n��*4���U"��\GV`�V���M���>����U��%�:���%�L���z���E��R�%%h�pT����ʙ�J�ţ&��g����.�Ja��=5;1*oM�~�d�X��]�,�_M]lsc鏩s��R�>����0}�z��D� �{>_t���B�n�`��� +�N���T�/�R�:�֨�=B�{����R�
+�1���+'ʍ�y�fÉ/�=�"m��uL��UB�g���ڃGʚ���W�gܨ����Em�h�݆P5i[��&�£Z�F6z�u�_�m.��$V!��y����Qr8��-� ��V+g��+�b]���QZ����v���:��5�<6�]\�6I�k�����N w���0��xvKz��0��N�R��.�A��(�"�P�xs��o��(���O���K����8�l�8q��������8��[�wxU�i����O�ك�lj:(���\�)�!��\�~6D��٥9�0���l�ig�&g.��R�7�A����xQ�52Z�#XA3}WoJ�Ђw��X����W��`��P�-ѬPXlk���6��A�1��
B�����Y����@ӬcPŨ��gȚqǤ�9��q/���f���cm���jf��t>h����K�B�e���D��ki +}T#7Y��m���MZ)Қ"���*���ţ�o}fO��3�MN�i>����1p��6������Ҷ��e]*E���#�= [[�N��)j��ğ�ohk��$�|J& �J(�*/��r12�x�c�Z���\6�'/H�ыa�F�� + �ex�)b�jwMT�=b2��K��>"?�yi��;}�� +�mO�K��r�f9yr�$�~��Bz�����g�I���Dw�t��#<�3�F�M�UW.���x�R�A��ZU�
^xkv2u�/�u8�ub{�ɓK��9/�Z)qp/��R3'0f0�$�����:tD��6!�Z{\f�1I�h����!d���ݛi��XӂW�F�03_��=��́� +������>&y��zʭ����9�I�%� +����Ned�tP1��4߆�E�nǿmr��.t����N/��Ϸ�����mp`#þõ�3G]Z���^锰I��z��Ir��5���(F�1�]�=��j�-���� +蝼�M����;��Y���y�{$g����T0{�_fߴ.��Yi<wך�z \��aGe#*�����:Ѕ��(���!�y�*~�L�μ]�.ab%��U�O�"I�
����(��N����[�ǕϛN�n�L��U�o�Y|��c����H�ywAY��Wdo%�@W�*h]����SD��a9*dר�ڟ&�8�ä�
���j���KW�����|�����T^S��7����� +>�`��� �}��d��4����7�?�'7~�0�W�5�̳*CZ9}2�U���m���
�_l7���V���r�������X�ڤ����vV��@��P��q�
I�\�X��_�O����'&��/��/��U�h0�?i��5ӯ����/e��E @�u��5cI�-�[��m�0�:�\2�gm�F���;�U(��+�Z��
,�&��'f���U�~jgw&�!z�=��H��`�C�
e"Sࢲ6�qw&��m���|��ip(/�䧏�yLÍiY˺���� + �ɦ�$7���|���N$=E�t@��L�P�J�:w�{�2.��\��Iʠ���y��k� +`�Ih�P�ז`*�Ҿ�.�[�����6���L)�Ql��ؤlH�k6��LM��S�>v�0r��q��U�T�S�b��Y� +�MY�q<O\;QR uxNK�@ $�'�G$�@;et�a(?�� ������~)Ӽc�yC�u_�~�Ts�S�b�jXg�6ɓ_��`o�4�d�s}KՄJ2@�(0ա���KA���MVml��v���P6x�,����ag�{l�5�����ZU*,��Jۘ`�|�fQ��ho������[��<�YWW��r�o4 +��XaZ!�o�H5��|�
�A����h/���ցN����~����Ш�//W����Y��̲�$!^�#0����Ud +)�8����5Ө�o ȕ�����uva�����F�He�F�!ܽVZ8�Ztp���J랪ɡ�Jj�Y����0Z������9?㇂.A'(����
�dM�� +a]qe=��M���.��&A^��+�Hj��`��Gh ��96����5��J��Nͭ%L��j��
�F�ŠU:�R��IIل +1���ڴ�R1:��1Y�g�����ت�(ƪ��_�g/��84V���gP�u� Myy�`�q��d]N^�ˌ���E"���m� *�#����6�dQA{�&���� +�i*����wU��X��@����R5.���n��ZC�,H��(�°����4e!�]��/xd�%�j���6|@�����>J���_��c�A�(��i ��$j���w�� ���,=w�ln� +�d%M� +���:R�cD���)����g����s��k��=E�U�jk8�LC7z�56JF1
���`�V�����wc2JG3e� +�����2��\] +:� H����5F�nΙ~lk�B0��a��D6x)���f��B��O��R[7O�<�to��������M[�$���:亾p���z�0� +�~�5i:�)���{ +���F��J^c��ԇ 7�H��Rl4����R��D~�ѥ9��v�>�b�v�F�#B8�� 줽$�]"#�Q��bk�d�����w�2m��&Zt���3��m3) �}�i�$��q�8�L����MK�/��"�ܼ���c�#f!7Ky���iXr�"�� D��P�5SL����u��Z[q��0gj��X�z�X��ұL#4�4�Ʋ��Yo��k��eZ��N< �¡Ҩ��¡�.���'��t���~�e�� ���� ²P9dzJ� endstream endobj -281 0 obj -<</Length 5457/Filter/FlateDecode>> +446 0 obj +<</Length 4629/Filter/FlateDecode>> stream -x��=�r\�q���!��M���V��j��*U��[����L9��m�)���uf�`���9#�upit7}C��o>=��Oo���?���?��O����_}���gٙ���ݝ�E�\�V�]JE%���}���G�{��N�~|��;���o;�{����N�SE���>���<{������\̪���\^G即_b���.�%�V��`a?Y�).��V%�vz�t>+J�b�i�L :}��b�J[�v}?����7o^����wO��6���9���;�����g�}��݇O���hvN��_~�ϗ��Z�^;s�m�������_L?��p���߿m���}7�4��7���_���@������q�o\��L?�����o�40�(
6�߸�����#2,��nlV�g��^3��~��7����.q�C���;�_��j� -���Cu�%�N�np��8�7�m�+r<���?=���?<�H��EeB�5K�0�b�}Ķ���=����W�<t��|�_{��~ڈ[�~5���~<�2�9S�f%g6�D�o�n�\JG���ͻ#�S��*\�P�C� -��}���_a&��*S��]��Y�ٛ���f�!U��
Zy�}|I�T��U�U�cⱞZ���O3�e�f�:w�� -�kBk�S��g0w�C_1��T��W�F -�E��'�q���H�$X�Mr̻���)��P%��M��Х���}��d��f`��!����T��{�Q8�v�%�K #����ІM��r.�m{a`j|}/Ծod�I7%(�;��pb��&Oy�JG��æ�5A�0e�m��~s�����u�@�֍
Q9si��
.x�ئ�����}�P+8l/�JP~%4���I52q ��p���E�>�S)�L@NoK��i�8����#G�rVEV�_
��F�tVWxUz��k�}70��(ʓ�<�O@EB��,�����
Msb>�H��L�È�},���z���k�(��C���J�@�h�.�U�-F���)���[lѕ:_x��#"#�;e�t\m��2O6�[E��3��ZOWڹ֝^ߎ� -��ۛ��/n����D��Oȋ�g�7�k�P#��#9�e����DFa����EKqLY�"Z˙�!퓡N�$�f�-�»�#��UO�0��#� -�1���uc�G�G�?<tw�'��Ā�s�l��<gLX��r>/U�o�iI&h�b�¹K��*���NZ���?��d.��A�!6���xD`�0C�� q�T���}�Qb2R(RVJz(���������ε5�ta��Ȧ����$�s�������6�0j,�KL���#J)[��b�n�������I�^��������l�"6t6�����a��8�8@o�4�,�/��T�C�o����Jd1~�,t�)Lc -���~��*��.��۳S=�87U���v�=WK8#�+7L�Q.���� -�k(I��"5����g$Л��('���lv�(�E -�}��g�u8���p����%�̥)S�����Z��Ϋ�K��6Md?Q{f�Bk�n�Ze��� G�-���atФt_�+��l�!�eP�*�����"�>D�)4C��t��G��5�� -� -Dm��a��RO#�ܰݕY(��kP8J��[�� -@f��� ��� -W���:2iV�>�cQr��2��(>�.�]նZ�¶u��t�N����vJ�����!�Y7�(fu�D�\��Hɩa�S1G���s����*|`S�jա�ඥO�dZ4�hI -_�4t�:f��uӝw�NR��P�eK�y��+��v� -gJC�r����ݚ�D�Pj��߈]�� ���!��%57��lq�`��Pl��P���$��g��I��1�N����� Ӭ�p��+����0"G_03�K鲫�A��EtAb����&4Q��R>�y�����7����7`���fl ��Db�o��53���EQ�Ws�2ʁ}*�8C� -'�m�֣ -�W� ���7l�uN,�r�ϰ1E���?�^A�_��Li���X�ʀ�hRb>���;�@Rn��Vm���sX�2��(cM���`�K�#�cs�m�'P��q�,��呙�`j w��8E3R�����IXT_����%���+o|����u{J�J��4��) {(�N*�dG��b*60�*��J�\���Ĭ��i}=�m�K�c#ܘ�V��i -z�Sd��5%f��[�I�A/t����t+#���?a:��M�ib�Ѝ�re���HW3}�ΰh�r�9�L�;P��iӼ�Kt�{�"B -h��kɒ�l�WFg�����KK]~?3%̎�#j��! -P~mT��j? -��>�E�}�+�>@SN��M眻���� -��L\�pQE���[�1����Kuli6 �04hd<����ߞ��
Ǫ��աjd]�G��P�C|�����(~Ϩ�]D�FO�hX6�]�0$�R(�im
/���p4J�駓� ��Y�$�5?��س�B ^��� -EecX~ֹo��r��Po��㡍��G-g�
(=Ե|��>��p�8\[�j�l�=6�� a�m8��`0�vZ!��U�9�-̺����f~�J��i���3?+�U ʸ��K�):ӳFi�#��h��6�8�]/�`cF߰����.I� s��u����j?�����m��r�ش��z,�FS;X�b�z*������ES�H��L?�l�p4��H��56�j_�z|yMN>�z��:.{p`�����9�)��e� �S�ק-��co5/��}��J��E���4�<(����t;tи78�=� +x��]ݏ���_�rś�����E��^K�-+����A�A�x�S6���l�X��N�qw/ӻ3l�X,��E�����������7_w��/�����u��Nwϡ�GԾ�(��u������t����O���tw���NwQ���n~�������i��i������>yy��?��|{s�$ +*�w�����SC�,�AyM2~yu�g�IS4�P�\8'����t�*����p DEk���V��a����#X��W����6�$�4@�=I�?l� +�S�c�r����D� +���N�K=�
EGQ�|�?n,��IC����1Xw�M#���y�����������ῼ�������ߟ�Bn��;m��ˡe��o�./[��~� { -�`fu�6�c���{PF�}�?I��J@>���8Z +�y �_jC@��� �`@u + �9�2>|�d-��A�_�-,q!)0M3D��N�^�Y匏ͰvU,�]R.Y̓Z�!N+�MBp>uZ�G[:ü_����x�>��c�����)!CR1���=#PP�'Ƥ� ��2V|�*%���u���3yQDá��^���$���%��uh�Q���h���ı�[S���a�J>�.�~�2%��Fpo{I��ޗ��y�ɛ�+�J��+t�77�]��W-�2���["����:�� p��<�ʼԱ)��:�"�v3�M�\m����)Tt��0�Q2B��?&U�s�(�����Q���Kɾȿ�\�܊�fO���f�f"��̳���\�<I�� +!�=B���f��\��нB:�8é���^�@�B��T��+'��4��Z�k�K��r��X)ʵ##���S&�}^'� %����BۑL(�DU"�I2a���%ּ�RTmGV$)��Ʌ+�QvEW�&��|�� ����"qLh>E�t0���3�u��j�|��:qL��B���r���UFS�u�9�LR�;�0G�VYD���U�� 'Q�~�țL�[�`�>�Tm�k!��8Yǥ�eXO +��4�B����� +1k�J��`����6��G�$d�e�Wj��M�q�nx��M���~��-Os(�!I8,�U�C0�g�'���5 +C���=|�m������$/t��{�
�u�6v��';�䈶ϖezd�g��Vjc�U�hG�D-%~4�f�F��k\G��/�'/Pr��yA��$Vй�Hf�F����K|�
]C9��o����!;� +�rف3��%ùX
�K)�;2#H� +%'�gb��k�; +��m����PM�" )J��;r��{�U1j�ɐ�"���4H��V1Y3@�Ms�(�X��b���An/� +���`���� �:��!�\����B�qȑ���E�=��U��]H!�Z�2�j,���P����{(� +�<�b�8�O�V%�F^��d˵�<�>�"M�5ꬲ��,Mk��3l=��̈́��uL��&� +A�&ayf/!�l�C��
KI#;ѧ�����V�:
`�S�a���0YJ�Oy�|���3���R����`��A�FI~_�Ի<U��1�U�h��vMY�]�A㛦�61���l��R�h��*(���z64���s�L*�I���QMf*�2~�����a�8���CFCUk�<��9/���0����#W��(�~ b���ͺ�KlX���vX��A�a]ŎUk;P�|Ƽ@���R4�����.@8���V��.���QcBC��p�ϤqiuR�Ga�v`U��q��WfBM�(l +���m�_�h�M���D�����o��v)h��2�Z,����<V��l +j�MU͏��K��Ϫ5�1���*2/�=�E�$��Y��쥉�<go��K�1{�}R�b;JT�xÄ��@ �,CF5z(0A����U�N����L�f/�[�
j����V�R��rR'%ս,�UH +z�L�s��xV�,�B����%�[sk�\��ĩ)����:QGL��e����u:�ё�]J!�y\l\[�2�0����ڠ5,��%/��ְ��n>����#G7���-L�.��}�Fa�"/��'a=X�j`0W��AQ�bsL��0���(��>�*8d�S�w��t)�0�gr���@T)�0����59Wx:��;��(`}J����Pt^</@Q+�uth'���L�SHњ�I�aHVU�f�ϵ�%I"lU�?wj �*���A +�N��5�=\�ԕ���L/��_qI�)8�M٪B�őFsk��Ӻ��; ���u`U +��ͯM:���Y�YO5Y[� U���S�U:������b$�lT��#>%ck#ͳV)�+��O�m&e�[�?�q'�\Ek��C�~��� +[�O�b��Y C+�^s�p��^K7�O3Id����!�(�?�R�� �(N�&�x���kL�nk�Σw��s�}��܊3Ϲ�&С�H��p��L�-]��s��M{��ݫ�f�"�%A����?~ݐ�#��A3��>[��X�:�J�S��#��K��㓊)蓷�Ҵ�Q`$c��ȹ����@�� endstream endobj -282 0 obj -<</Length 7310/Filter/FlateDecode>> +447 0 obj +<</Length 6456/Filter/FlateDecode>> stream -x��=k��u��+�W���+Q|��8VlGu�,��[��Q(��V��G1�;�<OrvV�-|���������߿=~�ի_����������������`/�!{��6J�&������o���?����?�����~x���5���������������ڿZ�����>����ן���m�}6��!�S�e�pn�v�9lȰim]hۋ�O�Z+ͺδ��V�����>�&a�k�e��06" P���K<�;�5��)���<JB����p���|m�W���`]X�M�~��*���a�-�]���DWQ�i�V�������7o?������ݫ��8���jB�R����<�s\Ѻ����������� ��fS�-n -d�B�q!���]N�ʐ�d��(�d��=l�r��(��~���?���{��B5)e�����BZ0D�s��А5�'oc�����qΦ)����߳3�Aj����t�L�8�C�Q"���f�{��Eh��|^:N
���u]�za��"�P"扰��7�*��)�X�Lxʎ.;v��\����X�3Epd~�a��� -Ժ�}1�ZWn@�| -?�s�����'`�Qc�]��K�h"Ʋ�-��#צ�v�6�|:���Dg[� -�@|R����H��$͞l���ֈz,����:@���TS��&պ�qܵx�RM��-�tQ($Q8�;v�A8�n�d����|˂�?��w����"q+���μ�ʖi�3��q�$�S@�*�"�Ѩ��8`x]҈��Y�TM�\ڡ�b��'�|� ������$�T�)"����!Z]+ ���ABB; -�,&�q�!��q1�dV4���1BITN��j�I0�y���1
�Ua���\��f�&m�5�|~��aa8���q"4�rN����4������{ʡ'��(���vt�Y1Nz����,���Z�2IM�������U�5��M�9��ױz�"Z=�ȓ)>�x��N1�d���ut�ދ$с$���h��R����������99�nY%dI^"��87�m�K���2�1�8}4u*%����Ϟ�pKwx)����W��aP�j�
Ȑ�����$��X����'H��ʼn& -��*�I/4��0UJ��8EM�[����{y�Ga���<@=�*��nBqj�@
��.2�l��FL6�z'�q��o�E����\1%�2p�u���>/!�28��C0֕+L��m�K��R��*:|�V蓱��tr�]�G��ju2>Y����k~ ��C�R �mm[mA6�@�Q��%�����r��n�!�wU�G�f9���,���=�'v'\��ӂ�ح���V�����'�SXc�_���IN*��r���Ѩ�v�o ;-�j��&yJi}�|kX���K���-������n2��=�%~�c\��Z�'gj� -U֊v� -��#�j�dqn���T�Ь;l���U��Z5W`(�x�7��z�i
M6�!7�����FŅ�F��~��C/BO��VK���w�r ��k�}<����dJVƼ�8RH8�����
���92��@���ݙrx�|0��4�La�\ޢ���d�q1���5�x� -'�:�ѠI�n9�]��4�o1~��>rio��;i��>��7�X��wr��d.���0�a��] -�W��xRz(�`�v8{W�3������`���u�``
빅�\Rkq�w�rA��a�Ը�F��!3�t�U6xa -��g��(\��N<3xA�'^Q>b��u"���6�%�7 ֧����6�S01f����C���Sj5>��
@8����I�ej`�ow��o��#5�jJ�Sy^�����YFO���r��D\mqn+`1:q�f -�|2D��@8%%��2��T�3�v�&yWn�������g[�'mI������nsH@�w���U�);����'W��Ͷ� gԊ�J�wHO�F���1�/{��4a�ʞ1���
�YR��0�5��/:0�$�dSɸ VX�\��}M�]<Y����P�:�<x���`���)��^�I6/�+�d�k�)�M�K���>�n���!��g�R�:(��� -h0>���
R)M��،�}21�O4�N���a2�MS�.���LR�Jh�F�r��\�gn��1�� -�@�Tuf���A�-�{��H��{�~��~8�M/��§�U�{�J�ؔ�u���h���9SN{t��Ѩn2�Zg4Q�T�����bz����mʳT/�Z�n�h6Y�����p�~�V�V�Qc�V��*5u
D��Q6�-�+W�Foc/��� ��WlP`��B��j�=7���>�p
f�R�-���� -U���y;�9j!ws
�)հ{�����!r�3�ޚ�B��d_����Q��7��ݨ���tq>���JQҾi�3����i����B$Q���[�{N$%Z>��5W�7��n1������"�s�:�Hɬ�'�������m�RHU��]�L�e��K����T��R �N.�u6�[I�f�-��Z�}S^C�-䇙Q�+FNAY�!P@}��ы0Fz�-�2֒�����++qi2� -�P���L,�z�Q&�k�éh�sB�a2%�\H��2E�
z�+�3P''�v�d2"�H@AW��������h����6|'/��O�vJ���?^�T�8FjBMq���U����ڊ�qL�G0Ķ:�%��L,qW�^bZF���yʓ�3�Ԡh��h��X�&����_wI�Q��ee���l��P�������G��ͻ���w�/��k;��A��K{Tu��K������z�80����0��x��þǰ��e:ϼ�e'��T�����x;���y�o�AJ��,���=��o
X���ʡQ�+��Y��8C������Zqm�qp��zo�pum���W�Rg�y���ٰZ��&���j'n<�n�w����"ܖ�~��8�Z9����F�}h�q�7$r~�[��� 5|�<������������<~���u�V5��Ql�<�d��$5 -�Qk�A] +x��=ێ$�u����j�-d8�_��a�Z�Kr�[��� Dg=A�����<7��z'/3�S��;o�������������n�����ߏ��ջ߾�_s�}�1�h����xH��dS���~��I�Ї��{�����ߜ��|ЇPT���/����y;8��Qi�]�E&�E��ɂ�������2y��d��؛�'�J0&���V.ƍ�}�������{з_���o��p�ӥ���Z?O��_��^��pЇo���h�/��_~��7?h���>������S��v�i�~����]����[�����/��@,ݠ���v%�l�N
���g��>��"�a��rn��m1ܥ(���mYy�vW*`Yh�ƚ�|��\��L/z�����>�<�3X�R�����8�߯yX�%9�GNZc.�5@U�t}�E��FŠ�~R[ +���n��Ԩǩ�h���%�8g:�� +%l&�ϫ͟�5d<�x�-:; +�<Î3�*�紊Ɔ��^H _X=/V%B +F6�bu�A1t��Qc����!tY��x�@�WIH�8 ���D���u$V<�l�w�f�jj�W�L�[i#�9Dh�;�8.� u��H�a��!l����0ʩQ1z��@���B0h�Zs���(�Tr���l^ɕ"����C��e-��o۬^h��"���9����P�X���̀�5s[2��������%�?\i�����ʛ��~���y��&�S�e]�ѕ�^a��=�U.�r�="O"���ӯ�|��Z�>ɶtP֦��o�t�IYY�c��=�E��@�s5Gz��L��&��t1�.<x1E6���7��b�oܚYs��R��l0J�21�.M����L�tt�-.{���M.�$S��^B�gqjf���_)�9��t��qӳtBR���(���J_�I0Ʌ%�#T�^�������o���l�.����Dv|I Dq��������v5&�i�dS�*X���pk G����ď+��Њ +:U�c3��P�"�Tjx)Rջ��n��%�(b� �↳��:�7�*�
��Z����B�k;b��Sp�)#M;���.�a���X�ox��
�!\(��0dy�֊hc�)�+���
N�[}���6�O���=YL�zI��j���� +6���'�Ϻ�l�&r��^�R|mL� +��*$��n��t�n �$���T�35H�$�e}�.l'о=~�wfV�FǤ�)�
L����/k�ɩ�|Aޓr)Cs�.�?�e��( +
T8��� (?�ȄgWp;��� +hؘ� P"��(9��:�y>N���-j
��,�5����A�c���(���>Y?pʺ浹� +�A)�*jE�H~��K��������n�g�'R�g�<S���&O���m��i�7.��C(�i���RDә����B+��H���� +av�@Х-e�/�r[��Q�B(ћ�]���� ӭ6��wG�y7��z���R��o��[<��Bm*��+)���P�) +40��f�!��˰K��q]{яm��W/)x|>�����cV�+�pI�{\���_o�|T�Pg��q��r:�Z���G���5���[1г+ �g!R���F%��v��:�yϑ��x(k��)Ƹ��� +&F��f* +9Ӊ�0D���*��Bխ��b�� +�o���DV|�ʸ���6�����چ�:�a�3+<�E�.L����3��3�c�}�F��Ξ�ѸYkJP�8�`Z��p�n�Sil>�������,[Q��Y�#b*�ȯ��C]�O��
>�`t�W8"O���}�E�2s����9�qƤg9_Lv*�F��*�d~1�T��J�R�育���l���.OA��(X +6���;P��:[ԤH�3I���i�W<]t�?���Te�8��4�5��x����z³�e6����;:|�~����K�>��W��q�7����k /��r��Z%^=�A��� ���� +9۹X�Z���B��rF��$��}=Ȅů�h,zWTq%>�G|�K����Q��a�;d)�N���Lq�V0�sx +6�S�ҶdNxyI�<�>0�0�/"Tz +�;n�~�0©Ҷ� d���� ],:�CѢ��^�h��5��)�9@��p�L� +T� %[I�b��Z==[s���̈́�]P���[c���H�GA߷�*ZX�X��!��r�az�q�v�b��9���>pggݪ!�A����ҥ��╉e���P��&��UJ6��"bn�YdFl�� +�xo�z�M n�y`3kU| +���1�c��JX�%�`S��a�e
��[��^��� �buW@�$xg�Lr{|���;�U endstream endobj -283 0 obj -<</Length 1691/Filter/FlateDecode>> +448 0 obj +<</Length 7075/Filter/FlateDecode>> stream -x��ZKo7��W�S;���⛻E��S�E��[�ClT=Eh�k-)�p��Z��[�yq��pW��y������O��|������F5���R5^㵖� A�j��d���ׇ�������q�����5��au�Z������NJ�7���~�=,�^ eLg�;�
Kb���=���h�K��>#�AE �Qj��+=z[���e��n��h�BVqn�L�_GLy 8F9a�������>|�Y�1���1}8�N�մ²!�bp��.Ra�T�B��+�뺧�w��C��N��%����۰*FX�(�������Xe�sV?G.����c��T����ByS��ֈ�f"��$�N���v<M
�\+��?��F�d��։�w��0��uS����\���g�,r���� -�H~�L��4yZu�,���|��2� $����"w�ۃ�ʒqn�x9�Ã�;�`~�L�b��l� -g0/�����A.�~Y�ɼ'�M��N�_p��1��5�%��%� -㍴'4B3R"�bחʋ�{���99�� -�D�b j\�A,�v���G�ްTx�%�(-�e�H"� �z�8��o/�|�f���1��*���-��88���%mK|� -�)�=��0^�g���h_���rJ\$8�K1�"�L0�Z�eí�z����,�����j�nk�3�CӁ�d���M��Y5%��<����BH���1[N�����u���߁���i��4o3h��;��@W��`�i�ssq�{���l�p=�j�#�&/>ʼn���@L��N(�MƩ[U���ux���ZC�q�͑��=φ!A���R�0�Ľ˻(�]D�Ѧ.
���:Ι�rD��0=��2�LW;�l�6n�k��x/�i�4s��%P["q�hC�^�s9�� ��������� �|�f,�H�(V~y���9�N�±����n��
t<��q,�!QW`A~�A�c鯖��<�z`Ħq`DKkH7�7i'#��3 -ٳ� ��O(�|վ%�֟���vBI����o� -_� -��;*o��_��m�h���6� +x��=ْ�q���)�X�[���(�<u��|�C�GhÆ���ѳ�=�g�L�2�ԙ���w��������^����_��W����������{s�n�7!{o�M)ބ����}�����o7��o??|��{����{{�I7o�O��?o���/~����x��6?�
q����e��˦���Oͭj�pl�o}}�����0�O6��k���CyЧ��6=
y���?.�/���/a��/��kX�hˌ���a���?������7���^>�K�?0��&V@���/�mC��my��լ������Ὓ�Z[�[H�3��iS[w +rI��Ƨ�c�8�:n"nD�!�q�0��̌��"����ܪ����ۉ�<�x��O�I���;g4O���1�a�ea�0dz���'�_�?n4 �?#u�B+d/r��q�jM �b��~��d���CBE
7��� ���
��Z��� -͌��ɳ�=�muh�w����&ǓqlC8_k�'���_F�i����32�)�ph=�Hֳ1��� +�4��ty���0���bΦD_wH� +uʰ�6��
���%�[�@�we�e;j�p���j��p��8����<����*�d怭=���M��� �T�@$�H�+j'o��.���r�W��uLN̕�Z�u�B�3~��)P^�r01Ա����!5���5_��s��>꼏�98����v�z�YeKY��3� V^4V��)1��ud$�ʶ�Z�r�q��r�ש�5�%�!��V�.Ǖ�f�]ݪ������L +�j�j4%�<����������}�wX۟��o���||�|�~� +ʡ�[�/'o�+2ޯ�*6G2�U��FWZ٩��qX +��fc'��~J�y�U��s1��\�=��L(�j�{���J0�&T�Ϛ��V�MG-� +v�O���b`����Q�-����X�q�D#0�0��FfL�k��&l��p�$r�S���E�Du\;kJ�;�熬�<��O���#��a�_oQħر�O6��Wh��*��C\��= +Z�15kZM!]��Wl,E�ƶo��>�� +�I�%l�?;����"Y�LE������&:!*��4T���|�&�\&�b(3� +�ة���u��I$�c�j�x� +�8[j�O�F�/�'��Y ���d� tJdDbJ������9��˺�5:^�|��d�DRɦպC�Ւ9bΩ� +��/q�@� ���Y�N֘W���T/�o�s�F��tN04v��0Hx��������G8��lB �fSo9V{4v�T=� + +� �9 [P�H
vCR��Y��7t�9q~�K��im<�i�\A��TLt6��F>�2r=ō'C-��[�1 \j�k}t�
�d[tS�ݿ_��N�F���&>UM͠�.�r�6N,vF^��xk]x�������.a�fģpy���K�x%2!R륷K8s��|$'�#Ej*�6��}�ƞ(��!��1?�n5u] �������~��$� f]C����E�������~�<h�"+�~���Ϩ�:���{?��僩Z*}0ٹ=& +M��<�m���AeT�X .$�_�<nE�G���,�:0K�:&ժh��.���\�.1D�[猋�4xsSgCޡf��4 �җ5%��I3�A�K���]Gjmd4#4��d����2r��L̦��<9��?�F��sY�8�jI��xby��H��Y�'i�Вɮ��]
���ʤ� ��t���lP�G(a�� �zs�1��g�?��7�܄�S��-I䅖7$�[q�;ijH1"lz/X�V�c��cIA=і��+�dRr%L�If;��E�=�8��ɶ���L�M�L�LMsӪ��yVj�ޚ���x� +=�B�����9��V�.gJ�|�N�/�.����Nuk��)��{��7������7u�H�0]w��D]"�%hI�!�}�<ꌻ0N.YքBn9���� +N�� **��y�c���5�t%n!�)v3�&5��h�|��!kς�L�m�YF�^ݹ�w�Nj��{_Fx�;,�8�I������A����i�S���_� +��R�'$LL��p�sx�=� +I푬Ì(3��rfV�6\��Nl>~�4�V�2fI��r;��E4��������Mťu>4��:��dl(��"ehg����X`�;�"��r���8�bM�1�;)�����gR+9D{���YM +p��R�tc �����b��~�J[`%�Pi(����uM�����'��I;�ٴ��JSӰ"��[yL�q+�&�@�*�&Ha:�K ��4^����`2|�E��M��Fݔ2��==�T�LY��.,��vO�8��Xj#%���%����p�'���������h"���(��3����6a[�}<�Z*�m����Ů����#K��`*F�4i�m���+(�ѡF�A�rf�]+Zؤ���.w�Y��.e�ci��ËZG�,=$eL�=��f�7N�Cm���6���I�,��h��Z�"1� �-"ϐ "��h���N�NY#������.�d�UjW6.V�|%���jب +������jbH��pqzvq@x��bʆ�b�M�����g_�`~�X�d=5sY5,*#v�N��gj�4*��&�^�F�1�f-���Ը�ft-���.G%�Lr�'������$�y�y58y|*u<saIn��(����&���U�5���0�Ó^_���|7%#��@oH�3�Hr�ORO��Or�{MO�D��)�N��1��`R%�'�<J(�8�|
ӎv�\h�;������a>��B6)��\�?j��@�'"Y!~��[��I0���ޓ���\��5�QIvt�fe�i\�&���g!i|LV>_�r:0�'%퍊�b-re���m�y�#e�j+{��a}-��Lb���:3묗��x�������΄+!��iL�_�&�E���jD1Qy����
W�q�d����Ěk�r25��}�?,�u��k(,�⦄Z�y���;
�ϴa~��s��}�I8�2`�)W���]��KΡ���0K5΅:C�:[���uW�t�H��MYW߫������
�}8<��C3�I�M\`�+�_{��%gjq;*�9TL�H�/���rVMA��V�Ko9 �y8:�צ���ylb,Yh�Kp�������Q���D�,4��q-t�SY�2���\�xV��NA7:�����M+��B1���~�2뛿��9!\�1A|�����[0u��7�Sv�^�'Q�$�~��Md%|+�h{g���o�\�^�6Z�T�����iu���suI �i5���_�FyܻRR�5��N���,q굜h�M���J�u�
#��G���aBʀH�+�v�2�ΚZ�3@� +6s\����|��~�~{2:���6H������췿c�-��F�g��w
#�"�79�v*�q�8˄��j���j?Yx9�x�ݳ_Wm�LJ ƶ���9��(��2���\k��k/��+Y�x���V�h�ޙRS�6~
4iT�y�����yyi%\��Y���(�p���<�w<R�* �hlI��� ބ�l=���V[ua-���`i��+1>*c�jZ���L�ج�}�9�n=u'�s�Vw���Z�a��M�R66;�AjG�{/�Z�fl6���oƳ(�����ٔ�c�Fh��3��Fbe��Ԕ�1�_�n�Q���ҤQ�\�6�Z��l�J��N|�?}.|��LN��m�$��R�|�-憐�$.�9/m��=H߬}��9��{\l�W`��9"�`����Й/���D+��uy5jD��)X�Čf�-5��U���M��ZPE�ME�T�w\���6ʋ9b��K����J:�P�CE-5�:����A9rL�)oM�~f�K3%�� +L%S�߽_9 +�y&-$�%�����[F��8;7��Z�z��<��}v&���5xP��E�s1-䲗�C���|���/�u&y�4�bL{����u&c�F��+����fj����C����d\(��bd��g�3�ָ�;l>K%�1m.JPLS��l]��+��ˇ]4O1+�p�"oC|��<Q���KD�W7q��O��wRM�|�[��ƽX�AA9���.jQ��}��@�|��3Ls�^|��P@/��i.�``G��Z�L��V�'VYm;�b����L���դ�j�R�K� +p�Eіס�M{�3�Pz��T4��V���`���^�� �d| 5�K-tŷ"�6Q� endstream endobj -284 0 obj +449 0 obj +<</Length 8082/Filter/FlateDecode>> +stream +x��=�n$Gr�� +j$S�$&�>��j%�c�мI~X +��g��0��U�qVvU����<##�ȇ_���O�|����rc��������q7���ܻ��M���|S�7!ew��?��7�����^���7o�?��7Κt��ݩ����?~��wk��օ��w/�Y�Y��)%��
C>�|:6�ǿ�������]
s�����o�������?>�����9�?�)ֶ��?wSMd�w��ۻ���O�i�)�z���y�8i���`������{q��LZ��)� E�y�5#����i#��J2���C�e��gw�-�i�)�)�5ykMm���Oa&��šIw +���M�C�^ +����#Z�$��7�K���Δ����{Ѿ?h�9���q��'���`M�1]�b��,�Gk�id!��H���ɔb'�� +8�"l|�J����_��['��q��blv��$�q�To��U����|�ZLȵ^��
z�(-�-�&SȾ��^�D)�o��4$_l �H�@�?�����P��O�z�lD��<4?�J$t��_��O��$�g�oI��V7���a�g2�1�Nk��z%����+/ f��������� � ,*x�����|�}�K�0І��
�ؑ�Q� �pu�/d�EO)~kz>y��{���S��˚n�Ѱ����c���㥭|6�Z1�t�Է�����j�c�PK�cA�f��9.:F$�b�>nA��*+"��@W�F\6�X��4�W�������������M��G?����˽���M?�qT��C!*�"@7>ƹM���7�m�I�}HG��o"��a�[[9�aF^B���(����F��nbe�s"�`4����I5�YoB i�����h�ͭ���xƓf�)��2����zY�c|dΚ�Ю�@c�3�'p��]h��. +�4�EN��Ɋ#��l�ہڢ5�B:K��l0���
)uY]g�r(�1�t2ӘZoޓ`�H��M'p��<� �/��×`@��^#%�PmJ�-DC!��1��ח��{d
��f\��LjP�ƇX� +�q��������V��B���!;g��,��,~R�7�^M�~e����銃���0}��yg�X,f`��О�^u̝JQh���9|INZ���w��&��9{^��flz�X��ƪ2�G%e���*�)UhR2�^�G�z��c��:��aA��8��J���8��n��/�NB:nB ED] � +_lƕX�n8��� ���P��@�]�<i��K�8R|1ե��C +�dZ�1�=�^�����,l�;��7�-��� +]��a��I�p�D:D��]�E��M���-F�����Œ���G�~��C�WO�V�����¬&-Ut� +�'�M��cZ���E��B��98 +�O�:^���k�V)\މh�렁�>�X��������x�z���$�fʔz�~�V�
!����P�Yݎ�q�j����z�e��Ś�B��&}ªuF����v����PM�!mW��P +��Ț�ZʗtF��y};_�S����1 +d� ��m1K��7Ё�"Ff����%�ܵ�e�����PT(߲ol0���r(�I�����e� CC�捍��H�F!H.��V±��A�/�@D�̏�D�Mpk�]YY�6�}�?�E��9 +�.�bʠ +�U��ye�LE9�ۋ�?�X����75O����V�Ie���LH,�� �?��ŷ��9Y�|����
���/(���J���$m��k�1�\(�&A=9���sH�A��m�☚�ՙ��.�K��p}6ei�4��p!�5 �*�\�5���w���P�q�<���Xwx�6$�`Z-�F�$͟�h ��h�
�g)`S��[���yO������Mr��٨��Va|�u�4[\� + qb��^ ��)��f�U�H_��X�pB?��<�L�@�3�%�^-�\ ��6p"J�Ц �r�Õs� h%2�h!�+>���6E+�0�$'ny"%����Zh���� +<*�O���D��fj�q�(W�_:^'��Q��6.�[,��K�� ������B +���l�A�-e�� +���m��+p<��)0C�(��r�X'�,>1a)���p����W�G"I2AY ���&-Pcʜ����_�v�jl+(˗���4|�>+�5�b�-�a������2p2CJ1��e p&Q]݇d�����95h�o���t��h�՚�������-ɣښ�l254�cr�`1M��y��b�^��=r����8��(7�v��,�<�&%^��@T
��/OK�%�����ܲ��骔�j<+M/�]�V�Z��V! +�̟Vi�K�^�t���T
�}�ŀ�������1ƍ��(�B�oV���/��W(�)?�v�ˋh7NIC�!��o�݆���ޢJ̡CN0���Z +aЊ���O�^��0�2�T�(�+�>�4����3�D���ԃ�S��#<ɚZl���to�mًoT��6nr�C�� +٤��؝N��j\�T~�'�b��R:�@4]�=�z��퇩�ԦJm�������{��&臜��n=i�+�b�5�S�?yX�F(L<����P�UNT+E[�� gb�vd1���������n�J��Mh���@4"f�7沫�C�9ȷ�sL��C���L���8<� +�g��W�"�腟��c�{h�����<�Pp�{���0G +��A�����0af̨Ű��$=L95��� ^��!E+McK$���q
���Vh���r�������K +)�b�k�ײ�[���@9 ++�fb�isa�ó�my>��ސ*��.���́�k�DỰ8�0��J�-��]���8�<;>����Z�Z��J�:�>wi�2O:[�l�=��%�"�%�|\}�+��F�CU��bJۧ3�bĽb?��rQJ��W�O���(�U��L���*�jUYk2���f�o4�����;`�xW� m)��Q8�����ў�����Sč0ߐ8�^n Y͍����q���:9��ه8N>ޏ5�ұ�*�"4��r��sqj`�oEM"-:��4�POP�V����Lln�a�Q�S.��+�� +*����p\@�pW�4�������d����\6� +endstream +endobj +450 0 obj +<</Length 1978/Filter/FlateDecode>> +stream +x��ZK�7�ﯘm���e��A� �A��E����!�hz��&��(l�4"Ejd{/3���$>>R�6���q��������ŋWo^_�7�ArX��ka���!ha�W���̓�r����zu7������n��4��>�y�AJ����)�=��9�?M���ڌbtA�#�����1��dȏ������A����:
4��7���?L�B�LM�M��D�~{�{�6�r�V�{�{��#�y�*j�2�6z��-�mڬ�_�������X��u��<��6�,��@�~�A��j��b83���wW�]�}�zS��j���¸���}�����c�
�����l��od�Y�3R�T�v354�<F�KMWRS�3��uHM
QX^hh��$�S�'�u���X�� �����9O�@�]�념����]�0m-o���u�vF��d,q��8�Qs���B�~�\3<�n�e���.�gUQo@�IoZ{�צ����(k4�<��>l[�g�0�H{��(�䣌���WB3�[RJI�-Y (�C&��}A��"K<CR�iK�'�y���8�!������VnO�WY���ӱ�j��
@Ʈ�j?�!@�t�'yj:���_�ю=:^,��UF8g��8� ��|<`���i�B����KH5��$/Q�Wd���+��B/#���������ޟ���5<�a6�W����#�̐E���M�#]>h�0C���&(�{&C��j�^u�.'�ݕ��a����#>���'O�`){��l~(��t���?��?��κ~]ES��/3�o8{��cК��� R^rx@��T@a�J�k���s��y�C������D���{A�W0%0�-��Z��3�'�,�p� +���#�Uc7����1�uܴ'��n2�k��9�� q\/J��[��[n����n�x�hk���Z�:���V\��;�%cb�&wAzȚ�R�9�ؕ��5&�؊Q����D��{�@�t}�R�� +�fQ^���s�#�F��۫
ݗ���Rd'��k9���xoCrW��ա�� +�sB +����btct+}n�����S�} +h���{ր�|�DB!p��2,�hI����L�C�ib����i��֑k�,
�xUNDCqd�:�x�V������}�?h���r�lChc�_LtL�&Zi.�u4��E�M ���6[IT+�Mp��U�4�]Q8�
̆Q$��w��StƦ����pn;��kǘt|n^�P�4J�D�� +endstream +endobj +451 0 obj <</Length 258/N 1/Range[0 1]/Filter/FlateDecode>> stream x�u��J�PFO��U�v�D�D@�`]\� @@ -1129,7 +1704,7 @@ F��Mk�I���R�B|��&إ�n�ऋ��(�H�r�Tų��9�`��ըa�&�ʺ���:�l ̵�8+�/<����a�Rkp��ش�A�mW�Q�Ih��
�%��l��E5VW~��d���X��)�ϴ�:��b���k#�&�_¤3�0��
�I� endstream endobj -285 0 obj +452 0 obj <</Length 314/N 3/Range[0 1 0 1 0 1]/Filter/FlateDecode>> stream x�}��Kq�?�U�X
94%MQKS��N�#Ԧ��Q�v��B�ˡ�h�Fk ������! @@ -1137,311 +1712,478 @@ x�}��Kq�?�U�X
94%MQKS��N�#Ԧ��Q�v��B�ˡ�h�Fk ������! ��0l+��ߣ�y7���;����;Q�?V.�_�tF��3L�E�K�)y ��z�80e�IP���k��T�/%[�p endstream endobj -286 0 obj -<</Creator(Typst 0.15.1)/ModDate(D:20260811182720-03'00)/CreationDate(D:20260811182720-03'00)>> +453 0 obj +<</Creator(Typst 0.15.1)/ModDate(D:20260812143741-03'00)/CreationDate(D:20260812143741-03'00)>> endobj -287 0 obj +454 0 obj <</Length 996/Type/Metadata/Subtype/XML>> stream -<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?><x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="xmp-writer"><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" xmlns:pdf="http://ns.adobe.com/pdf/1.3/" ><xmp:CreatorTool>Typst 0.15.1</xmp:CreatorTool><dc:language><rdf:Bag><rdf:li>en</rdf:li></rdf:Bag></dc:language><xmp:ModifyDate>2026-08-11T18:27:20-03:00</xmp:ModifyDate><xmp:CreateDate>2026-08-11T18:27:20-03:00</xmp:CreateDate><xmpTPg:NPages>5</xmpTPg:NPages><dc:format>application/pdf</dc:format><xmpMM:InstanceID>JCSPa/4Mr2ZKVhRZ6582Sg==</xmpMM:InstanceID><xmpMM:DocumentID>JCSPa/4Mr2ZKVhRZ6582Sg==</xmpMM:DocumentID><xmpMM:RenditionClass>proof</xmpMM:RenditionClass><pdf:PDFVersion>1.7</pdf:PDFVersion></rdf:Description></rdf:RDF></x:xmpmeta><?xpacket end="r"?> +<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?><x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="xmp-writer"><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" xmlns:pdf="http://ns.adobe.com/pdf/1.3/" ><xmp:CreatorTool>Typst 0.15.1</xmp:CreatorTool><dc:language><rdf:Bag><rdf:li>en</rdf:li></rdf:Bag></dc:language><xmp:ModifyDate>2026-08-12T14:37:41-03:00</xmp:ModifyDate><xmp:CreateDate>2026-08-12T14:37:41-03:00</xmp:CreateDate><xmpTPg:NPages>7</xmpTPg:NPages><dc:format>application/pdf</dc:format><xmpMM:InstanceID>cWkS3h769t04PhZUfewewQ==</xmpMM:InstanceID><xmpMM:DocumentID>cWkS3h769t04PhZUfewewQ==</xmpMM:DocumentID><xmpMM:RenditionClass>proof</xmpMM:RenditionClass><pdf:PDFVersion>1.7</pdf:PDFVersion></rdf:Description></rdf:RDF></x:xmpmeta><?xpacket end="r"?> endstream endobj -288 0 obj -<</Type/Catalog/Pages 1 0 R/Metadata 287 0 R/Lang(en)/StructTreeRoot 11 0 R/MarkInfo<</Marked true/Suspects false>>/ViewerPreferences<</Direction/L2R>>/Outlines 10 0 R>> +455 0 obj +<</Type/Catalog/Pages 1 0 R/Metadata 454 0 R/Lang(en)/StructTreeRoot 11 0 R/MarkInfo<</Marked true/Suspects false>>/ViewerPreferences<</Direction/L2R>>/Outlines 10 0 R>> endobj xref -0 289 +0 456 0000000000 65535 f
0000000016 00000 n
-0000000101 00000 n
-0000000177 00000 n
-0000000263 00000 n
-0000000355 00000 n
-0000000437 00000 n
-0000000552 00000 n
-0000000634 00000 n
-0000000738 00000 n
-0000000840 00000 n
-0000000906 00000 n
-0000001109 00000 n
-0000001820 00000 n
-0000004250 00000 n
-0000005044 00000 n
-0000006086 00000 n
-0000006240 00000 n
-0000006311 00000 n
-0000006372 00000 n
-0000006439 00000 n
-0000006521 00000 n
-0000006594 00000 n
-0000006668 00000 n
-0000006750 00000 n
-0000006822 00000 n
-0000006906 00000 n
-0000006978 00000 n
-0000007096 00000 n
-0000007166 00000 n
-0000007236 00000 n
-0000007381 00000 n
-0000007449 00000 n
-0000007521 00000 n
-0000007639 00000 n
-0000007770 00000 n
-0000007838 00000 n
-0000007966 00000 n
-0000008038 00000 n
-0000008108 00000 n
-0000008178 00000 n
-0000008288 00000 n
-0000008356 00000 n
-0000008428 00000 n
-0000008498 00000 n
-0000008568 00000 n
-0000008638 00000 n
-0000008708 00000 n
-0000008778 00000 n
-0000008848 00000 n
-0000008918 00000 n
-0000009072 00000 n
-0000009144 00000 n
-0000009216 00000 n
-0000009316 00000 n
-0000009388 00000 n
-0000009458 00000 n
-0000009528 00000 n
-0000009598 00000 n
-0000009668 00000 n
-0000009738 00000 n
-0000009808 00000 n
-0000009878 00000 n
-0000009948 00000 n
-0000010018 00000 n
-0000010088 00000 n
-0000010158 00000 n
-0000010228 00000 n
-0000010298 00000 n
-0000010515 00000 n
-0000010584 00000 n
-0000010660 00000 n
-0000010783 00000 n
-0000010850 00000 n
-0000010965 00000 n
-0000011074 00000 n
-0000011192 00000 n
-0000011262 00000 n
-0000011334 00000 n
-0000011404 00000 n
-0000011474 00000 n
-0000011588 00000 n
-0000011676 00000 n
-0000011744 00000 n
-0000011812 00000 n
-0000011898 00000 n
-0000011984 00000 n
-0000012064 00000 n
-0000012150 00000 n
-0000012241 00000 n
-0000012326 00000 n
-0000012419 00000 n
-0000012516 00000 n
-0000012571 00000 n
-0000012640 00000 n
-0000012733 00000 n
-0000012898 00000 n
-0000012983 00000 n
-0000013124 00000 n
-0000013233 00000 n
-0000013374 00000 n
-0000013468 00000 n
-0000013570 00000 n
-0000013626 00000 n
-0000013800 00000 n
-0000013982 00000 n
-0000014108 00000 n
-0000014366 00000 n
-0000014439 00000 n
-0000014512 00000 n
-0000014614 00000 n
-0000014694 00000 n
-0000014767 00000 n
-0000014844 00000 n
-0000014946 00000 n
-0000015021 00000 n
-0000015142 00000 n
-0000015217 00000 n
-0000015338 00000 n
-0000015452 00000 n
-0000015532 00000 n
-0000015660 00000 n
-0000015788 00000 n
-0000015924 00000 n
-0000016004 00000 n
-0000016132 00000 n
-0000016260 00000 n
-0000016388 00000 n
-0000016468 00000 n
-0000016596 00000 n
-0000016724 00000 n
-0000016852 00000 n
-0000016932 00000 n
-0000017058 00000 n
-0000017184 00000 n
-0000017312 00000 n
-0000017392 00000 n
-0000017465 00000 n
-0000017586 00000 n
-0000017659 00000 n
-0000017780 00000 n
-0000017910 00000 n
-0000017990 00000 n
-0000018116 00000 n
-0000018243 00000 n
-0000018370 00000 n
-0000018450 00000 n
-0000018621 00000 n
-0000018733 00000 n
-0000018805 00000 n
-0000018877 00000 n
-0000018951 00000 n
-0000019023 00000 n
-0000019095 00000 n
-0000019167 00000 n
-0000019239 00000 n
-0000019311 00000 n
-0000019486 00000 n
-0000019558 00000 n
-0000019650 00000 n
-0000019722 00000 n
-0000019801 00000 n
-0000019873 00000 n
-0000019945 00000 n
-0000020017 00000 n
-0000020089 00000 n
-0000020161 00000 n
-0000020233 00000 n
-0000020305 00000 n
-0000020460 00000 n
-0000020561 00000 n
-0000020635 00000 n
-0000020707 00000 n
-0000020779 00000 n
-0000020890 00000 n
-0000021000 00000 n
-0000021075 00000 n
-0000021158 00000 n
-0000021232 00000 n
-0000021304 00000 n
-0000021376 00000 n
-0000021448 00000 n
-0000021519 00000 n
-0000021753 00000 n
-0000021826 00000 n
-0000021897 00000 n
-0000021969 00000 n
-0000022041 00000 n
-0000022113 00000 n
-0000022185 00000 n
-0000022257 00000 n
-0000022429 00000 n
-0000022503 00000 n
-0000022575 00000 n
-0000022647 00000 n
-0000022719 00000 n
-0000022791 00000 n
-0000022863 00000 n
-0000022935 00000 n
-0000023007 00000 n
-0000023079 00000 n
-0000023151 00000 n
-0000023223 00000 n
-0000023298 00000 n
-0000023370 00000 n
-0000023442 00000 n
-0000023514 00000 n
-0000023763 00000 n
-0000023837 00000 n
-0000023912 00000 n
-0000023984 00000 n
-0000024056 00000 n
-0000024128 00000 n
-0000024200 00000 n
-0000024338 00000 n
-0000024412 00000 n
-0000024484 00000 n
-0000024587 00000 n
-0000024661 00000 n
+0000000117 00000 n
+0000000193 00000 n
+0000000279 00000 n
+0000000371 00000 n
+0000000453 00000 n
+0000000568 00000 n
+0000000650 00000 n
+0000000754 00000 n
+0000000856 00000 n
+0000000922 00000 n
+0000001143 00000 n
+0000001833 00000 n
+0000005028 00000 n
+0000006510 00000 n
+0000007552 00000 n
+0000008746 00000 n
+0000010276 00000 n
+0000010462 00000 n
+0000010533 00000 n
+0000010594 00000 n
+0000010661 00000 n
+0000010743 00000 n
+0000010816 00000 n
+0000010886 00000 n
+0000010973 00000 n
+0000011055 00000 n
+0000011127 00000 n
+0000011211 00000 n
+0000011283 00000 n
+0000011401 00000 n
+0000011471 00000 n
+0000011541 00000 n
+0000011611 00000 n
+0000011681 00000 n
+0000011751 00000 n
+0000011938 00000 n
+0000012006 00000 n
+0000012078 00000 n
+0000012196 00000 n
+0000012330 00000 n
+0000012398 00000 n
+0000012526 00000 n
+0000012598 00000 n
+0000012668 00000 n
+0000012738 00000 n
+0000012808 00000 n
+0000012931 00000 n
+0000012999 00000 n
+0000013071 00000 n
+0000013141 00000 n
+0000013211 00000 n
+0000013281 00000 n
+0000013351 00000 n
+0000013421 00000 n
+0000013491 00000 n
+0000013561 00000 n
+0000013631 00000 n
+0000013701 00000 n
+0000013771 00000 n
+0000013841 00000 n
+0000013911 00000 n
+0000013981 00000 n
+0000014051 00000 n
+0000014121 00000 n
+0000014191 00000 n
+0000014444 00000 n
+0000014515 00000 n
+0000014584 00000 n
+0000014653 00000 n
+0000014724 00000 n
+0000014794 00000 n
+0000014924 00000 n
+0000014996 00000 n
+0000015066 00000 n
+0000015136 00000 n
+0000015206 00000 n
+0000015276 00000 n
+0000015346 00000 n
+0000015416 00000 n
+0000015486 00000 n
+0000015556 00000 n
+0000015626 00000 n
+0000015696 00000 n
+0000015766 00000 n
+0000015836 00000 n
+0000015906 00000 n
+0000015976 00000 n
+0000016046 00000 n
+0000016116 00000 n
+0000016186 00000 n
+0000016256 00000 n
+0000016326 00000 n
+0000016396 00000 n
+0000016466 00000 n
+0000016536 00000 n
+0000016843 00000 n
+0000016913 00000 n
+0000016991 00000 n
+0000017131 00000 n
+0000017200 00000 n
+0000017330 00000 n
+0000017456 00000 n
+0000017578 00000 n
+0000017651 00000 n
+0000017726 00000 n
+0000017799 00000 n
+0000017872 00000 n
+0000017998 00000 n
+0000018088 00000 n
+0000018166 00000 n
+0000018236 00000 n
+0000018398 00000 n
+0000018508 00000 n
+0000018594 00000 n
+0000018688 00000 n
+0000018782 00000 n
+0000018868 00000 n
+0000018970 00000 n
+0000019096 00000 n
+0000019152 00000 n
+0000019222 00000 n
+0000019316 00000 n
+0000019470 00000 n
+0000019652 00000 n
+0000019802 00000 n
+0000019940 00000 n
+0000020094 00000 n
+0000020180 00000 n
+0000020322 00000 n
+0000020396 00000 n
+0000020470 00000 n
+0000020580 00000 n
+0000020730 00000 n
+0000020804 00000 n
+0000020886 00000 n
+0000021037 00000 n
+0000021109 00000 n
+0000021165 00000 n
+0000021318 00000 n
+0000021429 00000 n
+0000021562 00000 n
+0000021901 00000 n
+0000021974 00000 n
+0000022047 00000 n
+0000022149 00000 n
+0000022229 00000 n
+0000022302 00000 n
+0000022379 00000 n
+0000022477 00000 n
+0000022559 00000 n
+0000022634 00000 n
+0000022755 00000 n
+0000022830 00000 n
+0000022951 00000 n
+0000023026 00000 n
+0000023147 00000 n
+0000023261 00000 n
+0000023349 00000 n
+0000023485 00000 n
+0000023613 00000 n
+0000023741 00000 n
+0000023905 00000 n
+0000023993 00000 n
+0000024121 00000 n
+0000024249 00000 n
+0000024377 00000 n
+0000024517 00000 n
+0000024605 00000 n
0000024733 00000 n
-0000024805 00000 n
-0000024877 00000 n
-0000024950 00000 n
-0000025023 00000 n
-0000025096 00000 n
-0000025173 00000 n
-0000025246 00000 n
-0000025319 00000 n
-0000025535 00000 n
-0000025610 00000 n
-0000025683 00000 n
-0000025754 00000 n
-0000025826 00000 n
-0000025900 00000 n
-0000026466 00000 n
-0000026829 00000 n
-0000026866 00000 n
-0000026903 00000 n
-0000026956 00000 n
-0000027009 00000 n
-0000027061 00000 n
-0000027114 00000 n
-0000027166 00000 n
-0000027219 00000 n
-0000027272 00000 n
-0000027325 00000 n
-0000027448 00000 n
-0000027582 00000 n
-0000027716 00000 n
-0000027839 00000 n
-0000027962 00000 n
-0000028111 00000 n
-0000028678 00000 n
-0000028886 00000 n
-0000029038 00000 n
-0000029913 00000 n
-0000030124 00000 n
-0000030264 00000 n
-0000030480 00000 n
-0000030719 00000 n
-0000030879 00000 n
-0000031085 00000 n
-0000031298 00000 n
-0000031426 00000 n
-0000031554 00000 n
-0000031682 00000 n
-0000031810 00000 n
-0000031938 00000 n
-0000032021 00000 n
-0000032658 00000 n
-0000037108 00000 n
-0000037188 00000 n
-0000037976 00000 n
-0000049040 00000 n
-0000049121 00000 n
-0000049901 00000 n
-0000062507 00000 n
-0000062584 00000 n
-0000063015 00000 n
-0000063487 00000 n
-0000069039 00000 n
-0000075653 00000 n
-0000081181 00000 n
-0000088562 00000 n
-0000090324 00000 n
-0000090667 00000 n
-0000091074 00000 n
-0000091187 00000 n
-0000092260 00000 n
+0000024861 00000 n
+0000024989 00000 n
+0000025066 00000 n
+0000025202 00000 n
+0000025290 00000 n
+0000025418 00000 n
+0000025546 00000 n
+0000025674 00000 n
+0000025747 00000 n
+0000025887 00000 n
+0000025975 00000 n
+0000026103 00000 n
+0000026231 00000 n
+0000026359 00000 n
+0000026515 00000 n
+0000026603 00000 n
+0000026731 00000 n
+0000026859 00000 n
+0000026987 00000 n
+0000027147 00000 n
+0000027235 00000 n
+0000027308 00000 n
+0000027379 00000 n
+0000027450 00000 n
+0000027521 00000 n
+0000027683 00000 n
+0000027756 00000 n
+0000027877 00000 n
+0000027950 00000 n
+0000028071 00000 n
+0000028206 00000 n
+0000028294 00000 n
+0000028473 00000 n
+0000028545 00000 n
+0000028617 00000 n
+0000028689 00000 n
+0000028761 00000 n
+0000028889 00000 n
+0000028964 00000 n
+0000029076 00000 n
+0000029148 00000 n
+0000029220 00000 n
+0000029294 00000 n
+0000029366 00000 n
+0000029438 00000 n
+0000029510 00000 n
+0000029585 00000 n
+0000029657 00000 n
+0000029832 00000 n
+0000029904 00000 n
+0000029996 00000 n
+0000030068 00000 n
+0000030140 00000 n
+0000030212 00000 n
+0000030284 00000 n
+0000030356 00000 n
+0000030428 00000 n
+0000030578 00000 n
+0000030657 00000 n
+0000030729 00000 n
+0000030801 00000 n
+0000030873 00000 n
+0000030945 00000 n
+0000031017 00000 n
+0000031089 00000 n
+0000031161 00000 n
+0000031236 00000 n
+0000031308 00000 n
+0000031381 00000 n
+0000031454 00000 n
+0000031527 00000 n
+0000031600 00000 n
+0000031673 00000 n
+0000031746 00000 n
+0000031819 00000 n
+0000031892 00000 n
+0000031965 00000 n
+0000032038 00000 n
+0000032111 00000 n
+0000032182 00000 n
+0000032603 00000 n
+0000032703 00000 n
+0000032776 00000 n
+0000032848 00000 n
+0000032920 00000 n
+0000032992 00000 n
+0000033064 00000 n
+0000033136 00000 n
+0000033208 00000 n
+0000033280 00000 n
+0000033454 00000 n
+0000033526 00000 n
+0000033598 00000 n
+0000033698 00000 n
+0000033808 00000 n
+0000033880 00000 n
+0000033969 00000 n
+0000034043 00000 n
+0000034115 00000 n
+0000034187 00000 n
+0000034259 00000 n
+0000034331 00000 n
+0000034476 00000 n
+0000034550 00000 n
+0000034622 00000 n
+0000034694 00000 n
+0000034766 00000 n
+0000034838 00000 n
+0000034910 00000 n
+0000034982 00000 n
+0000035054 00000 n
+0000035113 00000 n
+0000035185 00000 n
+0000035244 00000 n
+0000035316 00000 n
+0000035556 00000 n
+0000035630 00000 n
+0000035703 00000 n
+0000035776 00000 n
+0000035849 00000 n
+0000035926 00000 n
+0000035999 00000 n
+0000036072 00000 n
+0000036145 00000 n
+0000036218 00000 n
+0000036291 00000 n
+0000036364 00000 n
+0000036437 00000 n
+0000036510 00000 n
+0000036583 00000 n
+0000036656 00000 n
+0000036729 00000 n
+0000036802 00000 n
+0000036875 00000 n
+0000036948 00000 n
+0000037021 00000 n
+0000037094 00000 n
+0000037167 00000 n
+0000037240 00000 n
+0000037311 00000 n
+0000037382 00000 n
+0000037453 00000 n
+0000037524 00000 n
+0000037595 00000 n
+0000037667 00000 n
+0000037739 00000 n
+0000037811 00000 n
+0000037883 00000 n
+0000037955 00000 n
+0000038014 00000 n
+0000038086 00000 n
+0000038158 00000 n
+0000038230 00000 n
+0000038289 00000 n
+0000038361 00000 n
+0000038433 00000 n
+0000038505 00000 n
+0000038577 00000 n
+0000038652 00000 n
+0000038724 00000 n
+0000038796 00000 n
+0000038868 00000 n
+0000038940 00000 n
+0000039012 00000 n
+0000039084 00000 n
+0000039156 00000 n
+0000039228 00000 n
+0000039300 00000 n
+0000039372 00000 n
+0000039444 00000 n
+0000039516 00000 n
+0000039588 00000 n
+0000039660 00000 n
+0000039732 00000 n
+0000039804 00000 n
+0000039876 00000 n
+0000041889 00000 n
+0000041963 00000 n
+0000042038 00000 n
+0000042110 00000 n
+0000042182 00000 n
+0000042254 00000 n
+0000042326 00000 n
+0000042464 00000 n
+0000042538 00000 n
+0000042610 00000 n
+0000042683 00000 n
+0000042756 00000 n
+0000042899 00000 n
+0000042974 00000 n
+0000043047 00000 n
+0000043120 00000 n
+0000043193 00000 n
+0000043266 00000 n
+0000043339 00000 n
+0000043412 00000 n
+0000043485 00000 n
+0000043558 00000 n
+0000043631 00000 n
+0000043704 00000 n
+0000043777 00000 n
+0000043850 00000 n
+0000044088 00000 n
+0000044163 00000 n
+0000044236 00000 n
+0000044309 00000 n
+0000044382 00000 n
+0000044455 00000 n
+0000044528 00000 n
+0000044601 00000 n
+0000044674 00000 n
+0000044747 00000 n
+0000044820 00000 n
+0000044893 00000 n
+0000044966 00000 n
+0000045039 00000 n
+0000045112 00000 n
+0000045185 00000 n
+0000045487 00000 n
+0000045562 00000 n
+0000045633 00000 n
+0000045704 00000 n
+0000045776 00000 n
+0000045850 00000 n
+0000046500 00000 n
+0000046907 00000 n
+0000046944 00000 n
+0000046981 00000 n
+0000047034 00000 n
+0000047086 00000 n
+0000047139 00000 n
+0000047191 00000 n
+0000047243 00000 n
+0000047296 00000 n
+0000047349 00000 n
+0000047401 00000 n
+0000047524 00000 n
+0000047658 00000 n
+0000047792 00000 n
+0000047915 00000 n
+0000048049 00000 n
+0000048172 00000 n
+0000048295 00000 n
+0000048444 00000 n
+0000049011 00000 n
+0000049219 00000 n
+0000049371 00000 n
+0000050286 00000 n
+0000050497 00000 n
+0000050637 00000 n
+0000050853 00000 n
+0000051092 00000 n
+0000051252 00000 n
+0000051458 00000 n
+0000051671 00000 n
+0000051799 00000 n
+0000051927 00000 n
+0000052055 00000 n
+0000052183 00000 n
+0000052311 00000 n
+0000052439 00000 n
+0000052567 00000 n
+0000052648 00000 n
+0000053299 00000 n
+0000058210 00000 n
+0000058292 00000 n
+0000059114 00000 n
+0000070956 00000 n
+0000071038 00000 n
+0000071861 00000 n
+0000085825 00000 n
+0000085902 00000 n
+0000086333 00000 n
+0000086805 00000 n
+0000092369 00000 n
+0000100471 00000 n
+0000105171 00000 n
+0000111698 00000 n
+0000118844 00000 n
+0000126997 00000 n
+0000129046 00000 n
+0000129389 00000 n
+0000129796 00000 n
+0000129909 00000 n
+0000130982 00000 n
trailer -<</Size 289/Root 288 0 R/Info 286 0 R/ID[(JCSPa/4Mr2ZKVhRZ6582Sg==)(JCSPa/4Mr2ZKVhRZ6582Sg==)]>> +<</Size 456/Root 455 0 R/Info 453 0 R/ID[(cWkS3h769t04PhZUfewewQ==)(cWkS3h769t04PhZUfewewQ==)]>> startxref -92447 +131169 %%EOF
\ No newline at end of file diff --git a/docs/design.typ b/docs/design.typ index 2492329d..ff013f49 100644 --- a/docs/design.typ +++ b/docs/design.typ @@ -12,16 +12,17 @@ = What it is Pardes is a text environment in the acme tradition: columns of panes, each pane a -tag line plus a body; the body is a live terminal, a file, or an image. The mouse -carries meaning — left selects, middle executes, right looks. Everything on screen -is text and all text is equally alive, whether the shell printed it or the user -typed it. +tag line plus a body; the body is a live terminal, a file, an image, or a PDF. The +mouse carries meaning — left selects, middle executes, right looks. Everything on +screen is text and all text is equally alive, whether the shell printed it or the +user typed it. -It runs in three places: the terminal (libvaxis), a native SDL3 window (the -steamdeck), and the browser (a freestanding wasm core driven by vanilla -JavaScript and rendered as HTML/CSS). The rewrite exists because +It runs in four places: the terminal (libvaxis), a native SDL3 window (the +steamdeck), the browser (a freestanding wasm core driven by vanilla +JavaScript and rendered as HTML/CSS), and a native macOS app (an AppKit and +CoreText shell over a static `libpardes.a`). The rewrite exists because the prototype grew three parallel implementations of one program. The rewrite has -exactly one program and three thin shells. +exactly one program and four thin shells. = The shape @@ -33,9 +34,18 @@ its own renderer; the core owns everything the user would recognize as pardes. columns: (auto, 1fr), stroke: 0.4pt, [*core*], [layout, panes, modes, selection, click semantics, themes, text of the - UI. Pure state machine: `update(event)` mutates, `surface()` describes. No - syscalls, no rendering, no event loop.], - [*shell*], [one file per platform. Owns the event loop, translates native input + UI. Pure state machine: `update(event)` mutates, `render(arena)` returns the + surface. No rendering, no event loop, and no IO that has an effect for it — + but "no syscalls" was never true and is less true now: `look` reads a file + a Look opened, walks a directory for Find and reads every candidate for + Grep, `fonts` walks the font directories, and MuPDF opens a `.pdf`. Those + are the ones that are cheaper done in place than round-tripped through an + effect and back; everything with a lifetime — a pty, a window, the + clipboard — is still asked for.], + [*shell*], [one MODULE per platform (tty is one file; gui adds the CRT and + gamepad files, a C font loader and twelve GLSL shaders; web and macOS each + add a host language). + Owns the event loop, translates native input into core events, renders the core's surface, and performs the core's requested effects (spawn a shell, write a pty, open a link).], ) @@ -45,34 +55,48 @@ build today is a separate 800-line read-only replay viewer. In the rewrite, loading a dump of another instance is a first-class feature of the one application, the way acme handles dumps: `pardes -l state.zon` on every platform reconstructs the panes (terminals by replaying their raw VT streams -into fresh emulators, files and images from their bytes). The web shell embeds +into fresh emulators, files, images and PDFs from their bytes — a PDF rides the +dump's `image` kind, carrying its path, its bytes and the page it was on). The web shell embeds a dump and leaves `spawn` unanswered. Same core, no viewer fork. The boundary is two data types, both plain values: -*Event* (in): `key`, `text`, `mouse` (press/release/motion; button left, middle, -right; cell position), `wheel`, `pinch`, `resize`, and `output` (bytes a pty -produced, tagged with the pane id). Touch policy belongs to the shell: web maps +*Event* (in): `key` (which carries typed `text`), `mouse` (press/release/motion/ +drag; button left, middle, right and the four wheel directions; cell position; +and the `ctrl` flag, because Ctrl-left-click is goto-definition), `pinch`, +`touch_scroll`, `resize` (cols, rows, and — in a MuPDF build — the cell's pixel +size), `paste`, `pdf_scroll`, +`output` (bytes a pty produced, tagged with the pane id), `eof`, `command` (a +builtin line arriving from another process over the nested socket), `tick`, and +the answers to an ask: `lsp_resp`, `pipe_resp`, `file_changed`. Touch +policy belongs to the shell: web maps a one-finger tap to right-button LOOK and a drag past its tap slop to natural scrolling; native SDL keeps its two-finger gestures. A joystick cursor is a motion plus buttons. The shells do this translation and nothing else with -input: one event vocabulary, three dialects translated at the door. +input: one event vocabulary, four dialects translated at the door. -*Surface* (out): a grid of cells — grapheme, fg, bg, attrs — plus a cursor and -per-pane rectangles. This is the *canonical interface*: it is literally what the +*Surface* (out): `cols`, `rows`, a grid of cells — grapheme, fg, bg, attrs — a +cursor, and the pixel attachments. This is the *canonical interface*: it is literally what the tty shell hands to vaxis, cell by cell. SDL rasterizes the same grid through a glyph atlas; the browser reads a packed copy and patches native DOM cells. If it cannot be expressed in the surface, it does not -exist in pardes. (Pixel images ride along as an attachment per pane: the SDL -shells blit RGBA, the tty shell falls back to the petscii matcher, kitty -graphics when available.) +exist in pardes. (Pixel images ride along as a list of PLACEMENTS rather than +one per pane — a PDF pane contributes every page its viewport intersects, and +pages can be arbitrarily short. The SDL shells blit RGBA, the tty shell falls +back to the petscii matcher, kitty +graphics when available. The per-pane rectangles live on `Pardes`, not on the +surface: a shell that wants them asks the core.) *Effect* (out, queued): `spawn{pane, cwd}`, `write{pane, bytes}`, -`resize_pty{pane, cols, rows}`, `open_link{url}`, `read_file{path}`, -`new_file{pane, serial}`, `set_clipboard`, `read_clipboard`, `bell`, `quit`. -The core never performs IO; it asks — and `read_clipboard` is the one ask with -an answer coming back, an ordinary `paste` event, or nothing at all when the -shell cannot read the clipboard (most terminals refuse the OSC 52 read). This +`resize_pty{pane, cols, rows}`, `open_link`, `new_file{pane, serial}`, +`save_file{pane}`, `write_dump`, `set_clipboard`, `read_clipboard`, `lsp`, +`pipe`, `watch`, `quit`. +The core never performs IO for any of these; it asks — and four of the asks have an +answer coming back: `read_clipboard` returns an ordinary `paste` event (or +nothing at all when the shell cannot read the clipboard — most terminals refuse +the OSC 52 read), `lsp` returns `lsp_resp`, `pipe` returns `pipe_resp`, and +`watch` returns `file_changed` whenever the shell notices the file moved under +it. This is what makes the browser build honest instead of a fork: a wasm shell simply answers `spawn` differently (or not at all) — the core does not know. @@ -81,7 +105,7 @@ Platform divergence inside the core is a comptime tag, used the way the stdlib uses `os.tag`: ```zig -pub const Platform = enum { tty, gui, web }; +pub const Platform = enum { tty, gui, web, macos }; // in look.zig: if (platform == .web and target.kind == .url) return .{ .open_link = target.text }; @@ -94,32 +118,43 @@ divergence is visible in one screenful. = Data structures -The whole state is one struct, sized at init, no hidden allocation after: +The whole state is one struct, fixed-size where it can be. Panes themselves are +heap-allocated on demand and their contents (file bytes, the yank register, PDF +rasters, tree-sitter state) grow with what you open; everything else is sized +at init. ```zig Pardes - cols: []Col // col: weight + pane ids, top to bottom - panes: []Pane // slot array; id = index - active: Pane.Id - drag: Drag // none | select | move | border | scrollbar - theme: usize // index into themes (228 of them) + ncol + col_weight[6], col_terms[6][16], col_n[6] // columns as flat arrays + panes: [16]?*Pane // slot array; id = index + active: usize + drag: Drag // none | select | move | border_v | border_h | tag + theme_idx: usize // index into themes (228 of them) colors_on: bool - surface: Surface // rebuilt by surface(), arena-backed - effects: Fifo(Effect) + rects: [16]Rect // where each pane landed, this frame + effects: [4096]Effect + head/len // a fixed ring Pane - tag: TagLine // live prefix (mode, cwd/path) + editable tail - kind: union { term: Term, file: File, image: Image } + tag: TagLine // live prefix (cwd/path) + editable tail + kind: enum { terminal, file, image, pdf } // + independent optional payloads + vt, stream: ghostty-vt Terminal and its stream — on EVERY pane, not just + terminals, which is what lets the same keys and the + same parity suite drive a file and a shell + file: ?File / image: ?Image / pdf: ?PdfView vweight: f32 mode: enum { normal, insert, tty } // helix-modal; tty = raw to the pty + // `v` adds a fourth thing to DISPLAY, "select", + // which is a bool on top of normal, not a mode cursor: absolute body position // rides the scrollback, not the screen - sel: [3]Sel + line/char modal sels // per-button block sels, msel, vsel - edits: Splice // typed runs anchored to absolute rows - undo: edit snapshots // unified undo across term edits and file content + sel: [3]Sel + msel/vsel + sels[63] // per-button block sels, the line and + // char modal ones, and up to 64 cursors + ovl: ?Ovl // ONE typed run, anchored to an absolute row + undo: two stacks, not one — ed_undo[64] of overlay snapshots for a terminal, + // and File.undo of content snapshots for a file -Term = ghostty-vt Terminal + its stream (bytes in via Event.output) File = path + bytes + line index + Syn (tree-sitter highlight bytes) Image = decoded RGBA + petscii grid cache +PdfView = MuPDF document + per-page rasters + cached outline ``` Layout is arithmetic, not objects: columns are weights over the width, panes are @@ -133,21 +168,43 @@ one pane may not move panes it does not touch. TigerStyle, plus house rules proven in the prototype: imperative and flat; one big `update` dispatch, not handler objects; no one-line helpers — inline the four-line scan; assert invariants at entry (`assert(vsum > 0)`); static -allocation at init, arenas per frame. The metric is lines of code; the number -only goes down. As built, against the prototype's 12,072 lines of Zig: +allocation at init, arenas per frame. + +The metric was lines of code, and for the rewrite itself it held: 7,626 lines +replaced the prototype's 12,072 with three backends instead of one and a half. +It has not held since, and the table below is the honest version rather than +the flattering one. Everything after the rewrite — PDF, a language backend, a +fourth shell, 228 themes, multiple cursors — was added, not traded for +something removed: #table( - columns: (auto, auto, 1fr), + columns: (auto, auto, auto, 1fr), stroke: 0.4pt, - [*module*], [*lines*], [], - [core (pardes.zig + look.zig + syntax + image + dump)], [4,289], [all semantics, all platforms], - [modal.zig + petscii.zig (pure, unit-testable)], [1,410], [carried over, unchanged], - [shells (tty.zig; gui.zig = SDL native; web.zig + web/ = browser)], [2,768], [translate + render only], - [main.zig + build.zig], [484], [three targets, codegen for queries], - [*application total*], [*7,626*], [vs 12,072 — three full backends instead of one and a half], - [snapshot harness (snapshot.zig + e2e_harness.zig)], [831], [the parity oracle, kept], + [*module*], [*at the rewrite*], [*now*], [], + [core and the pieces that grew out of it — 25 files: pardes, look, syntax, image, dump, builtins, config, output/file/term panes, normal\_input, nested, fonts, themes, …], [4,289], [22,220], [all semantics, all platforms], + [modal.zig + petscii.zig (pure, unit-testable)], [1,410], [2,569], [carried over], + [pdf.zig], [—], [1,581], [MuPDF, `-Dmupdf`], + [lsp/ (seam + in-process ZLS backend)], [—], [1,663], [`.zig` only], + [shells: tty 1,396; gui 4,968; web 601; macos.zig 1,579], [2,768], [8,544], [translate + render only], + [main.zig + build.zig], [484], [1,471], [four targets, four codegen passes], + [*application total* — every `.zig` under `src/`, plus `build.zig`], [*7,626*], [*38,048*], [vs the prototype's 12,072], ) +Those six rows are a partition: no file is in two of them and none is left out, +which the old table could not say (its rows summed to 1,325 more than its own +total, and twenty-six files were in no row at all). What the total deliberately +does NOT count, because none of it is Zig under `src/`: 2,250 lines of Swift for +the macOS app and its icon generator, 1,541 lines of C bridging MuPDF, 549 of +JavaScript, HTML and CSS for the web shell, 216 of C for the SDL font loader, +`mupdf.zig` (355) at the root, and `tools/` + `build/` (896). The test tree is +another 5,234 lines of Zig across eight harnesses, plus 1,028 of Swift and 610 +of JavaScript — against 831 at the rewrite. + +Two things that number is not. It is not one program's worth of growth — the +macOS and web shells and the PDF and language work are four products sharing a +core. And it is not licence: the rule that survives is the local one, that a +change should leave the file it touches no longer than it found it. + = Testing: the old program is the oracle Before the rewrite compiled, the prototype got a harness (`snapshot.zig`, the @@ -156,8 +213,9 @@ script* (one line per input: keys, SGR mouse, resizes, sync points), and captures the rendered grid — text, cursor, and per-cell style runs — through its own ghostty terminal. Goldens are generated from the old binary (`zig build snap -- --update`); the new binary must reproduce them byte for -byte (`pardes-snap pardes/zig-out/bin/pardes`). Eighteen scripts cover the -checklist in Appendix A; all pass. Determinism pins: fixed workdir paths (they +byte (`pardes-snap pardes/zig-out/bin/pardes`). Eighteen scripts covered the +checklist in Appendix A at the rewrite; eighty-seven cover it and everything +since. All pass. Determinism pins: fixed workdir paths (they appear in tags), a controlled `$HOME` with `PS1='$ '`, `LC_ALL=C`, and a grid-stability sync primitive instead of timing guesses. @@ -169,36 +227,66 @@ text fields are the contract); and typed insert runs don't survive a dump replay (they are an overlay, not pty bytes — the prototype's replay viewer had the same semantics). -Shell correctness (that SDL draws the grid it was given, that vaxis diffs -correctly) is out of snapshot scope and covered by each shell's single smoke -test. +Shell correctness is no longer out of scope, and that is the biggest change to +this section since the rewrite. `web-snap` / `web-e2e` drive headless Chromium +over CDP with real DOM pointer and touch events and diff +`test/web-snapshots/`; `image-harness` and `pdf-harness` snapshot native PIXEL +output through kitty graphics and SDL; `macos-e2e` is an offscreen AppKit +snapshot suite over its own seven scripts. What remains untested by a snapshot +is the last hop — that vaxis diffs correctly onto a real terminal — plus each +shell's inline unit tests (the FreeType atlas raster, the trackpad and rotation +maths, the gamepad replay). = Build -`zig build` produces three statically linked artifacts: `pardes` (vaxis), -`pardes-gui` (SDL3), `pardes.wasm` + a vanilla DOM shell (wasm32-freestanding). -Native dependencies are ghostty, vaxis, uucode (shared config), zstbi, SDL -(castholm, lazy), FreeType, and zig-tree-sitter + grammars — all pinned through -`zig fetch` and wired in `build.zig`. Codegen during build, consumed by comptime: -`highlights.scm` → options module; tutor text → embedded pane content. Debug -builds are incremental for the seconds-loop; release builds are the product. +Every `zig build` builds ONE platform: `platform` is an option defaulting to +`.tty`, so a bare `zig build` gives `pardes` (vaxis) and the other three are +separate invocations — `-Dplatform=gui` for `pardes-gui` (SDL3), +`-Dplatform=web -Dtarget=wasm32-freestanding -Ddump=<dump.zon>` for +`pardes.wasm` plus a vanilla DOM shell (any other spelling of that one fails on +purpose rather than building something silently wrong), and `-Dplatform=macos` +plus the `macos-app` step for `pardes.app` wrapped around a static +`libpardes.a` on a Darwin host. Native dependencies are ghostty, vaxis, uucode (shared config), +zstbi, SDL (a pinned fork, lazy), FreeType, MuPDF (`-Dmupdf`, on by default +everywhere but the web, lazy), ZLS, mvzr (the regex engine behind `s`/`S`), and +zig-tree-sitter + 26 grammars — all pinned +through `zig fetch` and wired in `build.zig`. Generated during the build: +`highlights.scm` → an options module; the vendored helix/zed theme +sources → the generated half of the theme ring; the tracked `.zig` sources → +the web shell's read-only archive; eight GLSL shaders → SPIR-V. The tutor and +the embedded font are plain `@embedFile`s, not codegen. Debug builds are +incremental for the seconds-loop; release builds are the product. = What is deliberately absent No render abstraction over the shells (the surface *is* the abstraction). No -config files. No plugin system. No async runtime in the core — the shells may +plugin system. No async runtime in the core — the shells may thread, the core is single-threaded by construction. No 9P yet — but the -library boundary is exactly where acme put the file server, and a fourth shell -could serve `Surface` and `Event` over 9P without touching the core. +library boundary is exactly where acme put the file server, and a fifth shell +could serve `Surface` and `Event` over 9P without touching the core. Half of +that is already built and unnamed: `src/nested.zig` listens on a unix socket at +`$XDG_RUNTIME_DIR/pardes-<pid>.sock` (`~/.local/state/pardes` without one), +accepting exactly one verb — `Look <path>`, and nothing else, which is the +security property — and that is how +a `pardes <file>` run inside a pardes hands the file to the outer session +instead of stacking a second full-screen UI inside one of its panes. + +"No config files" held until the startup file (`docs/config.md`) arrived, and +that is the narrowest thing the phrase could still cover: a list of builtin +COMMANDS run before the first frame — no schema, no new vocabulary, and no key +remapping. The keymap is `src/config.zig`, compiled in, where a wrong binding +is a compile error rather than a silent no-op. = Appendix A: feature parity checklist From the prototype survey; every line is covered by at least one of the -eighteen event scripts in `test/snapshots/` (boot, tty, edit, scroll, modal, -look-file, look-dir, exec, tag, theme, tutor, windowops, dump, load, ttyonly, -syntax, fileedit, images). +event scripts in `test/snapshots/` — the original eighteen (boot, tty, edit, +scroll, modal, look-file, look-dir, exec, tag, theme, tutor, windowops, dump, +load, ttyonly, syntax, fileedit, images), and sixty-nine more added since for +everything below that the prototype never had. -*Layout.* Columns by weight (≤6), panes by vweight (≤16); global topbar; +*Layout.* Columns by weight (≤6), panes by vweight (16 panes in total, not +per column); global topbar; per-pane gutter (move box + scrollbar) and tag row; `splitBelow` shrinks only the source (cursor row kept visible); dying pane's weight absorbed by one sibling; emptied column hands width to a neighbor; border-drag resize on a @@ -223,13 +311,29 @@ first doc opens left column and may evict a lone pristine shell; later docs split below the existing doc — an output pane, `+Search`/`+Help`, is not a doc for either half of that rule: it never claims a column, it splits below whatever pane asked for it, and nothing splits from it), image ext → image -pane. Middle+left chord: kept +pane, `.pdf` → PDF pane. Ctrl+left is goto-definition, the one chord borrowed +from every editor with a language backend. Two spellings the word expansion +has beyond a path: `` @`ls -la` `` is taken WHOLE and runs as a command rather +than opening as a file, and `@p7:10:5` addresses a live pane by number for the +things — terminals, output buffers — that have no path to name. +Middle+left chord: kept left selection appended as trailing CLI argument. Wheel: scroll hovered pane, batched. -*Modes.* normal: helix motions (`h j k l w b e W B E 0 $ ^ gg ge gh gl G`, -`Ctrl-d/u/f/b`, `zt zz zb`), insert entries (`i a I A o O`), `v`/`x` -selections, `d c y p u U`, Enter=look Tab=execute at cursor. insert: +*Modes.* normal: helix motions (`h j k l w b e W B E 0 $ ^`, `f F t T` and +`Alt-.`, counts, `gg ge gh gs gl g| G`, `Ctrl-d/u/f/b`, `zt zz zb zj zk`), +insert entries (`i a I A o O`), selections (`v` extend — displayed as a fourth +mode name, "select" — `x`/`X`/`Alt-x`, `%`, `;`/`Alt-;`, `_`), MULTIPLE CURSORS +up to 64 (`C`/`Alt-C` copy, `s`/`S` select and split by regex with a live +preview, `Alt-s` split on newline, `,`/`Alt-,` keep and remove the primary, +`)`/`(` rotate, `Alt--`/`Alt-_` merge), operators (`d c y p P R u U`, `Alt-d` +delete-noyank, `J`, `>`/`<`, `~`/`` ` ``/`` Alt-` ``, `Ctrl-a`/`Ctrl-x`, +`Ctrl-c` comment-toggle), textobjects and surrounds under `m` +(`mm mi ma ms mr md`), the `]`/`[` pairs (`]p ]d ]D ]<space>`), `/` with `n`/`N`, +`|` to filter the selection through a command, `:` for the tag as a command +line, and Enter=look Tab=execute at cursor. Since the helix motion model +landed, a traversal motion SELECTS the range it crossed — which is why there is +no verb+noun grammar and why `i` after `w` types at the selection's start. insert: click-and-type; terminals get splice runs (shift right, never overwrite; absolute-row anchored), files get real edits. tty: raw pty forwarding (Ctrl-key toggle, default Ctrl-b, `--tty-toggle`), mouse still usable, @@ -252,21 +356,39 @@ Colors and Crt left it for their leader paths. OSC 7 cwd, DSR/DA/kitty-query replies (write_pty + device_attributes — the nushell/helix regression), greeting `ls`, auto-follow output unless navigating. File: line-number gutter (fixed width), tree-sitter highlights -(c/cpp/zig minimal tier; 25 grammars full tier; re-highlight on edit, +(c/cpp/zig minimal tier; 26 grammars full tier; re-highlight on edit, visible-range first), Save, open-at-line, undo/redo. Image: zstbi decode, kitty graphics when available, petscii matcher fallback (C64/terminal -palettes, ascii glyph set toggle). Tutor: embedded text as file pane. +palettes, ascii glyph set toggle). PDF (`-Dmupdf`, native default on): MuPDF +rendering as one continuous page strip, real text search, mouse text +selection, the document outline into `+PdfSections`, fit-width/fit-height and +a themed duotone tint — the last three named in the pane's own live tag. +Tutor: embedded text as file pane. + +*Language.* ZLS compiled in and called IN-PROCESS — no subprocess, no +JSON-RPC, no daemon and nothing cached between queries — behind a +one-function seam (`lsp.query`) so that swapping a backend touches nothing +else. `.zig` only, and on demand only: helix's five `g` gotos, ten builtins +under `SPC l`, `]d`/`[d`, `=`, and insert-mode Tab after a `.`. Answers become +rows in `+Search`, `+Hover` or `+Lsp` — output buffers of the same kind `/`, +Find and Help fill — or, for a rename, byte ranges the core applies in one undo. The +web shell has no threads and therefore no backend at all. *Chrome.* One theme per `.zig` file, folded into the ring at comptime: ours first — helix (default; near-black page, chrome one grey-ramp step off it, -colors lifted from the helix editor's own theme), dark, acme-light — then +colors lifted from the helix editor's own theme), dark, and the acme-light one +named simply `acme` — then everything `tools/gen_themes.zig` exports at build time out of the vendored helix `.toml` and zed `.json` sources in `vendor/themes`, which is all 214 helix -ships plus zed's 11, sorted by name. helix and dark leave -a child's ANSI palette native; acme-light and the zed exports resolve it onto +ships plus zed's 11, sorted by name. Names are unique by construction: helix's +own acme is vendored as `acme_helix.toml` so it cannot collide with ours, and +every zed theme takes a `_zed` suffix for the same reason. helix and dark leave +a child's ANSI palette native; acme and the zed exports resolve it onto the page so shell output stays readable on a light one. A theme owns the page, -the tag bar, the gutter and the move box; the selection colors stay fixed -because they encode which button you pressed. `NextColor` browses the ring one +the tag bar, the gutter, the move box and the SELECTION: `sel_bg`/`sel_fg` are +one pair per theme, and the three per-button tints and the dimmed extra cursors +are mixed off it, so what stays fixed is the distinction between buttons and not +the colours. `NextColor` browses the ring one step at a time — at 228 it is no longer how you REACH one — `Theme <name>` jumps to one and `ThemeSel` (`SPC t t`) lists them all into an output buffer whose rows are those very commands — execute a row (Tab, middle diff --git a/docs/helix-keys.md b/docs/helix-keys.md index 214a1280..eafe9a9c 100644 --- a/docs/helix-keys.md +++ b/docs/helix-keys.md @@ -57,8 +57,8 @@ Parity column (phase 5): **helix-verified** = matched field-by-field binding) — cannot mismatch a golden; **waived** = corpus-covered divergence with a reason in `test/hxcases/waivers.jsonl`; **out of corpus** = helix's own key and meaning, but the work leaves the core as an EFFECT the headless -differential has no shell to perform — the clipboard commands, and nothing -else. +differential has no shell to perform — the clipboard commands, the +language-backend queries, and the shell pipe. | Key | Behavior (pardes today) | Notes / quirks vs helix | Parity | | --- | --- | --- | --- | @@ -66,7 +66,7 @@ else. | `w` `b` `e` | select to next word start / prev word start / next word end | full helix model incl. landing conventions (block cursor one before the next word after `w`) and newline/punct/EOF edges | helix-verified | | `W` `B` `E` | long-word (WORD) variants | same | helix-verified | | `Home` / `End` | line start / line end | matches `goto_line_start` / `goto_line_end` | helix-verified | -| `0` / `$` / `^` | line start / line end / first non-ws | pardes extras — helix leaves these unbound (spells them `gh`/`gl`/`gs`); `0` is a count digit while a count is pending | pardes-specific | +| `0` / `$` / `^` | line start / line end / first non-ws | `0` and `^` are pardes extras — helix leaves those two unbound (it spells them `gh`/`gs`). `$` is NOT unbound in helix: it is `shell_keep_pipe` (`keymap/default.rs`), and taking it for line-end is a deliberate divergence — see the `$` row in C. `0` is a count digit while a count is pending | pardes-specific (`$`: deliberate) | | `G` | bare `G` is a **no-op**; `<n>G` = goto line n | vim-ism removed (phase 5): helix `goto_line` only acts with a count; `ge` is goto-last-line | helix-verified | | `gg` / `<n>gg` | goto first line / line n | | helix-verified | | `ge` | goto last content line | matches `goto_last_line` (ignores the trailing empty line) | helix-verified | @@ -104,6 +104,11 @@ else. | insert: `Enter` | newline; keeps the current full indent levels and adds one 4-space logical tab when the text before the cursor ends in `(`, `[`, `{`, or `)` (including `})`) | plain lines match `insert_newline`; delimiter heuristic is pardes-specific | helix-verified (plain) / pardes-specific (delimiter) | | insert: `Backspace` (+ `Shift-Backspace`) | delete prev char, joins lines at col 0 | matches `delete_char_backward`; `Ctrl-h` alias in B | helix-verified | | insert: `Up` `Down` `Left` `Right` | move cursor | matches helix's "not recommended" insert arrows | helix-verified | +| `gd` `gD` `gy` `gi` `gr` | LSP definition / declaration / type-definition / implementation / references. ONE answer jumps straight there; several fill `+Search`, where n/N walk and Enter opens | in-process ZLS (`src/lsp/lsp_zls.zig`), `.zig` only — on a file the backend does not speak these do nothing at all, with no error row. Ctrl+left-click is the mouse spelling of `gd` | out of corpus | +| `]d` `[d` / `]D` `[D` | step the diagnostics list / go to its last or first; if no list is up, asking the backend for one is part of the press | | out of corpus | +| `=` | `format_selections` — writes a `- old` / `+ new` diff into `+Lsp` | deliberate divergence: the seam returns ROWS, not edits, so this SHOWS the formatting instead of applying it. Not in the corpus, so there is no waiver to name — the query leaves the core as an effect the headless harness has no shell to perform | out of corpus | +| `Ctrl-o` / `Ctrl-i` | jumplist back / forward — the `Back` / `Forward` builtins, also on `SPC j o` / `SPC j i`, with `SPC j l` rendering the stack as a buffer | helix binds both keys (`jump_backward` / `jump_forward`) but to a POSITION jumplist; pardes' stack is over panes and focus, so the keys agree and the semantics do not. `Ctrl-i` and Tab are the same byte under the legacy encoding; there Tab keeps meaning execute, and the pair only separates where the host speaks the kitty keyboard protocol | pardes-specific | +| `\|` | pipe every selection through `/bin/sh -c`: its bytes in on stdin, its stdout replacing them, one undo across all cursors | helix's own key and meaning; the command is typed into the pane's tag after a bare `\|` marker rather than into a popup | out of corpus | ## B. To implement @@ -275,14 +280,14 @@ text. | `Ctrl-j` | insert newline (Enter alias) | | helix-verified (phase 5) | | `Home` / `End` | line start / line end past-the-last-char (`goto_line_end_newline`) | file panes (terminal insert cursor rides its run, as before) | helix-verified (phase 5) | | `PageUp` / `PageDown` | cursor page up / down, col kept (clamped to line) | file panes | helix-verified (phase 5) | -| `Tab` | insert a literal tab (`Key.tab` case + the text path both land `\t`) | file content is correct; NOTE: file-pane RENDERING of a literal tab has no tab-stop expansion (pre-existing — any tab-containing file shows the same); helix smart-tab skipped | helix-verified (phase 5) | +| `Tab` | indent to the next 4-column stop with SPACES (`insertTab`, `pardes.zig`: `pad = INDENT_W - col % INDENT_W`) — no `\t` byte ever reaches the file | helix's Spaces indent style; helix smart-tab skipped. After a `.` in a file the backend speaks, Tab instead asks for completion and only indents if the answer is empty (section A) | helix-verified (phase 5) | ## C. Skipped | Key(s) | Helix behavior | Reason | | --- | --- | --- | | `?`, `*`, `Alt-*` | rsearch / selection-as-pattern | search — pardes has its own `/` (plain substring into an output buffer, kept as-is) and an `n`/`N` that SELECTS the next look-able text instead of walking match hits; helix regex search machinery not wanted | -| `Space` mode, all rows but the clipboard menu (`f F e . b j g G k s S d D r a h ' w c C Alt-c / ?`) | pickers, LSP actions, global search, palette | helix's space mode is pickers + LSP, neither of which exists here — but the KEY is taken: pardes' own leader runs the acme builtins (section A). The clipboard menu is the half that DOES exist now: `<space>y Y p P R`, helix's letters on helix's leader, in section A | +| `Space` mode: `f F e . b j g G ' w c C Alt-c / ?` | pickers, global search, palette | pickers and the command palette do not exist here — but the KEY is taken: pardes' own leader runs the acme builtins (section A). Two halves of helix's space mode DO exist and are in section A: the clipboard menu (`<space>y Y p P R`, helix's letters on helix's leader) and the LSP menu, moved one prefix deeper to `SPC l k/r/a/h/s/S/d/D` because `d`, `k`, `s` and `h` were already pardes' most-pressed keys | | Popup `Ctrl-u`/`Ctrl-d`, Completion menu, Signature help tables | LSP popups | LSP | | Picker table (all rows), Prompt table (all rows) | picker / prompt internals | pickers — pardes' tag line is its own one-line editor | | `gn` `gp` `ga` `gm` | next/prev/alternate buffer | buffer nav — pardes panes aren't a buffer list | @@ -292,15 +297,15 @@ text. | `Alt-o`/`Alt-up`, `Alt-i`/`Alt-down`, `Alt-p`/`Alt-left`, `Alt-n`/`Alt-right`, `Alt-a`, `Alt-I`, `Alt-e`, `Alt-b` | syntax-node selection | tree-sitter | | `]f [f ]t [t ]a [a ]c [c ]e [e ]T [T ]x [x` | TS unimpaired jumps | tree-sitter | | `]g [g ]G [G` | git change jumps | needs VCS diff state | -| `gd gD gy gr gi`, `=`, `]d [d ]D [D`, insert `Ctrl-x` | definition/refs/format/diagnostics/completion | LSP | +| insert `Ctrl-x` | completion menu | completion exists, but not as a popup: insert-mode Tab straight after a `.` opens a buffer of candidate DECLARATIONS (section A). helix's menu itself is skipped | | `"` `<reg>`, insert `Ctrl-r` | register select / insert | registers — one yank register and no way to name a second; the system clipboard is not spelled as a register here either, it is the five `SPC` commands in A | | `Q` / `q` | record / replay macro | macros — needs replayable input log | -| `Ctrl-i` `Ctrl-o` `Ctrl-s` (normal) | jumplist forward/back/save | jumplist | +| `Ctrl-s` (normal) | save jumplist position | jumplist itself is implemented (`Ctrl-o`/`Ctrl-i`, section A); only the explicit save point is skipped | | `Alt-u` / `Alt-U` | undo-history earlier/later | history timeline — linear snapshot u/U covers pardes | | `K Alt-K`, `Alt-:` | regex keep/remove, ensure-forward | `K`/`Alt-K` are the same prompt `s`/`S` now have, filtering instead of splitting (`s S` moved to "Regex selection" in A, the rest of the family to "Multiple cursors") | | `&`, `Alt-(` / `Alt-)` | align selections, rotate selection CONTENTS | see the multiple-cursors table for why | | `Alt-J` | join + select the inserted space | marginal over `J` | -| `\|` `Alt-\|` `!` `Alt-!` `$` | shell pipe/insert/append/keep | shell — pardes executes via Tab / middle-click chords instead | +| `Alt-\|` `!` `Alt-!` `$` | shell pipe-to (output discarded), insert output, append output, keep-by-exit-status | shell — `\|` (`shell_pipe`, output replaces the selection) is implemented in section A; these four are the other members of helix's shell family. `$` is additionally taken for line-end here (section A) | | `:` | command mode | side-effects/file-ops — pardes builtins live in the tag, and `:` is bound to focusing it (section A) | | `gf` | goto file under selection | covered by pardes Enter-look | | `Ctrl-z` | suspend | pardes IS the terminal multiplexer | diff --git a/docs/lsp-evaluation.md b/docs/lsp-evaluation.md index 1756ec94..60e1442f 100644 --- a/docs/lsp-evaluation.md +++ b/docs/lsp-evaluation.md @@ -4,6 +4,17 @@ Same core, same seam (`src/lsp/lsp.zig`), same 17-probe harness (`zig build lspb over the same corpus. Three jj workspaces, three independent implementations, one function each. C landed; see **Decision** below. +> **This is a dated report, not a description of the tree.** Every MEASUREMENT +> below is the one taken at decision time and is deliberately left alone, +> because renumbering a comparison nobody can re-run turns a record into a +> guess. What has moved since: `lspbench` now has **22** probes rather than 17 +> (the dot-completion work added five), `src/lsp/lsp_zls.zig` has grown from 540 +> lines to about 1,400, `test/snapshots/` holds 87 scripts rather than 56, and +> the differential suites are `hxdiff` 481 / `hxparity` 561. The one number +> that IS kept current is the grammar count in the Recommendation, because that +> is an argument about today rather than a measurement of then. For what the +> harness does TODAY, read `docs/lsp.md`. + | | **A · stdlib** | **B · client** | **C · in-process** | |---|---|---|---| | change | `nvqpknzm` | `stuurqqt` | **landed** | @@ -107,7 +118,7 @@ second process, and its weakest number is a cache that does not exist rather than a limit that cannot be lifted. The one thing that should override that: **pardes ships tree-sitter grammars for -25 languages.** C is Zig-only forever; B is the only implementation that will +26 languages.** C is Zig-only forever; B is the only implementation that will ever answer `gd` in a Rust or Go buffer. If language intelligence is meant to follow the syntax highlighting, B is the strategic choice and its 721 lines are the cheapest multi-language client anyone will write. diff --git a/docs/lsp.md b/docs/lsp.md index bce9b2cc..0125f958 100644 --- a/docs/lsp.md +++ b/docs/lsp.md @@ -31,7 +31,11 @@ core shell worker The shell already ran this exact pattern for pty readers, so the async part is about thirty lines per shell: `tty.zig` uses `io.concurrent` + the vaxis loop queue, `gui.zig` uses a detached thread + the mutex queue it already had. The -web shell has no threads and no-ops the effect. +web shell compiles in no backend at all (`zls_backend` is off for wasm), which +makes `lsp.supports` empty, which makes `lspRequest` return before it emits — +so on the web the effect is never even raised. `web.zig` carries a prong for it +and exports `pardes_lsp_response` anyway; both are unreachable in the shipped +configuration and wait for a host that links a backend. Three rules make it safe: @@ -144,8 +148,10 @@ loses the whole switch to the parser's error recovery, taking with it every ancestor an expected-type resolution needs. ZLS answers this with a private token scanner welded to its `*Server`. `lsp_zls.completionSource` instead makes the tree PARSE — it splices a placeholder in after the dot, in the six -spellings a half-typed line can need (an identifier, and the same again closing -a prong, a statement, a paren or a brace), and keeps the one that both makes +spellings a half-typed line can need — three shapes, each with and without a +closer still hanging: a switch prong (`_p => {},` / `_p => {}, }`), an +unterminated statement (`_p;` / `_p)`), and a bare identifier (`_p` / `_p }`) +— and keeps the one that both makes the dot reachable in the tree and leaves the fewest parse errors. Everything after that is ZLS's ordinary public resolution over an ordinary tree. @@ -164,7 +170,7 @@ Per press, measured by `zig build lspbench` on this repo: | | ReleaseFast | Debug (what `zig build` installs) | |---|---|---| -| a switch arm in `src/pardes.zig` (12.8k lines) | 8.8 ms | 87 ms | +| a switch arm in `src/pardes.zig` (14.6k lines) | 8.8 ms | 87 ms | | `std.` — 91 candidates, each alias-resolved into the stdlib | 26 ms | 204 ms | It is a worker thread, so the editor does not block; but the second press of @@ -261,7 +267,8 @@ document — which matters precisely when the pane you are in is the problem. ## Writing a backend `src/lsp/lsp.zig` is the seam. An implementation supplies three things and touches -nothing else: +nothing else (`backend_name` below is the SEAM's, not yours — it is a literal in +`lsp.zig` naming whichever backend was compiled in): ```zig pub fn query(gpa, arena, req: Req, out: *std.Io.Writer) void @@ -280,16 +287,26 @@ read is in `req` (`path`, `source` (NUL-terminated), `offset`, `arg`, `root`). `Io.Writer.Allocating`), so a backend never allocates the result, never frees it, and cannot get the allocator wrong. `arena` is freed wholesale on return; `gpa` is for a backend's own scratch. Use `lsp.row()` to emit a location, -`lsp.rel()` to spell its path against `req.root`, `lsp.lineCol()` to convert an -offset, and `lsp.edit()` for each half-open range of a rename response. Location +`lsp.spanRow()` for one that carries the RANGE it matched (the +`path:LINE:COL-ENDCOL` form above), `lsp.rel()` to spell a path against +`req.root`, `lsp.lineCol()` to convert an offset, and `lsp.edit()` for each +half-open range of a rename response. Location rows are byte-identical across backends; rename ranges are consumed by the core and never rendered. `rel` allocates nothing — it returns a slice of what you hand it. ## How the implementations are judged -`zig build lspbench` — same harness, same corpus (pardes's own `src/`), same 22 -probes, every backend. +`zig build lspbench` — same harness, same corpus, same 22 probes, every backend. +The corpus is pardes's own `src/`, plus `test/lspfixture/`: five of the probes +point at fixtures rather than at real source, because on clean, already +formatted code the correct answer to `diagnostics` and `format` is nothing, and +that is indistinguishable from a backend that has neither. `broken.zig` carries +an unused local and a misformatted fn; `dotcomplete.zig` and `dothalf.zig` +carry the two shapes of half-typed dot. The 22 probes cover 15 of the 17 +`lsp.Kind`s +— `definition` three times, `document_symbols` twice, `completion` five times, +and the two introspection kinds (`status`, `explain`) not at all. - **Feature completeness.** Which kinds return rows, and whether the rows contain what they should. The harness trusts *results*, not the `supports` diff --git a/docs/macos.md b/docs/macos.md index ff19ff93..12e598b5 100644 --- a/docs/macos.md +++ b/docs/macos.md @@ -28,7 +28,7 @@ Pardes goes the other way because its frame is *already* a cell grid. draw one: attributed runs, the system font stack, and Apple's own subpixel and color-emoji handling, for free. The alternative is a hand-rolled glyph atlas, and the SDL backend is the measurement of what that costs — roughly three -thousand of `src/gui/gui.zig`'s 4,300 lines are a 2048² FreeType-hinted R8 atlas, +thousand of `src/gui/gui.zig`'s 4,700 lines are a 2048² FreeType-hinted R8 atlas, GPU pipelines, transfer buffers and shaders. Writing a second one, blind, buys nothing the grid needs. @@ -74,8 +74,9 @@ reach for itself. `pardes_frame_cells` hands back a pointer valid until the next `pardes_frame`, with `pardes_frame_cols`/`_rows` giving its shape. The cursor rides alongside as `pardes_cursor_x`/`_y`, each `-1` when it is hidden, plus `pardes_cursor_bar` -asking for a thin insert caret instead of a block. `Surface.images` has no -representation here yet; see the checklist. +asking for a thin insert caret instead of a block. `Surface.images` crosses +separately as `pardes_frame_images` / `pardes_frame_image_list` — see "Pixel +attachments" below. **Input.** `pardes_key` takes a codepoint and the host's already-composed text, because composition is AppKit's job and the core only ever wants finished @@ -106,10 +107,12 @@ native PDF placement path reads — pass the backing-store size, not points. copied by value during init so the struct need not outlive the call. `wakeup` means "your state moved, please pump me". `set_clipboard` hands over text to put on the pasteboard, borrowed for the duration of the call; it fires inside a tick -for the five `SPC` clipboard words and for the tag's own `y` chord, and for +for `SPC y` / `SPC Y` and for the tag's own `y` chord, and for nothing else — an ordinary `y` or `d` writes the core's register and never reaches here, which is what stopped deleting a character from clobbering the -desktop's clipboard. `read_clipboard` is that direction reversed: "give me the +desktop's clipboard. The other three clipboard words — `SPC p`, `SPC P`, +`SPC R` — go the OTHER way and raise `read_clipboard` instead. +`read_clipboard` is that direction reversed: "give me the pasteboard", with no payload either way, because the host answers by calling `pardes_paste` — and NSPasteboard being synchronous, that usually happens inside the callback itself, before it returns. Both are main thread, inside @@ -227,8 +230,8 @@ its own — `momentumPhase` belongs to scroll — so the release speed is measur here, off the monotonic clock, as a smoothed degrees-per-second over the event stream. -The curve is the point. Momentum ramps up **from zero** at a 70°/s floor rather -than switching on at it: +The curve is the point. Momentum is scaled off the EXCESS over a 70°/s floor +rather than being a flat amount the moment the floor is crossed: ```zig excess = min(|speed| - rotation_fling_floor, rotation_fling_max) @@ -236,8 +239,11 @@ excess = min(|speed| - rotation_fling_floor, rotation_fling_max) A plain threshold would hand out two free notches the instant it was crossed, and the same gesture a hair quicker jumping twice as far is how a control stops -feeling like a control. So a slow, deliberate turn coasts not a little but not -at all, and the harder it is thrown the further it goes — bounded, by the cap, +feeling like a control. There is a second floor under that one: an excess below +`rotation_fling_stop` (18) coasts at zero, so 70–88°/s is a dead band and the +smallest coast that happens at all is 18°/s — under a fifth of one notch, which +is why a slow deliberate turn still spends no notches at all. The harder it is +thrown the further it goes — bounded, by the cap, at about eleven matches for the hardest flick a trackpad can report. Two things stop a fling that was never thrown. A release more than 90 ms after @@ -293,7 +299,9 @@ click went where the pointer was. and Cmd-click for the path, the filename, and the dot in the close button. There is no document architecture behind this and deliberately so: no -`NSDocument`, no save panel, no "do you want to save" on close. Save is a +`NSDocument`, no save panel, no "do you want to save" on close. (One piece of +document chrome does exist, and it is the harmless one: File ▸ Open… runs a +real `NSOpenPanel` and hands what you pick to Look.) Save is a builtin, the pane's tag already says so, and this is the same two facts spelled where a Mac user looks for them. A terminal or an output buffer is not a document, so focus landing on one clears the icon and puts the title back to @@ -309,6 +317,41 @@ shell reads it; it exists because a windowed host has somewhere to put the answer. It is marked at ask-time rather than on completion because `save_file` carries none back, which makes it exactly as honest as the tagline already was. +## The menu bar, and the chords the core never sees + +A Mac app without a menu bar is a Mac app that is wrong, and most of what a +menu bar wants to say pardes already has a word for. So the menu is mostly a +second spelling of builtins — `AppDelegate` calls `run("New")`, `run("Save")`, +`run("Help")`, `run("Tutor")` — and the items with no builtin behind them are +left out rather than stubbed. + +| menu | item | chord | what it does | +|---|---|---|---| +| pardes | About pardes | — | AppKit's panel | +| | Hide pardes / Hide Others / Show All | ⌘H / ⌥⌘H / — | AppKit | +| | Quit pardes | ⌘Q | AppKit | +| File | Open… | ⌘O | a real `NSOpenPanel`, then Look on what you picked | +| | New | ⌘N | the `New` builtin | +| | Save | ⌘S | the `Save` builtin | +| | Close Window | ⌘W | AppKit; the app terminates after the last one | +| Edit | Paste | ⌘V | the view's own paste path, not a second one | +| View | Zoom In / Zoom Out / Actual Size | ⌘= / ⌘- / ⌘0 | point size, host-side | +| Window | Minimize / Zoom | ⌘M / — | AppKit | +| Help | pardes Help | ⌘? | the `Help` builtin | +| | Tutorial | — | the `Tutor` builtin | + +Edit holds Paste and nothing else. Copy, Cut, Undo and Select All are +deliberately absent: pardes's own words for those are `SPC y`, the 1-2 chord, +`u` and `%`, and a menu item that ran a different thing under the same name +would be worse than no item. + +The consequence is worth stating plainly, because it is invisible from the +core's side: those chords are now **the menu's**, and the core can never see +them. Nor can it see any other Command chord — the ABI's modifier mask carries +ctrl, alt and shift and has no super bit, so `PardesView` swallows Cmd rather +than sending a key the core would misread as unmodified. Cmd is the host's +layer here; everything pardes binds lives on the other four. + ## When a gesture looks like it did nothing All three verbs are cheap to mistake for broken, because acme's verbs are about @@ -325,7 +368,8 @@ the *word under the pointer* and most words resolve to nothing: with no results buffer anywhere still steps the pane in front of you. A screen with no filename on it is what has nothing to step. -`PARDES_LOG=1` prints every decoded gesture to stderr — the fingers counted, the +Setting `PARDES_LOG` at all — the gate tests presence, not value, so even +`PARDES_LOG=0` counts — prints every decoded gesture to stderr: the fingers counted, the stream it came in on, the button it resolved to, the pressure stage, the rotation degrees. It exists because which events a trackpad produces is decided by hardware plus four System Settings switches this process cannot read, and @@ -430,7 +474,7 @@ collection, derives bold and italic from it, and re-measures. A file it cannot wear leaves the screen exactly as it was — a terminal that cannot draw has no way back out of itself. -Zoom does not touch the core at all. Cmd+, Cmd- and Cmd+0 change the point size, +Zoom does not touch the core at all. Cmd+=, Cmd- and Cmd+0 change the point size, `Metrics` is rebuilt, and the new cell is reported through the same resize path a window drag uses; the core reflows to a different number of columns and knows nothing about points. Cmd+= rather than Cmd++ because AppKit matches the @@ -547,11 +591,17 @@ blank window for every opaque theme the moment it was hidden. ## Threading -One core, touched only from the main thread, plus one pty reader task per pane. -A reader blocks in `read(2)`, appends into that pane's mutex-guarded buffer, and -calls `wakeup`; the next tick swaps the buffers under the lock and feeds the -bytes in as `output` events. Sixteen panes is the ceiling (`MAX_PANES`), so it -is sixteen threads worst case, each of which does nothing but move bytes. +One core, touched only from the main thread, plus one pty reader task per pane +and one socket listener for the nested-pardes protocol. A reader blocks in +`read(2)` and pushes into ONE process-wide `Inbox` — a bounded ring of tagged +messages, not a buffer per pane — then calls `wakeup`; the next tick drains the +ring wholesale and feeds the bytes in as `output` events. The ring is lossy +under sustained backpressure: an `output` message can be dropped, and `eof` and +`command` will evict a queued `output` to get in, because losing a byte of +scrollback is survivable and losing the end of a pane is not. Sixteen panes is +the ceiling (`MAX_PANES`), and the readers run on a default-sized +`std.Io.Threaded` pool, so the thread count is the pool's rather than one per +pane. Ghostty again is the contrast: it runs a renderer thread *and* an IO thread per surface, each with its own mailbox and wakeup, because it owns the frame clock @@ -593,10 +643,17 @@ through `ranlib` first, because ld64 otherwise refuses zig's layout outright missing, which links almost far enough to look like a source problem. ```sh -zig build -Dplatform=macos # leaves a signed zig-out/pardes.app +zig build -Dplatform=macos # zig-out/lib/libpardes.a + include/pardes.h +zig build macos-app -Dplatform=macos # ...and a signed zig-out/pardes.app zig build macos-dmg -Dplatform=macos # ...and zig-out/pardes.dmg to hand over ``` +All three need a Darwin host: the app branch is gated on +`builtin.os.tag.isDarwin()`, and off Darwin `macos-app` and `macos-dmg` resolve +to an explicit build failure rather than a bundle that could not have been +signed. A plain `zig build -Dplatform=macos` still gives you the library and +the header anywhere, which is what the Linux dev loop below uses. + The bundle is assembled by `build.zig` itself, not by a script it shells out to. An `.app` is a directory with a plist, a binary and an icon in it, and each of those is one step whose inputs the build graph knows — so the app rebuilds @@ -625,7 +682,7 @@ system to keep in step for what three `addInstallFileWithDir` calls already do. following `-Doptimize` so both halves of the app are built the same way: ```sh -swiftc -O -target arm64-apple-macos13.0 \ +swiftc -O -target <host-arch>-apple-macos13.0 \ -import-objc-header src/macos/pardes.h \ -o <cache>/pardes \ src/macos/Sources/{main,AppDelegate,PardesView}.swift \ @@ -633,6 +690,11 @@ swiftc -O -target arm64-apple-macos13.0 \ -framework AppKit -framework CoreText -framework CoreGraphics ``` +The arch is derived from the build target, which defaults to the host — `arm64` +on Apple silicon, `x86_64` on an Intel Mac. What is genuinely missing is a +UNIVERSAL binary: there is no `lipo` step anywhere, so a bundle built on one +arch runs on that arch. + The header goes in through `-import-objc-header` rather than a module map, because the header is read straight out of the source tree and there is nothing to stage; a module map is what an *xcframework* needs, and there isn't one. @@ -716,16 +778,24 @@ prohibited) `NSWindow`, over a real core with real ptys: ```sh zig build macos-e2e -Dplatform=macos # run it zig build macos-e2e -Dplatform=macos -- --update # regenerate the goldens -zig build macos-e2e -Dplatform=macos -- test/macos-snapshots/rotate.snap ``` +The step always hands the harness the whole `test/macos-snapshots` directory, +so naming one script after `--` runs it IN ADDITION to the suite rather than +instead of it. To run a single script, invoke +`zig-out/bin/pardes-macos-e2e test/macos-snapshots/rotate.snap` directly. + `test/macos_e2e.swift` links the same Swift sources the app does, minus `main.swift`, into a second binary — test scaffolding does not ship inside the -product. Scripts are `test/macos-snapshots/*.snap` and speak the tty suite's -vocabulary (`start`, `wait`, `stable`, `text`, `key`, `snap`) plus what only +product. Scripts are `test/macos-snapshots/*.snap` (seven of them: boot, cwd, +drop, font, keys, rotate, trackpad) and speak the tty suite's +vocabulary (`start`, `wait`, `stable`, `text`, `key`, `snap`, `command`, +`mouse`, `click`, `wheel`, `resize`, `draw`) plus what only exists here: `fingers <n>`, `force`, `rotate <degrees> [gap_ms]`, `rotate_end`, -`drop <path> <col> <row>`, -`scroll`, `haptic <none|exec|look>` and `draw`. The dial's two extras are what +`drop <path> <col> <row>`, `scroll <rows> <col> <row>`, +`haptic <none|exec|look>`, `nsclick` (the AppKit-event path, as opposed to +`click`'s direct entry-point call), `font <name>`, `zoom` and `clipboard`. +The dial's two extras are what make momentum testable at all: the optional gap is a real sleep before the event, so a script can say how FAST the dial is being turned, and `rotate_end` is the release the fling is measured from. Output is byte-identical in shape to @@ -785,13 +855,15 @@ for exactly that reason. - **The `lsp` effect.** Needs a worker plus a snapshot of the pane's path and content taken *before* it starts, as `LspJob` in `tty.zig` does; the core - keeps editing while a query is in flight. Until then language queries are - dropped and nothing waits for an answer. + keeps editing while a query is in flight. Until then every query is answered + with an EMPTY `lsp_resp` rather than dropped — dropping one leaves the + keystroke that asked (insert-mode Tab after a dot) waiting forever, and dead + for the rest of the session. - **The `pipe` effect.** Selection filters need `pipeRequest(id)` copied into a job, a worker to run the command, and a `pipe_resp` event back. Same shape as `lsp`, one more response type. - **The `watch` effect.** `watchPane` is inotify and returns silently off Linux - (`ponytail:` at `src/tty/tty.zig:1035`). macOS wants the FSEvents half of + (`ponytail:` at `src/tty/tty.zig:1183`). macOS wants the FSEvents half of `std.Build.Watch`, which the standard library already has as `Build/Watch/FsEvents.zig`. Without it the core simply never receives `file_changed`, a state it tolerates because the browser has no filesystem @@ -827,4 +899,4 @@ for exactly that reason. is one `-Dmacos-identity=` away and notarization one `notarytool` call. Still absent: a universal binary, bundled fonts, localization. The app has an icon, a plist that says what it opens, a deployment target it actually enforces and - a signature; the arm64-only slice is the deliberate remaining gap. + a signature; the missing universal binary is the deliberate remaining gap. diff --git a/docs/web.md b/docs/web.md index 339509d2..ddc09d35 100644 --- a/docs/web.md +++ b/docs/web.md @@ -31,6 +31,30 @@ zig build web \ The output is in `zig-out/web`. Serve that directory over HTTP; browsers do not allow a useful WASM module load from `file:` URLs. +The browser shell has no argv: every command-line flag `src/main.zig` parses — +`--tty`, `--tty-toggle`, `-n`, `-l`, `--nested`, `-h`, and the positional +file-or-directory — is native-only, because the wasm module roots at +`src/web.zig` and never links `main.zig`. State comes from the embedded dump +instead. + +What is genuinely absent is narrower than "no IO". The module has no threads +and no host filesystem, so there is no startup config file, LOOK resolves +against the build-generated source archive rather than disk, and no language +BACKEND is compiled in (`zls_backend` is off for wasm — which also means +`lsp.supports` is empty, so the core never even raises a language query there; +`web.zig`'s prong for it is waiting for a host that links one). + +The EFFECTS themselves are all still emitted, each as a numbered code across +the ABI: `spawn` 1, `write` 2, `resize_pty` 3, `open_link` 4, `save_file` 5, +`write_dump` 6, `set_clipboard` 7, `lsp` 8, `watch` 9, `quit` 10, `new_file` +11, `pipe` 12, `read_clipboard` 13. Inbound, `pardes_output`, +`pardes_set_cwd`, `pardes_eof`, `pardes_paste` and `pardes_lsp_response` +exist to answer them. A plain page ignores most of those and gets a replay +viewer; a +process-capable host (the `pardes-io` events above) answers them and gets +terminals. The core does not know the difference — that is the point of the +seam. + Two dependency-free test layers cover the boundary: ```sh diff --git a/src/builtins.zig b/src/builtins.zig index 39a147fa..8b3d44d0 100644 --- a/src/builtins.zig +++ b/src/builtins.zig @@ -217,9 +217,10 @@ pub const Colors = struct { }; /// Soft wrap: a file line too long for the pane renders across several body -/// rows instead of running off the right edge. Global like Colors, and off by -/// default for the same reason — it changes what every file pane looks like, -/// so it is a switch you flip once rather than something a pane carries. +/// rows instead of running off the right edge. Global, the way Colors is — +/// it changes what every file pane looks like, so it is a switch you flip +/// once rather than something a pane carries. ON by default (Pardes.wrap_on), +/// so this is the word that turns wrapping OFF and gives hscroll back. pub const Wrap = struct { pub fn run(c: Ctx) void { c.p.wrap_on = !c.p.wrap_on; @@ -361,8 +362,9 @@ pub const Font = struct { /// ...and the list of what Font takes: every MONOSPACE font on the machine, /// one `Font <name>` row each, in the picker ThemeSel already is (rows that -/// are commands, so n/N execute them — walking the list wears each font in -/// turn and picking one is stopping on it). +/// are commands, so n/N select each one WHOLE and Tab runs it — walking with +/// n and pressing Tab wears each font in turn, and picking one is stopping +/// there). /// /// Monospace only, which is the one judgement in the feature: the grid is a /// fixed cell, so a proportional face is not a worse-looking option but an diff --git a/src/config.zig b/src/config.zig index d6d6813d..107eb1a7 100644 --- a/src/config.zig +++ b/src/config.zig @@ -371,8 +371,10 @@ pub const tag_right_pad: u16 = 20; /// mark that already means its mode somewhere else: `^` is the proofreader's /// caret, the mark that says text goes in HERE; `$` is the shell prompt, and a /// pane wearing it has the keyboard wired straight to the program on the other -/// end; `•` is the pane at rest, a full stop, nothing waiting to eat what you -/// type. (The caret's true form is `‸` U+2038 and the ASCII `^` is only its +/// end. NORMAL is a SPACE, and the empty box is the point: a pane at rest has +/// nothing waiting to eat what you type, and two thirds of the screen wearing +/// a bullet would be two thirds of the screen saying nothing loudly. (The +/// caret's true form is `‸` U+2038 and the ASCII `^` is only its /// stand-in — but `^` is in every font ever made and `‸` is in about four, and /// a mode badge that renders blank on someone's terminal is worse than one /// spelled with the near-miss.) @@ -672,8 +674,8 @@ pub const lsp_buffer = "+Lsp"; // ============================================================================ // PART 3 — THE HELIX KEYMAP. READ THIS BEFORE RETARGETING ANYTHING BELOW. // -// These are not free choices. `zig build hxdiff` (360 cases) and -// `zig build hxparity` (440 cases) are DIFFERENTIAL suites: they drive a real +// These are not free choices. `zig build hxdiff` (481 cases) and +// `zig build hxparity` (561 cases) are DIFFERENTIAL suites: they drive a real // helix and this core with the same keystrokes and compare the results, and a // mismatch is a failure, not a diff to accept. Moving a key here therefore // breaks the build until the divergence is written down as a waiver with a diff --git a/src/lsp/lsp.zig b/src/lsp/lsp.zig index 29e82968..255a8200 100644 --- a/src/lsp/lsp.zig +++ b/src/lsp/lsp.zig @@ -22,7 +22,10 @@ const std = @import("std"); /// What the caller wants to know. The helix command each one backs is named -/// alongside, because the keymap is helix's and these are its verbs. +/// alongside, because the keymap is helix's and these are its verbs — helix's +/// bare `<space>X` spelled `SPC l X` here, because `d`, `k`, `s` and `h` were +/// already pardes's own most-pressed leader keys and the rest follow them into +/// the group rather than splitting the menu (see config.leader_path). pub const Kind = enum { /// gd definition, @@ -34,23 +37,23 @@ pub const Kind = enum { implementation, /// gr references, - /// SPC k + /// SPC l k hover, - /// SPC s + /// SPC l s document_symbols, - /// SPC S (arg = the query) + /// SPC l S (arg = the query) workspace_symbols, - /// SPC d, and the list that ]d / [d step + /// SPC l d, and the list that ]d / [d step diagnostics, - /// SPC D + /// SPC l D workspace_diagnostics, - /// SPC r (arg = the new name) + /// SPC l r (arg = the new name) rename, - /// SPC a + /// SPC l a code_action, /// = format, - /// SPC h + /// SPC l h select_refs, /// Tab in insert mode, with a `.` immediately before the cursor. NOT an /// autocomplete popup — the seam returns locations, so this answers "what @@ -196,9 +199,12 @@ pub fn query(gpa: std.mem.Allocator, arena: std.mem.Allocator, req: Req, out: *s } /// ZLS, linked in as a module and called directly — no subprocess, no -/// JSON-RPC. See `lsp_zls.zig`. The web shell has no threads, never emits the -/// effect, and cannot build ZLS anyway, so there it is the empty backend the -/// base tree shipped with. +/// JSON-RPC. See `lsp_zls.zig`. The web shell cannot build ZLS (no threads, +/// freestanding wasm), so there it is the empty backend the base tree shipped +/// with — and empty means SILENT rather than failing: `supports` below is then +/// an empty set, `lspRequest` returns on it before emitting, and the effect +/// never leaves the core. `web.zig`'s prong for it is waiting for a host that +/// links a backend, not dead weight for one that never will. const backend = if (@import("pardes_config").zls_backend) @import("lsp_zls.zig") else struct { pub fn query(_: std.mem.Allocator, _: std.mem.Allocator, _: Req, _: *std.Io.Writer) void {} pub fn speaks(_: []const u8) bool { @@ -221,5 +227,7 @@ pub const supports: std.EnumSet(Kind) = backend.supports; /// knowing, so the list of extensions stays the backend's business. pub const speaks = backend.speaks; -/// Name shown by the harness and in `SPC ?`. Each implementation renames it. +/// Name shown by the harness and in `SPC ?`. This is the SEAM's, not the +/// backend's: a backend does not declare it, so renaming a backend means +/// editing this line. pub const backend_name = "zls-inproc"; diff --git a/src/macos/icon.swift b/src/macos/icon.swift index 2e775660..5c7dd881 100644 --- a/src/macos/icon.swift +++ b/src/macos/icon.swift @@ -65,7 +65,8 @@ let cornerFraction: CGFloat = 0.2237 // GLENDA, as ellipses. Four for the silhouette, filled as ONE path so the // overlaps vanish under nonzero winding and she is a single shape rather than -// four stuck together, then two eyes punched back out in the ground colour. +// four stuck together, then two eyes and a nose punched back out in the +// ground colour. // // Ellipses and not a traced outline for the reason everything else here is a // fraction: the mark has to survive being twelve pixels across. An outlined diff --git a/src/pardes.zig b/src/pardes.zig index ae6c4cbc..da6e540c 100644 --- a/src/pardes.zig +++ b/src/pardes.zig @@ -6798,7 +6798,11 @@ pub const Pardes = struct { /// ponytail: mvzr searches from each match's end, so `^` and `$` assert /// against THAT position rather than against a line the way helix's /// multi_line regex does, and `.` matches a newline like any other byte. - /// Both are waived cases; `[^\n]` is the workaround for the second. + /// Both are waived. `[^\n]` LOOKS like the workaround for the second and + /// must not be suggested as one: the live preview compiles every prefix, + /// and the prefix `[^\` panics mvzr (index out of bounds in parseCharSet, + /// mvzr.zig valueFor) before the pattern can ever be finished. Guarding + /// the compile is what would make the advice sayable. fn applySelRegex(p: *Pardes, pane: *Pane, pat: []const u8, split: bool) void { const pl = p.paneCursorLines(pane) catch return; const text = p.flatSurface(pane, pl) catch return; diff --git a/src/tutor.txt b/src/tutor.txt index fe80c9e3..9c73e5c9 100644 --- a/src/tutor.txt +++ b/src/tutor.txt @@ -18,23 +18,35 @@ over. Modal editing (helix-style) is layered on top of that. Three modes (the BOX at the pane's top-left corner shows which): - • NORMAL block cursor, keys move/edit. DEFAULT on startup. + NORMAL block cursor, keys move/edit. The box is BLANK: a pane + at rest has nothing waiting to eat what you type. ^ INSERT keys type text at the cursor. $ TTY keys go straight to the shell. (terminals only) - This tutor is in THREE parts, ordered by what's most different from + A bare `pardes` opens one shell already in TTY — there is nothing to + edit yet. Give it a file or a directory and you start in NORMAL. + + This tutor is in FOUR parts, ordered by what's most different from editors you may know: PART 1 — the MOUSE. Acme's three buttons; nothing like Vim/Helix. PART 2 — the TTY. A terminal is just a pane; Ctrl-b (or Shift-Esc) drops into it. PART 3 — the KEYS. Helix-style modal (with the Pardes differences). + PART 4 — the REST. Panes that are not text (PDFs, images), the + language backend, and the chrome you can change. PRACTICE BLOCKS (part 3): the "# keys:" line lists keystrokes (space-separated; esc/enter/bs are special, the rest type each char). The clean lines under "# before" are what you practice on; the lines under "# after" are what you should end up with. "# at: row,col" - (right after # keys:) sets where the cursor starts. These blocks are also run as unit - tests (generated from this file by tutor_gen). + (right after # keys:) sets where the cursor starts. They are here to be + TYPED, and that is all they are — nothing runs them. What pins the real + behaviour is two suites. `zig build hxdiff` replays every case in + test/hxcases against GOLDENS recorded from a real helix, and fails on + any difference that is not written down as a waiver with a reason. + `zig build hxparity` runs those cases, and a file of editing extras, + twice inside pardes — once in a file pane, once in a shell — and + demands the two agree. Hold j to reach part 1. @@ -56,9 +68,11 @@ │ │ └─────────────────────────────┘ - L select a plain click also FOCUSES the pane and PINS the modal - cursor where you click, so you can edit there next. - A click never changes a pane's MODE (tty stays tty). + L select a plain click also FOCUSES the pane and, outside tty + mode, PINS the modal cursor where you click so you can + edit there next. On a DOCUMENT it also drops you into + normal mode; a terminal keeps the mode it had, so tty + stays tty. M execute run the selected text: a builtin name runs it, anything else is SENT to the shell the pane runs. This is how you run a command you typed in a text mode. @@ -66,8 +80,9 @@ opens/focuses a terminal there and ls's it; a file opens a file pane (scrolled to a ":line" suffix if present). A bare name is tried in THIS pane's directory first, then - in every other open pane's, most recently used first — a - name none of them holds is what becomes a search. + in the directories of the panes you have BEEN in, newest + first and each directory tried once — a name none of them + holds is what becomes a search. WEB TOUCH (one finger): a tap is LOOK, the same action as R; a drag past a small movement threshold is natural scrolling. @@ -80,8 +95,9 @@ opened source uses tree-sitter syntax colors. A touch beginning on a tagline or pane separator instead latches a left-mouse gesture, so layout drags never scroll. - Touch circles/trails and the LOOK flash appear only while - the Debug builtin is on. + Touch circles/trails and the click flash are the SDL + build's debug overlay, drawn only while the Debug builtin + is on. The browser draws no such thing. SELECT-THEN-ACT: - MIDDLE-drag over text selects AND runs it on release (one gesture); @@ -98,13 +114,15 @@ keeps it. After a chord the left release is inert. 2-1 hold a MIDDLE drag over a command, tap LEFT: the kept left selection rides along as the command's ARGUMENT. No selection - in that pane? The other panes' are searched (active pane first) - — a kept left selection or a v/x one, wherever it lives. + in that pane? The pane the drag started in is asked first, then + the active one, then the rest — a kept left selection or a v/x + one, wherever it lives. 2-3 / 3-1 / 3-2 tapping the other button during a MIDDLE (execute) or RIGHT (look) drag CANCELS the gesture. In a TTY-mode shell 1-3 pastes into the program like a terminal: the click is forwarded first (if it listens for mouse) so the - paste lands under it, then the register arrives bracketed. + paste lands under it, then the register arrives — bracketed if + the program asked for bracketed paste, raw otherwise. The selection a chord leaves behind is dismissed by the next left click (it doesn't stretch to the click). @@ -114,13 +132,18 @@ File panes show "Save New Del" by default; Save writes the current file to disk, Del closes the window. Clicking a tag edits it in insert mode: type straight in, Enter looks / Tab executes - the word at the cursor, Esc hands focus back to the body. `:` from the - body focuses that same tag in NORMAL mode, parked at the first EDITABLE - column — vim's command line with acme's words in it: `:w<Tab>` is w + body focuses that same tag in NORMAL mode, parked on the FIRST WORD of + the tail rather than in the run of layout spaces before it — vim's + command line with acme's words in it, and on a file that first word is + "Save", so a bare `:` then Tab saves. `:w<Tab>` is w onto "Save", Tab to execute it, and you land back in the body where you left off (the chord keys are the same here as anywhere else; `i` if you - would rather type a command than walk to one). Terminal and image panes - show "New Del". + would rather type a command than walk to one). Everything else — a + terminal, an image, a PDF, an output buffer like "+Search" — shows the + plain "New Del", because there is no file behind it to Save. An image + tag leads with "img" and a PDF's with the word "pdf", its page out of + the count, and its three commands each preceded by its current setting + (part 4.1) — all of it live chrome, like the path. In that normal mode h/j/k/l do NOT move inside the tag: a tagline is a place in the LAYOUT, so they focus the neighbouring window and land on ITS tagline, still in normal mode — you walk the taglines of the screen @@ -129,36 +152,50 @@ motion, and w/b/e/0/$/^ still walk the tag's own words. Off the TOPMOST tagline k keeps going: above it is the top bar, which is a tagline too — the screen's own — and j comes back down. - The MODE + path part of a tag is live chrome, so it cannot be edited — - but it CAN be selected, by motion or by dragging across it: 0 then W/E - selects the path, `y` yanks it, Enter looks it. Typing or backspacing + The path at the head of a tag is live chrome, so it cannot be edited — + but it CAN be selected, by motion or by dragging across it: 0 then E + selects exactly the path, `y` yanks it, Enter looks it. (`W` would drag + the alignment spaces in with it.) Typing or backspacing with the cursor inside it does nothing; edits only ever reach the words you own, to the right of the path. "Delcol" still exists as a command: type it in a tag or body and execute it to close the whole column. A SEPARATE bar across the top of the screen holds the window-agnostic builtins: New Newcol Find Grep Help Tutor Dump NextColor Debug Kill + — and one more, " Restore <path>", which appears the moment a Dump has + written one. Middle-click "New" for an empty temporary file in this pane's column, "Newcol" for a new column, "Tutor" to spawn this tutor, "Kill" to quit. From the KEYBOARD the bar is `k` off the topmost tagline: it takes the cursor, h/l and the arrows move by character, - w/b/e and 0/$ by word, Enter or Tab runs the word under the cursor - exactly as a middle-click on it would, j drops back onto the tagline + w/b/e and 0/$ by word, Enter or Tab runs the word under the cursor the + way a middle-click on it does (with one difference: the mouse can carry + a selection kept elsewhere as the command's argument, and the keyboard + cannot), j drops back onto the tagline below and Esc leaves. There is nothing to type up here — the bar is - chrome, so it has no insert mode. Debug toggles the stats overlay - and NextColor cycles the theme: "helix" (the default — a near-black - page and chrome that barely lifts off it, copied from helix's own), then - "dark", then the acme-light yellow. The bar holds only what you reach - for often — the rest of the builtins are words you execute and keys - you press. Every one of them has a KEY PATH under SPC (part 3.7): - "Colors" (the syntax/ansi recolor) is SPC t c, "Crt" is SPC t r, and - SPC ? lists the lot. + chrome, so it has no insert mode. Debug toggles the stats box in the + top-right corner (and, where fingers exist, the touch circles and the + LOOK flash). NextColor steps the theme RING one place — and the ring is + 228 themes, not three: ours first ("helix", the default: a near-black + page and chrome that barely lifts off it, copied from helix's own; then + "dark"; then "acme", the acme-light yellow), then every theme helix and zed + ship, generated out of vendor/themes when pardes is built and sorted by + name. At 228 a step is a BROWSE and not a way to arrive: `Theme <name>` + goes straight to one, and "ThemeSel" (SPC t t) lists all of them into a + "+Themes" buffer whose rows ARE those commands — n/N to walk, Tab to + wear the one you stopped on. The bar holds only what you reach for + often — the rest of the builtins are words you execute and keys you + press. Nearly every one has a KEY PATH under SPC (part 3.13): "Colors" + (the syntax/ansi recolor) is SPC t c, "Crt" is SPC t r, and SPC ? lists + the lot. Right-click a directory in any body to open a terminal there. SEARCH: `/` in normal mode types a pattern into that pane's own tag (it stays visible while you type; Esc abandons it). Enter searches the pane — a file's text, a shell's scrollback, anything — for the pattern, plain - and case-insensitive, and writes one row per hit into a "+Search" pane. + and case-insensitive, and writes one row per matching LINE into a + "+Search" pane — the FIRST hit on that line, named as a location, with + the line's own text after it. That is an OUTPUT BUFFER: a file pane with no file behind it, so it has no Save, but everything else about it is an ordinary buffer you can read, edit, select and look in. It is not a document, though, and never takes a @@ -173,12 +210,16 @@ recent first, then the output buffers you have not, newest first, and only when there is neither does it step the pane in front of you — so n/N work on a shell that never had a search armed, and off the end - they come round to the start. `N` is `n` backwards exactly: ten - forward and ten back is where you began. + they come round to the start. After the FIRST press `N` is `n` + backwards exactly; the first one is not a step but an arrival, since + from a cursor the walk has never stood on there is nothing yet to step + back from. Right-clicking a word that names no file in ANY open pane's - directory searches for it — acme's button 3 — except in tty mode, - where the click belongs to the program on the other end. - A hit in a file reads `path:LINE:COL-ENDCOL`, the ordinary look target + directory searches for it — acme's button 3 — except in tty mode, where + a look that resolved nothing does nothing at all rather than searching. + A hit in a file reads `path:LINE:COL-ENDCOL` and then the matching + line's own text — the location is the leading word, and the path is + spelled relative to the buffer's own directory. It is the ordinary look target carrying the SPAN that matched. A hit in a shell or an output buffer has no file to name, so it reads `@pN:LINE:COL-ENDCOL` — pane N, then the place in it. Looking either one goes there and SELECTS the span, which is why an @@ -193,7 +234,10 @@ one matching PATH per row into the same "+Search" buffer. Rows are look targets like any other, so n/N select them one at a time and Enter opens the one you meant; the match is on the name, plain and - case-insensitive, ".git" is skipped. + case-insensitive, and the walk skips the directories nobody means — + .git, .jj, target, node_modules, .venv, __pycache__, .zig-cache and + zig-out — and stops at 512 hits, sixteen levels down, or a hundred + thousand directory entries, whichever comes first. LAYOUT: columns split the screen; windows stack within a column. Panes abut with no wasted gap — a pane's own trailing edge (its last column, or @@ -208,9 +252,10 @@ columns / reorder - the scrollbar is the gutter below the box: left-click scrolls UP to that point, right-click scrolls DOWN - - the FIRST file/image/tutor you open takes a new leftmost column of - its own (nothing is displaced, the other columns just narrow); every - later one splits below a doc already open, so docs share that column + - the FIRST document you open — a file, an image, a PDF, this tutor — + takes a new leftmost column of its own (nothing is displaced, the + other columns just narrow); every later one splits below a doc + already open, so docs share that column - closing a window (Del, or its shell exiting) hands focus back to the window you were in before it, not to whichever one comes first @@ -230,12 +275,16 @@ prompt model rather than layering an editor cursor on top. On a terminal pane: - NORMAL (•) prompt rows are HIDDEN — a clean acme-style page. You - navigate it with the same h/j/k/l/w/b/e as a file. - INSERT (^) same clean page; keys type an insertion overlay (the - command you're composing). Prompts still hidden. - TTY ($) the REAL shell — prompts + typed input shown, and keys - go straight to the pty as terminal input. + NORMAL ( ) the PROMPTS are gone — a clean acme-style page — but the + command you typed at each one stays, pulled over to the + left edge, because that is the part worth reading. A + prompt you never typed at leaves a blank row behind. You + navigate the + page with the same h/j/k/l/w/b/e as a file. + INSERT (^) the same page; keys type an insertion overlay (the + command you're composing). + TTY ($) the REAL shell — prompts back, and keys go straight to + the pty as terminal input. ESC: insert -> normal; from body NORMAL it hops to the pane you were in before this one, whichever it was (the same Last as @@ -245,12 +294,11 @@ SHIFT-ESC gets you IN, and once in TTY it does what ESC does in normal mode — hops away, leaving this pane in TTY so coming back lands you in the program you left. - Use `pardes --tty-toggle=g` (or another letter) to make Ctrl-g - the toggle instead. Entering is tty-native: if the shell is at - a prompt and your modal cursor sits on the input line, it first - moves the shell's REAL cursor to that spot — - - empty input -> shell cursor at the prompt START - - typed text -> shell cursor at/after the char you were on + Use `pardes --tty-toggle=g` to make Ctrl-g the toggle instead — + any letter but `c`, which stays SIGINT. Entering is tty-native: + if the shell is at a prompt and your modal cursor sits on the + input line, it first moves the shell's REAL cursor to that spot, + counting back the prompt columns that were hidden from you, via the shell's OSC 133 semantic prompt (ghostty promptClickMove; our rc opts in with cl=line). The shell moves its own cursor with arrow keys it understands — Pardes doesn't fake one on top. @@ -271,30 +319,47 @@ = PART 3 — THE KEYS (helix-style modal, Pardes differences) = ================================================================= - Same core as Helix and Vim: a block cursor you move with h/j/k/l, - motions w/b/e, and you enter insert with i/a/o. The differences: + Same core as Helix: a block cursor you move with h/j/k/l, motions + w/b/e, insert with i/a/o, and a SELECTION every edit acts on. Two + differential suites — `zig build hxdiff`, which replays these keys + against goldens recorded from a real helix, and `zig build hxparity`, + which runs them twice inside pardes and demands a file pane and a shell + agree — fail the build on any difference nobody has written a waiver + for. So where this file disagrees with helix's own + manual, helix is right and this file is the bug. The deliberate + divergences: - - Selection is LINE-first: `x` grows a line selection downward. - There's also `v` for a CHARACTER range. No multi-cursor. d/c/y act - on whichever selection is active (else the current line). - - NO verb+noun (Vim's dw, cw). Motions only MOVE. To delete a word, - select it (`v` then motions, or `x` for whole lines) then `d`. - - A plain ESC never reaches tty; it only does insert -> normal. - Dropping a terminal into the live shell is the tty toggle (Ctrl-b - by default, or Shift-Esc; see Part 2). + - Selection is LINE-first: `x` grows a line selection downward, and + an edit with nothing selected acts on the line (or the character) + the cursor is on. `v` is the CHARACTER range when you want one. + - NO verb+noun (Vim's dw, cw) — because the motion has already made + the selection. A traversal motion SELECTS what it crossed (3.3), so + `wd` is what `dw` was; `miw` then `d` deletes a word from inside it, + and `x` then `d` deletes whole lines. + - A plain ESC never reaches tty. From a BODY in normal mode it hops + to the pane you were in before this one; everywhere else it leaves + insert, or abandons a leader path, a tag, an armed input. Dropping + a terminal into the live shell is the tty toggle (Ctrl-b by + default, or Shift-Esc; see Part 2). - Enter / Tab in normal mirror the mouse: Enter = look (open the path under the cursor), Tab = execute. `:` runs a command from the tag (see Part 1). `u` undo, `U` redo. + - `/` is a plain case-insensitive SUBSTRING search (Part 1), not + helix's regex one. There IS a regex engine and it lives on `s` and + `S` alone (3.7). + - Alt-c moves this pane to a fresh column instead of helix's + change-noyank, and Ctrl-b pages up in a document but toggles tty on + a terminal. Those two are written down as waivers, not accidents. - Editing a file pane MUTATES real content; a terminal pane yanks rendered text and pastes it as an insertion run (shell output can't be deleted, only pasted text can). PRACTICE: run the keys on the "# before" lines; you should get the - "# after" lines. (These blocks are unit tests too.) + "# after" lines. ----------------------------------------------------------------- -= 3.1 MOVING THE CURSOR (h j k l) = += 3.1 MOVING THE CURSOR (h j k l), AND COUNTS = ----------------------------------------------------------------- k * h = left, l = right @@ -303,11 +368,28 @@ The cursor sits ON a character (block). Motions only move. - # keys: l l l - # before - abcdef - # after - abcdef +# keys: l l l +# before +abcdef +# after +abcdef + + A number typed FIRST is a count. Not everything takes one, and the set + that does is worth knowing: the motions (h/j/k/l, w/b/e, W/B/E), the + four f/F/t/T and the `Alt-.` that repeats them, `gg`/`gj`/`gk`/`g|`, + `x`, `o` and `O`, `>` and `<`, `p` and `P`, Ctrl-a and Ctrl-x, + `]p`/`[p` and `]space`/`[space`, and the three cursor-list keys `C`, + `Alt-C` and `)`/`(`. Everywhere else the + number is swallowed — `3d` deletes once, `3i` types once, `3ge` goes to + the last line like `ge`. `0` is still + line-start and never the start of a count, and Ctrl-d/u/f/b ignore one + on purpose: a page is a page. + +# keys: 3 l i Z esc +# before +abcdef +# after +abcZdef ----------------------------------------------------------------- @@ -319,53 +401,53 @@ `o` open line BELOW + insert. `O` open line ABOVE + insert. (All match Vim and Helix.) - # keys: i X esc - # before - bcdef - # after - Xbcdef +# keys: i X esc +# before +bcdef +# after +Xbcdef Cursor on 'b' (col 0). `i` inserts before 'b'. - # keys: a Z esc - # before - abc - # after - aZbc +# keys: a Z esc +# before +abc +# after +aZbc Cursor on 'a' (col 0). `a` inserts after 'a'. - # keys: A Z esc - # before - abc - # after - abcZ +# keys: A Z esc +# before +abc +# after +abcZ `A` jumps to end then inserts — appends 'Z'. - # keys: I Z esc - # before - abc - # after - Zabc +# keys: I Z esc +# before + abc +# after + Zabc `I` goes to the first non-blank ('a'), inserts before it. - # keys: o line2 esc - # before - line1 - # after - line1 - line2 +# keys: o line2 esc +# before +line1 +# after +line1 +line2 `o` makes a blank line below, enters insert, "line2" typed, Esc. - # keys: O top esc - # before - bot - # after - top - bot +# keys: O top esc +# before +bot +# after +top +bot ----------------------------------------------------------------- @@ -373,65 +455,130 @@ ----------------------------------------------------------------- `w` next word start, `b` prev word start, `e` next word END. - W/B/E treat punctuation as part of the word. Same as Vim & Helix. + W/B/E treat punctuation as part of the word. Same letters as Vim. + + NOT the same MEANING, though, and this is the one thing to unlearn: + a word motion in helix SELECTS what it crossed. `w` from 'f' does not + just park on 'b' — it leaves "foo " selected with the cursor at its + end. That is why d needs no motion after it (3.6): the motion already + made the selection. - # keys: w i Z esc - # before - foo bar - # after - foo Zbar +# keys: w d +# before +foo bar +# after +bar - `w` from 'f'(col0) lands on 'b'(col4). Insert before 'b'. + `w` from 'f'(col0) selects "foo " up to 'b'(col4); `d` deletes it. - # keys: e i Z esc - # before - foo bar - # after - foZo bar +# keys: e d +# before +foo bar +# after + bar - `e` from 'f' lands on 'o'(col2, end of "foo"). Insert before it. + `e` selects to the END of "foo" and no further, so the space stays. - # keys: b i Z esc - # at: 0,4 - # before - foo bar - # after - Zfoo bar +# keys: b d +# at: 0,4 +# before +foo bar +# after +bar - Cursor on 'b'(col4, "bar"). `b` -> start of previous word = 'f'(col0). + Cursor on 'b'(col4, "bar"). `b` selects back to 'f'(col0). + + The consequence to remember: `i` inserts at the START of whatever is + selected, not where the cursor sits. After `w` on "foo bar", `i` + types at column 0. `;` collapses the selection onto the cursor first, + so `w;i` is the vim reading of `wi`. + +# keys: w ; i Z esc +# before +foo bar +# after +fooZ bar ----------------------------------------------------------------- -= 3.4 LINE BOUNDS: 0 $ ^ g g G = += 3.4 LINE BOUNDS AND GOTO: 0 $ ^ and the g prefix = ----------------------------------------------------------------- - `0` start of line, `$` end, `^` first non-blank. - `gg` first line, `G` last line. Same as Vim/Helix. + `0` start of line, `$` end, `^` first non-blank. These three MOVE + without selecting, unlike the word motions above — so `$i` really + does insert at the end of the line. - # keys: $ i Z esc - # before - abcde - # after - abcdZe +# keys: $ i Z esc +# before +abcde +# after +abcdZe `$` to last char 'e', insert before it. (Cursor ON a char, so "end" = last char, not past it.) - # keys: 0 i Z esc - # before - abcde - # after - Zabcde +# keys: 0 i Z esc +# before +abcde +# after +Zabcde + +# keys: ^ i Z esc +# before + abcde +# after + Zabcde + + `g` is a PREFIX, and it is helix's g rather than vim's: + + gg first line ge LAST line (what vim spells G) + Ngg line N Ng| column N + gh line start gl line end gs first non-blank + gj line down gk line up + gt the view's top row gc its middle gb its bottom + (top and bottom are scrolloff-clamped: three rows in, so they + land where the cursor could have scrolled to anyway) + + `G` ALONE DOES NOTHING. helix's goto_line only acts with a count, so + `12G` is line 12 and a bare `G` is a keystroke that went nowhere — + `ge` is the key that takes you to the last line — its START, the way + `gg` takes you to the first line's. + + Five more gotos live under the same prefix — gd gD gy gi gr — and + they belong to the language backend, in part 4.2. + + +----------------------------------------------------------------- += 3.5 FINDING A CHARACTER: f F t T = +----------------------------------------------------------------- + + `f<char>` extends the selection forward THROUGH the next <char> on + this line, `F<char>` backwards. `t` and `T` are the same two but stop + one short of it. A count takes the Nth — `2fo` is the second `o`. + `Alt-.` repeats whichever of the four you used last. + + They select, the way w/b/e do, so d is the natural next key: `fx` and + then `d` deletes everything up to and including the next x. + +# keys: f d d +# before +abcdef +# after +ef - # keys: ^ i Z esc - # before - abcde - # after - Zabcde + `fd` selects "abcd"; `d` deletes it. + +# keys: t d d +# before +abcdef +# after +def + + `td` stops one short, so only "abc" goes. ----------------------------------------------------------------- -= 3.5 LINE SELECTION + EDIT: x d c y p = += 3.6 SELECTION + EDIT: x v d c y p, and the rest = ----------------------------------------------------------------- The Pardes difference is LINE-first selection: `x` grows a line @@ -439,70 +586,243 @@ character range when you need one. `x` start/extend a line selection + `X` stretch the selection you have out to whole lines + `Alt-x` the opposite — shrink it back inside them + `v` character-range select mode; motions extend it + `;` collapse the selection onto the cursor; `Alt-;` flip its ends + `%` select the whole file `d` delete the selected lines (yanked) + `Alt-d` delete them WITHOUT yanking `c` clear the line + insert (change) - `y` yank the selection (or current line) - `p` paste the yank as a new line below + `y` yank the selection — and with nothing selected the selection is + the CHARACTER under the cursor, not the line, so `x` first if a + line is what you meant + `p` `P` paste the yank after / before. A LINE yank comes back as a + whole line below or above; a character yank splices in beside + the cursor + `R` replace the selection with the yank + `r<char>` overwrite every character of the selection with <char> - # keys: x d - # at: 1,0 - # before - keep - gone - # after - keep +# keys: x d +# at: 1,0 +# before +keep +gone +# after +keep Cursor on "gone" (row 1). `x` selects it, `d` deletes it. - # keys: x x d - # at: 1,0 - # before - a - b - c - # after - a +# keys: x x d +# at: 1,0 +# before +a +b +c +# after +a `x` selects "b", `x` extends to "c", `d` removes both. - # keys: x y j p - # before - orig - dupe - # after - orig - dupe - orig +# keys: x y j p +# before +orig +dupe +# after +orig +dupe +orig `x` selects "orig", `y` yanks it, `j` to "dupe", `p` pastes below. - # keys: x c typed esc - # before - old - # after - typed +# keys: x c typed esc +# before +old +# after +typed `x` selects "old", `c` clears it to an empty line + insert, type. - # keys: c Q esc - # at: 0,1 - # before - ab - # after - aQ +# keys: c Q esc +# at: 0,1 +# before +ab +# after +aQ No selection: cursor on 'b'(col1). `c` deletes 'b' + insert; type 'Q'. + And the ones that rewrite a selection where it stands: + + `~` toggle case `` ` `` lowercase ``Alt-` `` uppercase + `J` join this line with the next, on one space + `>` `<` indent / unindent by four spaces (a count = that many) + `Ctrl-a` `Ctrl-x` add to / subtract from the SELECTION read as a + decimal integer. With nothing selected the selection is + one character, so `41` with the cursor on the `4` becomes + `51` — select the whole number first if you meant 42 + `Ctrl-c` comment or uncomment every line the selection touches. + The token comes from the file's EXTENSION: `//` for .zig + and .c, `#` for .py and .sh, `--` for .lua, `;` for .el, + `%` for .tex and .erl, `!` for fortran, `"` for .vim — + and `#` for any extension the table does not name, which + includes having none. In raw tty mode Ctrl-c is still the + shell's SIGINT. + `=` ask the language backend to format the selection (part 4.2) + +# keys: x ~ +# before +abc +# after +ABC + +# keys: J +# before +one +two +# after +one two + +# keys: x > +# before +abc +# after + abc + + +----------------------------------------------------------------- += 3.7 MORE THAN ONE CURSOR: s S C , ) ( _ = +----------------------------------------------------------------- + + There IS multi-cursor, and it is helix's: a selection is a LIST of + ranges with one PRIMARY among them, and every ordinary key is + replayed once per range — type in insert and you type in all of them. + Sixty-four ranges is the ceiling; matches past it are dropped. + + The two keys that make a LIST out of one range are regex: + + `s` keep every match inside each selection, as its own cursor + `S` keep the pieces BETWEEN the matches instead + + Both arm the pane's tag the way `/` does, and both preview LIVE: the + selections redraw on every character you type. A pattern that does not + compile yet falls back to the selection you had BEFORE you pressed `s` + rather than clearing everything, which is what makes typing one + character at a time bearable — every unfinished prefix of a pattern is + one of those. Enter commits, Esc puts back exactly what you had. A pattern + with no uppercase in it matches case-blind, which is helix's smart + case. Two things differ from helix's regex: `.` matches a newline here + like any other byte, and `^`/`$` assert at the scanner's position + rather than at a line boundary. + + The keys that then work on the LIST rather than on the text: + + `C` copy the primary selection down a line; `Alt-C` up + `,` keep only the primary; `Alt-,` drop it, promote the next + `)` `(` rotate which one is primary, forward / back + `Alt-s` split every selection into one range per line + `Alt--` merge them all into one span + `Alt-_` merge only the ones that touch + `_` trim the whitespace off each; empty ones vanish + + `SPC y` joins every cursor's text for the system clipboard and + `SPC Y` takes the primary's alone (3.13). + + (No practice blocks: the "# keys:" notation has one cursor in it.) + + +----------------------------------------------------------------- += 3.8 PAIRS AND TEXTOBJECTS: the m prefix = +----------------------------------------------------------------- + + `mm` jump to the bracket matching the one under the cursor + `mi<obj>` select INSIDE a textobject + `ma<obj>` select AROUND it — delimiters included + `ms<char>` surround the selection with <char> and its partner + `mr<a><b>` replace the enclosing <a> pair with <b>'s + `md<char>` delete the enclosing <char> pair + + The objects are `w` a word, `W` a long word, `p` a paragraph, and the + pairs `( ) [ ] { } < >` with the quotes `'` `"` and the backquote. + Quotes are LINE-SCOPED — a string does not span lines here, so + neither does the object. helix's tree-sitter objects (a function, a + class, an argument) are not in this set. For SURROUNDING, any + character at all is its own pair: `msx` wraps the selection in x's. + + `miw` and then `d` is how you delete a word without a verb+noun + grammar. + + +----------------------------------------------------------------- += 3.9 ] AND [ : STEPPING BY THING = +----------------------------------------------------------------- + + `]p` `[p` next / previous paragraph (blank lines delimit one) + `]space` add a blank line below; `[space` above (a count = N) + `]d` `[d` next / previous diagnostic — and if no list is up yet, + asking the language backend for one is part of the press + `]D` `[D` the last / the first of them + + +----------------------------------------------------------------- += 3.10 PIPING A SELECTION: | = +----------------------------------------------------------------- + + `|` in a file body arms the pane's tag with a bare "|" and takes a + command line. Enter runs it under `/bin/sh -c` once per selection: + the selection's bytes go in on stdin, and its stdout replaces them. + Every cursor is filtered in the same pass, and the whole thing is ONE + undo. `%` then `| sort` sorts a file. + + A real FILE pane, and only that: the gate is whether the pane has a file + to Save, so `|` is inert in a terminal and in every output buffer, and + the tag stays as it was. + + Not to be confused with EXECUTING a word, which sends it to the + pane's own shell and leaves the text alone. This one is a filter, and + what it returns lands back in the buffer. + + +----------------------------------------------------------------- += 3.11 INSERT MODE ITSELF = +----------------------------------------------------------------- + + Backspace, Delete, Enter and Tab are what those keys ARE, not + bindings — Enter carries the previous line's indentation down with + it. The rest is helix's: + + Ctrl-h / Ctrl-j / Ctrl-d Backspace / Enter / Delete, spelled out + Ctrl-w, Alt-Backspace delete the word behind the cursor + Alt-d, Alt-Delete delete the word in front of it + Ctrl-u kill back to the start of the line + Ctrl-k kill forward to the end of it + + Ctrl-w is the WINDOW prefix in normal and tty mode; insert mode wins + it, which is helix's own arrangement — so a tag being typed into + swallows it. + + TAB has one extra job: pressed straight after a `.` in a source file + the language backend speaks, it asks what could go there (part 4.2). + Everywhere else — and when the answer comes back empty — it indents + to the next four-column stop. + ----------------------------------------------------------------- -= 3.6 VIEWPORT + PANES = += 3.12 VIEWPORT + PANES = ----------------------------------------------------------------- zt / zz / zb scroll so the cursor is at top/center/bottom + (`zc` is `zz` spelled the other way) + zj / zk scroll the view one line, cursor pushed along Ctrl-d / Ctrl-u half-page down / up Ctrl-f full page down. (Ctrl-b pages up on a file pane; on a terminal it is the default tty toggle. If you start with --tty-toggle=g, Ctrl-g takes that role.) + Ctrl-o / Ctrl-i walk the jump history back / forward — the same + two builtins as SPC j o and SPC j i, and SPC j l + shows the stack itself as a buffer. (Ctrl-i and Tab + are the same byte on an old terminal; where that is + so, Tab keeps meaning execute.) Ctrl-w h/j/k/l focus the pane left/down/up/right (SPC w h/j/k/l does the same; Ctrl-w also reaches a tty pane, where SPC belongs to the shell) @@ -510,50 +830,82 @@ held down it alternates between two (body normal mode; the same builtin as SPC j j) Alt-n new terminal below the active one - Alt-c move the active terminal into a fresh column + Alt-c move the active pane into a fresh column — any pane, + not just a terminal, and a no-op if it is alone in + its column or the sixth column already exists (No practice blocks: these are viewport/layout, not text edits.) ----------------------------------------------------------------- -= 3.7 SPC — THE LEADER = += 3.13 SPC — THE LEADER = ----------------------------------------------------------------- - Every builtin has a NAME you can execute anywhere text lives, and a - KEY PATH you can press. SPC in normal mode starts the path; the keys - you have typed so far show at the right edge of the pane's tag until - the sequence fires. Esc abandons it — so does any key that leads - nowhere, rather than leaving the next keystroke armed. + Nearly every builtin has a NAME you can execute anywhere text lives, + and a KEY PATH you can press. SPC in body normal mode starts the + path; the keys you have typed so far show at the right edge of the + pane's tag until the sequence fires. Esc abandons it — so does any + key that leads nowhere, rather than leaving the next keystroke armed. + + The groups are shared first letters and nothing cleverer: f files, + h docs, c columns, t toggles, s session, j jumps, l language, + w windows. SPC ? Help: every builtin and the keys that run it SPC k Kill (quit) SPC d Del (close this pane) - SPC f s/f f/f n Save / Find / New SPC h t Tutor (this file) + + SPC f s Save SPC f n New (empty temp file) + SPC f f Find (file NAMES) SPC f g Grep (their CONTENTS) + SPC f c Config: where the startup file is read from (4.3) + + SPC h t Tutor (this file) SPC c n / c d Newcol / Delcol + + SPC t d Debug SPC t c Colors (syntax/ansi recolor) + SPC t n NextColor SPC t t ThemeSel (the list of 228) + SPC t r Crt SPC t f FontSel (gui and macOS only) + SPC t w Wrap: soft line breaks in a file pane, ON to start + with — so this is the switch that lets a long line + run off the edge again, hscroll and all. A wrapped + row ends in "↩", in the chrome's colour, because a + break is the one thing about it you cannot see + SPC t b Tagbottom: taglines under their panes, not over + SPC t p/l/a Petscii / Palette / Ascii — an image pane's + renderer (4.1) + SPC t i/s/z PdfTint / PdfSections / PdfFit — a PDF's (4.1) + SPC y / SPC Y the selection to the SYSTEM clipboard (every - cursor's text joined, or the main cursor's alone) + cursor's text joined, or the primary's alone) SPC p / SPC P paste the system clipboard after / before the selection; SPC R replaces the selection with it - SPC t d/c/n/r Debug / Colors / NextColor / Crt toggles - SPC t p/l/a Petscii / Palette / Ascii: an image pane's - renderer — glyph art instead of pixels, the C64 - palette or the terminal's own 16, and whether - letters join the matcher's glyph set + SPC s d / s r Dump / Restore the session SPC w h/j/k/l Left/Down/Up/Right: focus the pane that way SPC j o / j i Back / Forward: walk the jump history SPC j j Last: the pane you were in before this one — what body-normal ESC runs, so it alternates + SPC j l Jumplist: that same stack, as a buffer you can click + + SPC l ... the language group — part 4.2 has all ten - Those five are helix's own clipboard letters, and the only words that - reach the desktop's clipboard at all: ordinary y d c p P R and the - 1-2 / 1-3 chords all stay in pardes' own register, so deleting a - character can never throw away what you copied from a browser. In a - terminal the copy goes out as OSC 52 and the paste asks for it back - the same way — plenty of terminals refuse that read, so there SPC y - works and SPC p may honestly do nothing. + Those five clipboard words are helix's own letters, and the only + words in pardes that touch the desktop's clipboard at all: ordinary + y d c p P R and the 1-2 / 1-3 chords stay in pardes' own register, so + deleting a character can never throw away what you copied from a + browser. In a terminal the copy goes out as OSC 52 and the paste asks + for it back the same way — plenty of terminals refuse that read, so + there SPC y works and SPC p may honestly do nothing. - `?` works at ANY depth: SPC ? lists everything, SPC h ? lists only - what the "h" group holds. Help writes into a "+Help" OUTPUT BUFFER, + A handful of builtins have no key path at all. Three of them take a + NAME, and a key path can never carry one: `Theme <name>`, `Font <name>` and + `Shell <name>` — the last being what the NEXT terminal you open will + run (fish, until you say otherwise; the ones already open keep what + they have). The other two are Look and Exec, which already have two + keys and two buttons between them. All five are words: write them + anywhere and execute them. + + `?` works at ANY depth: SPC ? lists everything, SPC t ? lists only + what the "t" group holds. Help writes into a "+Help" OUTPUT BUFFER, the same kind of pane "/" search results land in — so it opens below the pane you asked from, never in a column of its own — and ordinary text, so the names in it are live: middle-click "Tutor" and it opens. @@ -562,6 +914,192 @@ ================================================================= += PART 4 — THE REST = +================================================================= + +----------------------------------------------------------------- += 4.1 PANES THAT ARE NOT TEXT: PDFs and images = +----------------------------------------------------------------- + + Look at a .pdf and you get a PDF pane: the real document, rendered by + MuPDF as one continuous strip of pages and placed like any other + document (a leftmost column of its own the first time, split below a + doc after that). Its tag is live, and reads + + pdf 3/128 width PdfFit filtered PdfTint PdfSections /path/to/it.pdf + + — the page you are on out of the count, then each of the three + commands with its CURRENT setting written in front of it, then the + path. Those are ordinary words: middle-click "PdfSections" and it + runs. + + PdfFit (SPC t z) `width`, a reading column you scroll down, or + `height`, the whole page at once panned sideways + PdfTint (SPC t i) disabled -> filtered -> full -> disabled. `full` + repaints the page in the theme's two colours; + `filtered` starts from that and adds back three + quarters of each channel's distance from the + source's own luminance, so a COLOUR page keeps its + hues and a grayscale scan comes out identical to + `full`; `disabled` is the pixels as they are + PdfSections (SPC t s) the document's OUTLINE, into a + "+PdfSections" buffer below the PDF. An ordinary + row is `file.pdf:PAGE:N` and the title, indented + by depth; n/N walk them and Enter goes to that + section. An entry that is a web LINK has no page + to name, so its row is the bare URL and the title, + and looking it opens a browser. + + The modal keys work on the PAGE rather than on a cursor: j/k scroll, + Ctrl-d/u and Ctrl-f/b page, `Ngg` goes to page N, `ge` is the last + page. `/` searches the document's real text through MuPDF and n/N walk + the hits. + + The rest depends on the shell being able to place real PIXELS. Where + it can, drag with the left button to select text (SPC y takes it), and + h/l pan sideways with `0` and `$` for the edges — though there is + nothing to pan while the page already fits, which in the default + `width` fit is most of the time. Where it CANNOT, there is no text + selection at all and the vertical keys step whole pages instead of + scrolling. + + PDF support is a BUILD option: `-Dmupdf` is on for the native builds + and off for the browser, and with it off a .pdf opens as the ordinary + file it is on disk. `-Djpx` (also on) is what makes a SCANNED pdf + render at all rather than as a stack of blank pages. + + An IMAGE — .png .jpg .jpeg .gif .bmp .ppm .pgm .tga — opens an image + pane, tagged `img <path>`. Where the shell can place real pixels it + does; where it cannot, the petscii matcher draws the picture out of + block glyphs. The three toggles all act on THAT matcher, so with real + pixels on screen only the first of them changes anything: + + Petscii (SPC t p) glyph art even when real pixels were available + Palette (SPC t l) the C64's sixteen colours, or the terminal's own + Ascii (SPC t a) whether the printable ASCII bitmaps join the + matcher's glyph set. They start IN, so the first + press takes them out and leaves the blocks + +----------------------------------------------------------------- += 4.2 THE LANGUAGE BACKEND = +----------------------------------------------------------------- + + Pardes has ZLS compiled INTO it — not spawned, not spoken to over a + socket, just called. So there is no server to start and nothing to + wait for, and equally nothing kept warm: there is no cache at all, and + every query re-parses from scratch — that is once per keypress, not + once per file. It reads one language, `.zig`. On a file it does not + read, the code queries below do nothing whatsoever: no error row, no + message. (Four of them answer anyway, because they are not about this + file's code — `SPC l i` and `SPC l w` describe the backend itself, and + `SPC l S` and `SPC l D` walk the .zig files next door.) + + helix's five gotos keep helix's own letters, under `g`: + + gd definition gD declaration gy type definition + gi implementation gr references + Ctrl + left click the same as gd, with the mouse + + ONE answer jumps straight there. Several fill a "+Search" buffer, and + from there it is the ordinary walk: n/N step the rows, Enter opens + the one you stopped on. + + The rest are BUILTINS — words you can middle-click as readily as + press — under `SPC l`, each on helix's letter with the group prefix + in front of it: + + SPC l k Hover what this thing is, into "+Hover" + SPC l r Rename arms the tag; the new name goes after the + `/`. One undo for all of it + SPC l a CodeAction the titles of what could be done, into "+Lsp" + SPC l h SelectRefs every reference, as rows + SPC l s Symbols this file's symbols, parent-qualified + SPC l S WsSymbols arms the tag; a substring match over the .zig + files under the asking file's OWN directory + SPC l d Diagnostics this file's; a clean file says so in one row + SPC l D WsDiagnostics the same over that same directory + SPC l i Lspinfo what the backend IS: its version, what it + answers, what it refuses, and the last two + dozen queries with how long each took + SPC l w Lspwhy re-runs `gd` where the cursor is now, out + loud: every step it took and where it stopped + + ]d / [d step the diagnostics — asking for them if none are up + ]D / [D the last / the first + = format: a "+Lsp" buffer with one row per changed line, + `- old + new` on each. It SHOWS you the + formatting; it does not apply it + + Three limits worth knowing before you trust an answer. `gr`, + `SelectRefs` and `Rename` are all the same resolution underneath, and + it is THIS FILE ONLY — none of them claims a workspace. The two `S`/`D` + walks start at the asking file's directory, not at the project root, + and stop at 512 files. And a rename you did not want is one `u` away, + because it lands as a single undo. + + And in INSERT mode, Tab straight after a `.` asks what could go + there. What comes back is not a popup and nothing is typed for you: + it is a buffer of rows, one per candidate, each pointing at where + that candidate is DECLARED. Picking one is looking at it. An empty + answer indents instead, a moment late. + +----------------------------------------------------------------- += 4.3 CHROME, AND THE ONE FILE PARDES READS = +----------------------------------------------------------------- + + Themes: 228 of them, described in Part 1. NextColor steps the ring, + `Theme <name>` goes straight to one, ThemeSel (SPC t t) lists them + all into a buffer you walk. + + Fonts, on the SDL and macOS builds only — in a terminal the font + belongs to the terminal and in a browser to the page. FontSel + (SPC t f) lists every MONOSPACE face on the machine into a "+Fonts" + buffer of `Font <name>` rows. n/N step those rows and select each one + WHOLE, since a command line has no place inside it to pick out; Tab (or + a middle click) runs the row you stopped on and puts that face on. So + walking with n and pressing Tab is trying faces on, and stopping is + choosing. `Font <name>` on its own takes the font file's + stem. + + Before its first frame a native pardes reads ONE file: a file called + `pardes` in your config directory — $XDG_CONFIG_HOME/pardes when that + is set to an absolute path, else ~/.config/pardes, and on macOS + ~/Library/Application Support/pardes. `SPC f c` prints the resolved + path into a "+Config" buffer whether or not anything is there, which + is the case you ask in. (A right click on that row opens the file when + there IS one. When there is not, the click has nothing to open and + falls back to searching for the text — pardes will not create it for + you.) + + The format is one BUILTIN COMMAND per line, spelled exactly the way + you would execute it anywhere else: + + Theme gruvbox_dark_hard + Shell zsh + Tagbottom + + Blank, unknown or malformed lines are ignored in silence, and a bad + line does not stop the ones after it. Two cautions. A word that is not + a builtin is never handed to a shell — but `Exec` IS a builtin, so + `Exec <anything>` in this file types that command into a shell before + your first frame, and `Look` will run an `` @`...` `` word the same + way. And every toggle here TOGGLES: `Wrap` in your config turns soft + wrap OFF, because it starts on. + + It cannot remap a KEY, either: the keymap is src/config.zig, compiled + in, and rebinding is an edit there and a rebuild — which is why a + wrong binding is a compile error instead of a line that quietly did + nothing. + + The browser build reads no such file, has no ptys, and has no language + backend compiled in. It is not without a filesystem, though: LOOK + there resolves against a read-only archive of the tracked .zig sources + that was generated when the build was made. What you get is a dump, + replayed, with those sources openable. (The core still ASKS for the + rest. A host that answers gets terminals; that is the seam, not a + special case.) + +================================================================= = SUMMARY = ================================================================= @@ -569,7 +1107,8 @@ select-then-act: middle-drag, or v/x then Tab chords: 1-2 cut 1-3 paste (both in one hold = snarf) 2-1 = middle-exec with the left selection as argument - file tag = path + "Save New Del"; other tags show "New Del" + file tag = path + "Save New Del"; everything else, + output buffers included, shows "New Del" top bar = New Newcol Find Grep Help Tutor Dump ... Debug Kill (keyboard: k off the topmost tagline) WEB TOUCH: one-finger tap = LOOK; drag = natural scroll @@ -579,23 +1118,52 @@ TTY: a terminal IS a pane; Ctrl-b (or Shift-Esc) toggles the shell, landing its cursor where you navigated (prompt start if the input is empty, mid-text otherwise) - KEYS (helix): h j k l w b e 0 $ ^ gg G v x d c y p i a I A o O - u undo U redo Enter=look Tab=execute + KEYS (helix): h j k l w b e 0 $ ^ gg ge f F t T v x X d c y p + i a I A o O u undo U redo Enter=look Tab=execute + w b e f F t T SELECT what they cross, so `i` after one + types at the SELECTION's start; `;` collapses first + a leading NUMBER is a count on the motions, x, o/O, > <, + p P, Ctrl-a/x and ]space — not on the other edits + bare G does NOTHING; `ge` is the START of the last line + s / S = regex, one cursor per match, previewing as you + type; C , ( ) Alt-s Alt-- Alt-_ _ work the LIST + m i/a = textobjects (w W p, the bracket pairs and the + three quotes), m s/r/d = surround, mm = match + ] and [ = paragraph, blank line, diagnostic + | = filter every selection through /bin/sh -c (a savable + file pane only) : = the tag as a command line (arrows/words move in it, hjkl walk to the neighbouring TAGLINE, y/Enter act on the selection; the mode+path selects but never edits; k off the TOPMOST tagline = the top bar, j back down) - zt zz zb Ctrl-d/u Ctrl-f Ctrl-w hjkl Alt-n/c - Esc = last document <-> last terminal (body normal) + zt zz zb zj zk Ctrl-d/u Ctrl-f/b Ctrl-o/i Ctrl-w hjkl + Alt-n Alt-c + Esc = the pane you were in before this one (body normal) n/N = select the next/prev look-able text, across panes (a ring); Enter opens what you landed on SPC = the leader: a key path runs a builtin (SPC ? lists them; SPC k Kill, SPC d Del, SPC f s Save, SPC f f Find, SPC f n New, SPC y/Y/p/P/R the system clipboard, - SPC w hjkl focus, SPC j j the pane before this one) + SPC w hjkl focus, SPC j j the pane before this one, + SPC t * the toggles, SPC l * the language backend) + NOT TEXT: .pdf = the real document through MuPDF — j/k scrolls it, + `/` searches it, PdfFit/PdfTint/PdfSections sit in + its own tag + images = pixels where the shell has them, petscii glyphs + where it does not (SPC t p/l/a) + LANGUAGE: ZLS, compiled in, .zig only, nothing running in the + background and nothing cached: gd gD gy gi gr, the + ten SPC l words, ]d/[d and ]D/[D, `=` to see a + format diff, and Tab after a dot in insert - vs Helix: no multi-cursor; selection is LINE-first (x), plus v chars. - vs Vim: no verb+noun (dw); motions only move; body-normal Esc hops focus. + vs Helix: selection is LINE-first (x), plus v for characters; `/` is + a case-insensitive SUBSTRING search, one hit per line, and + not a regex one — the regex lives on s and S; the textobjects + are w W p, the bracket pairs and the three quotes, with none + of helix's tree-sitter ones. + vs Vim: no verb+noun (dw) — because the MOTION already selected, so + `wd` is what `dw` was; body-normal Esc hops focus; bare G is + a no-op and `ge` goes to the start of the last line. vs both: a terminal is just a pane; the same keys edit text and navigate the shell screen, and the tty toggle reuses the shell's own prompt to position you precisely. diff --git a/test/hxcases/waivers.jsonl b/test/hxcases/waivers.jsonl index 6b2f612c..ca1b8ec5 100644 --- a/test/hxcases/waivers.jsonl +++ b/test/hxcases/waivers.jsonl @@ -2,5 +2,5 @@ {"name":"alt-c-window-op","reason":"deliberate pardes binding: Alt-c is the move-pane-to-fresh-column window op in ANY mode (do-not-touch contract); helix Alt-c is change-noyank. Alt-d + i covers the helix behavior; the buffer is untouched on the pardes side."} {"name":"msel-append","reason":"multiple cursors + `a`: pardes restores the appended-over span for the PRIMARY only, because Pane.append_at (where the append session began) is a single field and the other ranges have nowhere to keep their own origin. Every cursor lands on the right cell and the text matches; only the secondaries' anchors differ, so they read as bare cursors instead of spanning what was typed. Same family as wiX-edit-drops-sel: pardes does not map selections through insert-mode edits. Fix = an origin per SelRange."} {"name":"msel-yank-paste","reason":"pardes has ONE yank register; helix's holds one VALUE PER RANGE and pastes value[i] back at range[i]. A multi-range `y` in pardes therefore joins the ranges' text with newlines and `p` puts the whole newline-joined blob at every cursor (which also makes it linewise). Deliberate: a per-range register is its own feature, not part of the selection model. Single-range yank/paste is unaffected and covered by the yank-* / paste-* cases."} -{"name": "sel-regex-dot-newline", "reason": "mvzr's `.` matches ANY byte, newlines included; helix builds its pattern with the Rust regex crate, where `.` excludes \\n unless asked. So `%s.` selects one range per byte in pardes and one per non-newline byte in helix. Deliberate: closing it means rewriting `.` to `[^\\n]` inside the pattern, and doing that correctly needs a real parse (`\\.` is a literal dot, a `.` inside `[...]` is already literal) - a regex parser written to work around the regex engine. `[^\\n]` typed at the prompt is the workaround, and it behaves identically in both editors."} +{"name": "sel-regex-dot-newline", "reason": "mvzr's `.` matches ANY byte, newlines included; helix builds its pattern with the Rust regex crate, where `.` excludes \\n unless asked. So `%s.` selects one range per byte in pardes and one per non-newline byte in helix. Deliberate: closing it means rewriting `.` to `[^\\n]` inside the pattern, and doing that correctly needs a real parse (`\\.` is a literal dot, a `.` inside `[...]` is already literal) - a regex parser written to work around the regex engine. `[^\\n]` typed at the prompt LOOKS like the workaround and is not one: the live preview compiles every prefix, and the prefix `[^\\` panics mvzr (index out of bounds in parseCharSet) before the pattern can be finished. Guarding the compile is what would make it typable."} {"name": "sel-regex-caret", "reason": "helix compiles the `s`/`S` pattern with multi_line(true), so `^` and `$` are LINE anchors; mvzr has no such flag and asserts them against the START OF THE SLICE it is handed, which pardes advances to each match's end. `%s^a` therefore finds one match in pardes and one per line in helix. Same root cause for `$`. Fixing it means either searching line by line - which changes which ranges come out for every OTHER pattern, since a match may not span a line then - or an engine with multi-line assertions. Every other anchor-free pattern agrees, including \\b (sel-regex-boundary)."} |
