From a12fb47d5fb0c850af0aeb71b098ed3b05d0abbd Mon Sep 17 00:00:00 2001 From: "opencode.energia.arti.ee" Date: Thu, 12 Nov 2026 05:14:33 +0000 Subject: [PATCH] chore(termtris): handoff script and notes for the next machine apps/termtris/verify.sh runs the whole acceptance: ROM md5 guard, 2ine check, MAME build (--skip-mame to reuse one), the six tests, the acceptance summary and the evidence list, all logged under build/. HANDOFF.md states what is done, what is still open (the docs' figures and screenshots predate the VR319 default because the installed MAME binary is the 30 Oct build), the expected outputs, and the failure modes already diagnosed. Refresh the acceptance numbers from the verify run: 348/19, 338/13, 292/11. --- apps/termtris/HANDOFF.md | 133 ++++++++++++++++++ apps/termtris/VT1200.md | 9 +- apps/termtris/build/termtris.coff | Bin 15208 -> 15208 bytes apps/termtris/build/termtris.map | 2 +- apps/termtris/evidence/termtris_move_3200.png | Bin 19458 -> 19524 bytes .../evidence/termtris_panels_3200.png | Bin 22396 -> 22474 bytes apps/termtris/evidence/termtris_quit_3200.png | Bin 19407 -> 19497 bytes apps/termtris/verify.sh | 107 ++++++++++++++ harness/mame/TERMTRIS_REPORT.md | 6 +- 9 files changed, 249 insertions(+), 8 deletions(-) create mode 100644 apps/termtris/HANDOFF.md create mode 100755 apps/termtris/verify.sh diff --git a/apps/termtris/HANDOFF.md b/apps/termtris/HANDOFF.md new file mode 100644 index 0000000..5a5ad87 --- /dev/null +++ b/apps/termtris/HANDOFF.md @@ -0,0 +1,133 @@ +# Handoff — termtris running inside the VT1200 + +Everything here is on branch **`termtris`** of +`https://git.wut.ee/opencode.energia.arti.ee/vt1200.git` (remote `origin`). +The branch was developed in a worktree at +`/home/arti/.local/share/opencode/worktree/26e92e/termtris`; any checkout of the +branch is equivalent. + +```sh +git fetch origin termtris +git checkout -b termtris origin/termtris +apps/termtris/verify.sh +``` + +`verify.sh` is the whole acceptance run: ROM checksum, toolchain check, MAME +build (skip with `--skip-mame`), the six tests, the acceptance summary and the +evidence list. It exits non-zero on the first failure and keeps every test log +under `apps/termtris/build/verify_.log`. `RUNTIME` is roughly 12 minutes +once MAME is built; the MAME build itself is the long part. + +## What is done + +The upstream game (John Tsiombikas' `termtris`, commit `7c5435d`) builds as a +native TMS34010 program with the 1990 TI r5.01 C toolchain under 2ine, loads +into VT1200 RAM through `dwt/loader`, opens a 480×312 window on the terminal's +own X server through the ROM Xlib, and reads real X11 key events. It is the +actual game: board, score/level/lines panels, piece preview, help and +high-score panels, moving/rotating/dropping pieces, and `q` to quit. + +| task | state | commit | +|---|---|---| +| vendor + toolchain + XG smoke test | done, `smoke.sh` PASS | `a861268` | +| `sprintf`/stdio compat | done, `fmt.sh` PASS | `a804181` | +| cell-grid X11 backend | done, `render.sh` PASS | `264b53a` | +| key map, clock, main loop | done, `input.sh` PASS | `c1945cf` | +| game integration, scores, COFF | done, `play.sh`/`play_keys.sh` PASS | `41d3cec` | +| docs + harness report | done | `3e2ddde` | +| review pass (seed, focus, expose, assertions) | done | `7a2cef5` | +| handoff script + this note | done | (this commit) | + +`VT1200.md` is the port documentation; `harness/mame/TERMTRIS_REPORT.md` is the +harness-side report; the design and plan are in +`docs/superpowers/specs/2026-11-03-termtris-vt1200-design.md` and +`docs/superpowers/plans/2026-11-03-termtris-vt1200.md`. + +## What is *not* done yet — read this first + +All screenshots and the acceptance numbers in the docs were produced with an +**older MAME binary** (`/home/arti/code/k-space/mame0289/vt1200d`, 30 Oct) that +predates the driver's VR319 default. That binary has no `VT1200_MONITOR`, and +its frames are 1024×864, i.e. the old VR150 geometry. The driver in this tree +defaults to **VR319** (1280×1024 active, 1696×1063 raster), which changes the +frame cadence and therefore the frame at which the loader and the tests act. + +So on the new box, after `harness/mame/build.sh`: + +1. Re-run `apps/termtris/verify.sh --skip-mame` and note the new + `DIAG: loops=... events=... quit=...` values. +2. Re-capture the screenshots (the test scripts write them into + `apps/termtris/evidence/`) and look at them: the board must still be a + bordered well with `[`/`]` tetrominoes, the score/level/lines boxes on the + right, and the preview box. The window is positioned at (80,80) inside a + larger raster, so the PNGs get bigger but the window content is unchanged. +3. Update the numbers in `VT1200.md` ("Acceptance values") and in + `harness/mame/TERMTRIS_REPORT.md`, and say plainly that the earlier figures + were VR150. + +If the behaviour itself changes at VR319 (pieces not visible, no events), that +is a real finding, not a formatting detail — the loader acts at frame 2500 and +the keys at 3100–3290, which may need re-timing if the new raster shifts the +frame budget. + +## Prerequisites on the new box + +* a MAME 0.289 checkout (`MAME_SRC`, default `/home/arti/code/k-space/mame0289`); +* the 2ine build with `lx_loader` (`NINE=`, default + `/home/arti/os2-work/2ine/build`); +* the r5.01 SDK zips, already in the repo under + `tools/tms34010-sdk/1990-11 TMS340 Family SDK/`; +* `vt1200_v22.bin` in the repo root (the harness ROM dir symlinks to it). + +`verify.sh` checks the ROM and the 2ine loader before doing anything, and +`harness/mame/build.sh` re-registers the driver in `mame.lst` and builds the +single-driver `vt1200` subtarget. + +## Expected results + +Last run here (older MAME, VR150 geometry): + +``` +smoke PASS type=2 keycode=194 lookup_n=1 ch=61 ks=0061 +fmt PASS six formats exact +render PASS flus=464C5553 progress=00FFFFFF +input PASS bytes 60 61 9B 41 9B 42 9B 44 9B 43 30 0A 7F 71 70 + (60 is the Expose redraw, then a/up/down/left/right/0/Return/Delete/q/p) +play PASS DIAG: tick=887 quit=0 +play_keys PASS move DIAG: loops=348 events=19 focus=00400001 quit=0 + panels DIAG: loops=338 events=13 focus=00400001 quit=0 + quit DIAG: loops=292 events=11 focus=00400001 quit=1 +``` + +`focus=00400001` is the window the process created; `quit=1` is the game's own +global after `q` — that is the proof the key reached the game and not just the +window. + +## Known failure modes (all seen, all diagnosed) + +| symptom | cause | handling | +|---|---|---| +| build stage "fails" with exit 139 but produced its file | 2ine-hosted TI tools crash during teardown | `build.sh` retries only when the output is missing; `gspac` needs `-i.` | +| linker points `cinit` into `.text` | empty `.cinit` section | `build.sh` relinks with the one-word `CINITZ.obj` terminator | +| `XNextEvent` never returns an event, keycode zero | child's per-process Xlib context is NULL | `src/vt1200/xgfix.c` writes a zeroed 1 KiB block before `XOpenDisplay` (RAM only) | +| the game exits immediately at startup, sometimes | `XOpenDisplay`/window creation while the display server settles | `main()` retries 40 × 50 ms, then returns 1 | +| window paints once, then hangs; a debug marker stops mid-flush | per-cell flushing overflowed the X socket / `XSync` per row deadlocked the client | flush repaints whole rows (fill + one 80-char string + inverse spans + one `XFlush`) | +| playfield is a white block with invisible pieces | the 1-bit raster cannot show colour | backend drops colour and uses bold (`0x80`) as reverse; pieces are `[`/`]` glyphs | + +## Layout + +``` +apps/termtris/ +├── build.sh TI r5.01 -> COFF (OUTNAME=termtris for the game) +├── run.sh interactive MAME session (lightgun/tablet input) +├── verify.sh one-command acceptance (see above) +├── VT1200.md port documentation +├── src/game.c upstream game; only srand(vt_rand_seed()) differs +├── src/vt1200/ main.c x11.c xgfix.c compat.c xlib.h scoredb.c *.asm +├── tests/ smoke fmt render input play play_keys (+ .lua drivers) +├── evidence/ screenshots +└── build/termtris.coff the built image (tracked for convenience) +``` + +The tests build from source every run (`play.sh`/`play_keys.sh` rebuild +`termtris.coff`), so an edit cannot silently pass by using a stale binary. diff --git a/apps/termtris/VT1200.md b/apps/termtris/VT1200.md index 7ad4b72..18fb0ab 100644 --- a/apps/termtris/VT1200.md +++ b/apps/termtris/VT1200.md @@ -89,7 +89,7 @@ level 0). Keys arrive as X11 `KeyPress` events and go through `XLookupString`; letters are lower-cased and handed to `game_input()`. Arrows are sent as the game's own CSI codes (`0x9b` + `A`/`B`/`C`/`D`), which `game_input` translates back to -`w`/`s`/`d`/`a`. `0x7F` is Backspace/Delete. `Expose` triggers a full redraw and +`w`/`s`/`d`/`a`. `0x7F` is Backspace/Delete. `Expose` (selected with `0x22800F`) triggers a full redraw and `FocusOut` (only after a `FocusIn`) pauses the game. ## Running it in MAME @@ -105,6 +105,7 @@ harness/mame/build.sh # rebuild the vt1200 subtarget (JOBS=4 on small h Then: ```sh +apps/termtris/verify.sh # build MAME + run every test (see HANDOFF.md) apps/termtris/tests/play.sh # load, click, snapshot apps/termtris/tests/play_keys.sh # move / panels / quit acceptance runs apps/termtris/run.sh # same run, interactive session @@ -129,9 +130,9 @@ which copies the sections to their linked addresses and calls Acceptance values from the last full run (`play_keys.sh`): ``` -move DIAG: loops=333 events=18 focus=00400001 quit=0 -panels DIAG: loops=323 events=12 focus=00400001 quit=0 -quit DIAG: loops=277 events=10 focus=00400001 quit=1 +move DIAG: loops=348 events=19 focus=00400001 quit=0 +panels DIAG: loops=338 events=13 focus=00400001 quit=0 +quit DIAG: loops=292 events=11 focus=00400001 quit=1 ``` `focus=00400001` is the window this process created (it is the only one in the diff --git a/apps/termtris/build/termtris.coff b/apps/termtris/build/termtris.coff index cf4275a89a324a6c4360adfeba20763154b83f28..0889510d5cd12f8d8a1e1059e9102341589b57a4 100644 GIT binary patch delta 15 WcmaD+_M(h!0s{*})b5RJN!9>01qHwW delta 15 WcmaD+_M(h!0s{*}i0nqTBx?XM%LN<& diff --git a/apps/termtris/build/termtris.map b/apps/termtris/build/termtris.map index 78e98d3..bd21a62 100644 --- a/apps/termtris/build/termtris.map +++ b/apps/termtris/build/termtris.map @@ -1,7 +1,7 @@ ***************************************************** TMS340 COFF Linker Version 5.01 ***************************************************** -Wed Nov 11 17:58:44 2026 +Thu Nov 12 05:12:58 2026 OUTPUT FILE NAME: ENTRY POINT SYMBOL: "_start" address: 018a0000 diff --git a/apps/termtris/evidence/termtris_move_3200.png b/apps/termtris/evidence/termtris_move_3200.png index 1da3486239f34f97e62228745559de38b31aecfe..49e895aacc3eacfa0a3bf4796b99b28054c2ab46 100644 GIT binary patch delta 10727 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 delta 10900 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 diff --git a/apps/termtris/evidence/termtris_panels_3200.png b/apps/termtris/evidence/termtris_panels_3200.png index 586a0a16979d2abdb0c946a0df98c2d600303425..87af787c4336b95c006a3b36f829c8485c31c2b5 100644 GIT binary patch literal 22474 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 literal 22396 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 diff --git a/apps/termtris/evidence/termtris_quit_3200.png b/apps/termtris/evidence/termtris_quit_3200.png index 098ab58ebd90278d98366160625b29c0b94e38d7..decc0bddbecac0b273b5d5762c37e9d0ac3e5307 100644 GIT binary patch literal 19497 zcmeHvc~q0=YEf0KYCfy<#c&$82XT_^)*w;?Q^Yp~=kNVSKJ} z#}k(^$s?n$OUMqE)=Rg$uxp-{^esWnpLom4l4}SG55fgBJ z$s_D#TM+n6q@Q?|so8j%|1vMK+4Rzl2)wr2NAaram&+to@f3Sor!G|m@VDUu4|a?T z%%_^PR=!o=u#RJ+NLbSo(w){s2t4{PaiORe|>n zFn(=y6jDJ=vQkWuIHtiV+-04HxFz?-4}jP02+G(czxem#PP40F3K3N65$2R?3imdP z_!|wSk%k0AMtZ^9VyDfv(@URJJo2v+IoF7KVLea4#C!6Q!ljo!C|jy9tUI2onz0>j zgTL066mFnC4z-%OQe!5;zDt84$@|St%`ll}XIaWP^Cu(<7`m?ldjDahg`1DR>4$gA zdXWlvstBf#tr2lC6dXGzVl{S&qaE|Qub4|yy?jE6=Z;jkX_^haRjeskdW(D(lhzdB zXa0(|EW%9o=lx(rne%>Yu<67~@=|h95R$#Vla>J9399Dr826@b0KaMz_sN8%`C2C6 z>#rsB{St{Uc!WT1M~?ePZn_1=O=d+df&RsAof|Gu+z*Bb(r=2Do?VfwpZMpOP5M)| zdf+`X2hx{*`8Txk@G&q2t<+P{un>~M)lhHnTT62Ea!EQ&VVLnE4PHet_K<0D(j-N! zdU-IHIi|#Df+^G?&#_WT3RXbl=t?$xiSbj9R6b0BpFqU@ecyC3G*4O8G)$p_C(e~L z;+B+iV1Jz*zFkGABVPWqi26>XbQ$b;?GqQt(kEr-P%}?koiR$?Z=a4uE*Y1Z%Y+SX zi6gJGRZ+71H0m6VueATnc8S#Z*7XTgFMCVQ5m{hY4d~fF?qIe`mR{oG{ENUG^<}Dt z>-Bxi5oa3uO_?TOuZXna4zhxf-xiyg#|mQtOZ3+gFNefrELwh=Sk~hnfm_m*e9>R- zg#ofcv1$`etjZ(a#fW#v778Xfj>Exu8Cfue2Pc@m-4C)cia@f%`ffti%Tcy{p|9Yq zuo0w!Uo&d_@8FP`WoUuYGeIYA3O-HkBQ!0D)s4S&+@2{}c`PyeE*MC1D}2Y3Zb=X* zUcT{H7sy6wK?6$ruP)MG={Jy}n7hl5mg)PC>_8}$_T)jnRDPmkQgtBUcOpP2%@75Psl#;SFnMylsYH6SOXt#J!7} z0Ge9r;MypuD94coTF-L^eL2fmVy|p%Vr4s!XSi=ojqtiNIB{mKC~V74^9#||WBn-< z^JDm+?6j(4Xz9dWmpqmz`;h=&#edd>99n%xJ2-Dz@d}F$6z0|pW)bX{uv#k7eDPVn z2@;y?Wxg$>N@>4)ZxyE&ivFMu{S&VK&Q{G$EbqtS9YjRYnd~^PknhP3|SZ8FZa{AEzQ?v_&C6PllTJRzGWO#B4Z!=XrCP75;}ry`BJb z%X>-W_ghi_7{?hpAnc|GB13lR<65p9{`-jJ$r1dEL}c+`t z!|*_0Q)6QvG?NXSgGAsD+%0Gsc2=jOt|sx<-~6`j3kh2PJJ{p?{QPCchy9bCqK{!K znhn3zM_DSWo%==dQb1O**v`C9)Qv^zKCnbx?%&4=JdL!<08?{syliYli-cbkRf`E0 z@kgp?w1o4RP+Glzx<8p?GkB+CgI{$Wqg zv5)&R{xXGglypAaC7tzE2vYp)9OsyF>t_>NU#2K~(kKG{O3yG6GG_DLkftWxH-hoT zcFHJ;^xU3aJCg)MsgAUgQCu@@um(3hdbE`aJSfJ3@ z7+H6mcJH0U@0*Vn?Nueg`|Cc&>RW&P8rHdZSDO*5oGOpd;jM&wNfi&$(oQFIN=mHo z2NFIN3SRr#cDJn7660q23Vn{@hI2PpidmjNXm2~sA2O!aH#VxPpTCnXUJW#=S0e5$ z(Rr0N!ak!k>bqfLq$Tj(E|b9fK^2tv6YS=sh)dPk1uN0+0!mrPd!wp5{l~>csnJPE ztl5({#QK>FX`EzCCkBZ*cA;}m>3JJPo<&6G1|zk!N=mn9>QS#W`lu6*Tas$Lr1fNF zxvRcD$`BaBlU9n*LA8=U{(yqw5_y=Z?|^*#V`xE_kj3bu1g-J<;~1{F*Ml&F6ijMa zHK8agH%M*cq7%IsioQ;ebmr(ck73SDTRPkyC;&10>@`RXGwn%{=;|vC(i|9DZ%sbS;;gRTC`@5@KQ-&CG-( zD8DHj-jf|QGeB`G3Uf>i|FLPe8mtYQ4`=CnG#hnZ6=KvQ^P6_O>L=Kkp%Pn6c@o#g z#MTy!-KiFU-d9;sHufHLzMzFJr z>x|ZzdAB!xqA`~4?~34Rkc=ol>lg168qk5Ky8ur=ot?%f=mmW^+2hhf;*8X#@x|Ke zChY9iWaY6KZ_CkcuYJMVhNK_Ut_C+fk7Ig_4M_r=sQN=Op_n1 zOq}5ib>tCs73)ajBb}~shDDHbNKe{xTkQ->tCaEtx-inmE`7zHaS3F2>uS!)&}5TG8yz!ZNVxtkD1O0G}g zbn%(DfEkJPMZkos__NNdz3uGqb~o38B;ZxcV!!Pg_7d-~*h>8_!ex)n%z?N>fNsCU zaEx9w3cs>UI`f01D(UBaS#GUe4~^8{s*;PmrS494rLPAQWPl0UB;Nx_cu_3wrKvOx zPm`uoL~Ik*9vlAqvM;7bPkV~ zfKNmsh0R!g3R*2&IBxC2rhco>Ir=Z`1;EqMGcmNY$d3~(C&O9iflSP?*dLtSC7m)* zA>ejd}?@cn+ z3mG|u!TdZBsJji8@=Yu%bGjYx#^?e0NUHFPa0?V+I8oT+nbEn8kn}CNHJT0w&3b67 z4!7X4S~CM~t|dE%bR4jB&&8g`K4vqZSd)D7!txwU_tPRzuE~rCYkT?%raBhxF0Ok6 zOT2ltcH$Vctsv>P0z7Dxm#`2>Kk~aeiyU>^u{J$&=uIxSsGXpZ8JT){a5%mt{(Ag!#d<%5R}x>c0{N|_xLy+d!-20d z_GK;0z}R;hR+-)+e*lpw7<(2LZ69#A`|U#`Q9WsT@Zv9)xvHD_T!ET9H9s`9$%JLb z=}zp5d}DHOESAVOwM=!@+(B)KooO?SFneOYlV1br+@`L0pcw5`m`&rE%nanR7|WRX zrU^LMy9hrj*?r7MJVHs_aVey}$e&3=?niE?)<6@m;FtQ0Yp3%e45C|dHxJWM+kSE? zWY@!bcy2JX0j?eUSh%V4N270T6IFX6*AXj=z2cHBhc_`5Rd_z|OCsJbTB7mm4QrA$ zyJLXE)x6GdoZOQDvve)y$Qk0*R$6T5_ajHZhtmidrk!e_3LFPophTCMF}FI&1@ z@q5f!HUo;c&2gg^__a^r4*Kb@y%N5;qg+vxeX>rGZ3t*nx;tjcPtHAiV|DM}#-!H) z+N0#1!5`AMUQ-!a--mnm*VDRnDN?)CY+BXQf37C=ewuXL1`LU}& zn3Ph!Z3pduggYJ@^IL5b?34h)Bj1U66HFOHF<`)jG1zXGlhVq3=V(3Q&q88gFxyS zb;Inb9Gn?Ia~oLIt@{Ap;AswN_lCbA_s+(+yPNN@ekKAM^Bgl_Qbj}eUq}WgoV2sB zW3ks1DUf?0&e*Pc`4?Fzf^-2uarilV&22ahBC;a@oUg&$vi$X2wfkW3-3#D6a5+KB z5Lx*y+QGk=?`}PcEt?B`2)kdvGPMsa?9$|yQ9!IhVk@xWDhLT-BLI1bDwlvfX)Sqx z+-Vj5f3aqT71 z4JDb14YvOf--AE{jNOz=*c;)X89O#jI?qbfieQdnxMNgC$zjt|ojoQ(?WRuzbLuKr zZwI$c2CKV(Byduoq|qZ5cDzrl9ie(L?NCIT zrWZ?JQqoMSJbWjlb^Gw}$Qu2=4``Fwq)C<^`0sSqp4tZAtu&si4iF1~67bQ_HlV#N z5`X~e{pMlFjK6Sf2=JOUW9@DB;E8|V=A46z;Q>*3OnCd3&Z`sDVcrpk;oKc6h`!gh zjZ1|WAr`UdP+w5@s>h|hV@=-vY~h8IAL`$Wa~<|GeLw^0pQ_3ZyZ}hZ`f|wzG#8NU zz<~XXi4pIn{&vd@6B2AQE0KgcjLk;+N}W^i>pu+neRIqiL}*2(?;D6L*H?M6j4w&L z_hbWSuQ(Rp22gMT!Q`Dio@Y%p(jvDKO3~AZ`$#!Vn+0*;p+XWB#rSSJRXzc~l>FNzPSq-Myu zC2C0L8(brltV6YkRmjRCRi~^29#f8pe}I4-QfK`TC>Qpzn!D{6phdXB5v1`|B-yq!xz8P5g-`t_-Y zyGmeYAsvmtAF16is1#5PR9ATlYp_no8ABN;<0ou+1}N+dNB}DK{k$%n*br^Dmkd%o zbVw5f$L-cC2=rshBO=EeWH$4$4+`q>uhGBtt2Dg=;iN=$E57+u+R+GlC(W$&hSOyv z6Vw?l0h-ogiMq;Qe)9a4CMX5`XbgXB^aHaCh6;9U&g;a?hsUhs1(SFge*9if zVyb0GM}JId^Fwke+)kup7AVo0c_^~4ldP~z)sciTOU6d;95b1;gwWnCci)2^9S00O zXqK2XuVz41rbmV6#HLK9MKMP7$z5^m+BL(G%UakDzL`Hae`J7riIy9XGQ z*cJ$yc`}He7vPmd`&d zG3@RCF7!j;*MK~1CSS{9Oso;6V4oK4SchQhC7-e`aX-@kww{23cr54gsjCp;-00}{ z$=7ERn9xfD=|3csSw$C0EnGG>)~zxm0kU(amk)d%s6x; z@+w9t2ByIB2f-*PU$(23S`Q_1uUuHz%*r8lbCt;de~sV5tBEl-q%Ef-qL}JeEj4CBfqiwAJ(*rQF6Ju35uKHnoORp7w}qj! z$juN#Yyx~9GVm?V5k)1<#pF`UkMBr7NmMRUaRyDp5QV6cZEHFLqS9c6=wnc7@}}nj zGp;qS!t4Mj=Y1%95@d$`f!t~v5|Xt!r|(+p#heanMsxPExr6As?I0iN?`F3E0lBZK z#br}-9dTBb-LjEWvjh{!2(Sh(hwbxKs5(nqqKjD7E_db$9+Wxs zoBq57kuE3gtm4A17p&R9Z;d|?EVrTm(lYrg76`MP-UnDx4j;CE$AP&jW({lfJ~b>m zKz{XLdg~P`6RL0wT<#cTx&^VNg~kb!nIVXw%c&rTB+FzXAUlGb+5#m&AxAM*!WSw{ z7yMPNDm!Gt@#bzj=KrD72ug0k0GHwF8S@v_jUuk6WqQlx^(z&MA>nhTDP=O$?!8cm z3z8Fryk_Q@2b3Vlo%gZ7ET8*az#p1og~kw518xJdf#w2x?UE{~Rox)dp~T`dRb|D_ zc_hdl@oOLdcP;Y=s&Yn~t55eWPVWeVr0LqRncAvQ2RZYyr^-k#aY3#*EHIEH9VjPP zc{`k2HMm#h3u0c3cjnSu2)W9wN1ZcaWEBeeRHV&QGi$%FvbfxaCbns~pEKQc!kQ6c{p(PT8G9zBLKQhX0c{X8TrvKnci zu|SQK!^DyG{p!vRxw*WGtbN1{e%*ZE ziHez^i+E#C(3`0h3#%}iyYI~B=5+eAhgP!SFgJgGZhO0IeyFzMiEe%*oJ)rQ)1ED> z&k0BvkW(3y)?l=P4q65}s@w6Uxs*q6+h>B*1w6)S2=JAY^c$u8CHm(Z%F*d#S(vgT zBgZiY%oOAU-cC7=d=>_}6`$k~ayiE54;K;)gk61)(prR91Le`cp{N~M>%c%NN2{RuPw!hwFOz0+gFen;H+A3s^nLTiEB+?ZRy$c;5@=6ujTzLd z&BON0qG1a4(R|@dxD~nf5u9+ycJ=f@fCFyaK4?q3=B!U<7qTi02X%Tb^#rJMe5k2}--guJLU} zpVand%fpOv7^!fEG@;iIinK_le5(=XKPZa{pjc1^#e$OA3d%w)cdlZ(0I{EK?7%6c zH@CoC%?-G4EJhkCAezN#uw7&?b6NbtOrUspw>>(u;P=aoiw^pExp)8luGvs`^8de5 z_J4A=`Rdl<2naO-J}YJG%{&wfr$N0EqO4H$OK(|+r|`*at02zd_jQxIP_PgrNsfFi zE1KjikTg*G3eRDevUxLf|6W`HH$yM3^KW^fcfDch(?eBNe^A~Qy=U_xgk{+p?Icb~ zceGiFxVBl)&F*WGmR7>0od5PwC<-VcxR=B0(1mTqkt5bKW_-*? z>R(E5aFm&|nFKY}R(YJ}MG7k@v$ z3&Ic%Ek2e(R=wgelSXi?PV}JoRqno_kym(-FIU@Eb8#=UP;(BbNSHj$zafiBKr@id z)h5)tWWJfJh&Nm*Q6V?V<-tBTD!_}CM+o@Tg2hbag&>Ht^FQqd)FwFi z#Q%8eQ$K~uv!&G@F?))G?z(R=a|5>PlBO*5`%mlFQpp*r=;8$n}iSnAdc;xR;xuhQ2u{&>ig~m%mJ-kWZy`#=?I(d`B|$Sv%|;mM@$l zaL0ZNwV&B?czV=ZooXlKPIJ=2HG-ke$1-nSY|^YR&uuvD=SZ=@Ap(8g^s(r#B@726 zMigO+?lR4>4G{9z4;L3ag-yiA9*Tt+TP zswFMLaS?}ah|Cf>oFt6&{h9`DNc<@8@0(;-i zJNK!>fhMdB3h`s0{UqNmnMVe^v0PsOT&uY&Yw4VMvpL6>KUdElm-Z0}<*wFHmv25k zfF>+xTt84!Mesfe#GqaS>^p*?f>4*MTgyu@zAan6+48@tT|8$T|8+|B-_$hwp8*{e z1ZGhy?hkuORM&E=N+{gRHL*a24r<7|lv#}&Tg>%jJ^WaUm`w9U;4BSw|JJ7Tzt`+x zWLKEPy*MtCe0Vj2P}-x*@NWh1uhy7nMoPG2b0i zbb~sw2{MljAAef5n@ZyU6~Apz1#emQRIAThu|w`hV(H z^NcoWBeYNz37hZ09(L@SNA+!pRjCanYtzG>N@nZOm-wYy5LXz5;qmTBtZ|!H-AB$A z99G7{h&Eq>tNts8Vv->24_J0c)(l_5LlvG2jR=2P}OHlUF=# zey^;&XI0$92X-gsBG^3X_(V=+MZjB2Ut)2Wtj|%N5fjUCd8+aE{rF7(JGgs(*vHDE z;@G0n_haBybO7cA`0l}{=14}rwCa8duId85C(yIssq;e~syu30?29uy!6z;0;TH;J zBD`d&x*mK|q_@_~_hp~@`L$yMf=A$ck?!cbhl$dn*r<6Q9ledUgGlM&s+yt=san7+tAq{o!}DhXaWPwRUfEGIIBAr5D=Fw~cie6q95keORtiAR)!lqde{W~fOk>_S7R|f^zAAz``(hS2>;<*|<*gYr)_7r;Vh zI&*L2?OA}iA$d=QC9L_b!w9-fEN`iHiQyPyf+0y^t@O6wywqk9;a~8IxedtST%^3; zcUs5D`eacim0h9oPwEyR`+r0!lvFyvwOlvHzvW4IP3f}k=)Vc49l=Tm79raa;GEA! zO5Oy(9fBg^0V3Umm*{s&PBl9b(N5U(e$dg#L+Sv-34n9#y+ z5-cT!okTwUrZG=*r~IDno{ca#8vUL%Y_9Dsz&4tUOP5- z`qtxxa9hMQGoY3a!&y(l=)?#Ecfqt(HqDe-yvW&Y-+Om3^6 zxl6$H+B552ZZ=ZI?eS=IN35RdAw0NCEW0ZyMZgMyQ7@0rxiXa!*XUH;6cyJee6S%| zGJP<-;>|Vi5n>S8Lmslc8Z^u4lLw|S(Xln!Q}z+I5nh>a&2mHBOjajOQXQLkzM8?c z%I+s=BM$Zo_vONer!i7CbuA(9L@y)OXqALtJawX-P{Qxh7U;jPE>aF+p@{Xm{?c@>~cZm!fj;Hy*@dFrA9JV$AyE(eU@Bht!ai);WI@gEo`9U^yrrF_g~zsyuqpbwemJVMH?v=}i-<+FWUnu-S`kpC>0N+c8KL>nH zI-CNEL$cvNf~X7aDoF=qNwVQx$7!~v zN(Y9ag3kFW9I`mL@s$1UZ+Gq5=(sWHT%hj-zwdoEZVmZX@7s-@7Xp2uxwg$*!~6)| PQ$SeQ94a_)`iK7uI6*fc literal 19407 zcmeHPd03Oznn$hWDy_6t;9do>iWQZmtqKA{S`{&3K>-D2iHa2vAs|cGlGsvfg#r>4 zM3xi{BCw#G|=osx*}kq#1|shKXQ_?=cf< zUk&2Fhq(AWI?79YnVm{gIXJxs%y1yDz%9C~+lN0j^#Dv|*p7_xw9@&p9BF1_$1W=x znB595CMnvRF|qVS&^L@wF?*Xvw9&x6zijbHmc-a%gwKgGk zvUk9XWiAyh4tUVE_&CgoR;k8xdX|`gC^snstC0p9QQx7&!!Y|;)j~NNrH800`@vX* zlMKJ&4TMMnQ5J=0QwhhLhKGgp);ffVCgUx0J=LvdmIqK8vN_C~Ns zoT=~o=U?8CM~F36+2C;$Oc#YxRelKb1)rMJVwOVS$Sn3_BBF|JerhdB1>VadU1qFO z>)hR|)t-t{iHELJEagIN<^&Hx@BLmE6F!VzR97}CP5v(0cq`ZiTNMi}T_@;+Mi5+@ zN{`U^6FCJe%oa__CYjn-VtlkfzBK7VuLy|K)uhbWBEPNdN~0mWNlOKi(_!AnGFD;B zB1HZ8MV)RhQL@F)Z#=`xbuGqUs&&B^s*hlRb0u?RY8SvUo$`w9A*~BVkiY~iav>^m z^8Oc3hGVyvjyAUReGLR)Oa^FjPG!?n@&re_eL2P|sg7fQ zFH^HA(JzUSt?6VM2B_#Y9EW>UMHJpMo#!T9rSnQ$}{q+2o z@H?`rwqP;(b@F%lmtjpx00&W+7c~u_0$??1cF|rhiEhf~tpfjufrjL!dea`bzU%$A&QGLQi|btsPKO zI1@yl31Y%LD(paWsw*Im)RDw!;9f!m<{Hj^ zDT=}!X!ccnd9fZhndKUozLExum?o$uE?{-6n* zM~_!PHADA&Pdh&OMX4b02)@4rLD6Gz^F3i@1;iN*nQ|qs?0e28M6GVKKL!rZF}lUcNu*=Xc|oX^ zcrUU!9XH-C|H2<#NEIMwB77y@D0!zBn5IAy=;Fo8Y659=Ux`7G&Js*#=$L+w8-PeGreXrLfV`pDQjqmYB@Z7qaRxP znZBK38T{H<9s_qacKDj^_fZ?RZNmira`;CPA`kLCeB%#RNm3!|G&B%-+?5SeBATZ4 z7M+_lnvJaf!s+xqTno;2JC>1qPXRb?>XNuGJ6T?`t=9U8uOeNyZ>rs$kUZYZ%8TWi zJ#LVEXp`dkJrsFk9dfw~uByrO%WXk6s;j@f3q1j=A|2|Q-OZsCTs0u-U&GP!IXp%I zWxvcJndo`~J@^yN$WYa;XhSkG85{3Lz!daE4_b!UmvghBC|@m)B3qWu5Q3d^BSly+ z!}gxvhg;Cprk9vr0a<;HYH!_}8@vV`#c6)SZNdDICJ&w$)b6NtqS98Y%oj*>7)Uf! zlmdv z$-D$+-4_L4j%C~z=0@Wwxb#L^$Se0AV}z9d*~v4*sVlZWI|NZwld_=>f)?1RvXNZD`9|tv6Y~(jsD<(tSZ<#syEUp9HgXCvW&FH^uE#4_LVV*uS>89mxVd+$d#gvI7yB>^<6^1x#jF zInZ^+jIO(l(-CE7#{A57@-NbGjl8gJwwLY{S_hej85E>veatuOPGnkz*n8{Vp%`L3 zpt`LLW173J_Kztk#(fhTe*Ur*Iw?if$Hiomp$=lC=95+Qvk&YBt-IE!%kop9b)rYI zU0(5Nba%dRkjm%8x|K`p-3ir1i>b4woMko{B?9v?i-#92kmP3H;rUwifiKtCUuI(W zMK*!@Vhv{*J!!nTdhBLON|o7j{pfVuFm3e<5q?MM4_ii0G@C~BTE2SOOgktNT>cjt z(fVt;zfcTsUiHkZwZ*W4+pFiP-l4SSOrLWvV6|YFZKrYV2Cp#+xN*R*y@35GbRRgo zlgA;ypxEJHiHoEuP?(Ncoh^Cex;QHI^KJNcy8Y+%Z0Pu^oM7+OuG_N_3DqJrqQp9A z%Zjh5=_x7VoilVc59ULq6+k99101tl(qs|mh!bTQ3ehPk!aFl&@Xwqj@qk>k=MCP3 zv5Y7f6W~~M5r{_yWXLyB@1j9(mNW9vGqNMDY}P*^9qu-}cTtYVI99G5%wtc-!<&JS z;~)VcXR+pK!&)8K&+`Em8*r9zb`Ykf>Q7ItOjhwV8y{tEx-ld8`)9mQ;EY+hgi7mj9Gfi zatCqg(22%TOnh~p`|gjsETp&x5?vdboB7Js%srF28>?QF5X*(;)fZD}D`=fC4H6P+ zRnCA>5s;54(X$XkKJ>%XbsKUQ`6$F&H^hBU+dko1(+@Sm`{BnlyipfeAtRd#+&j)l zuED$%w*9JqkmtvyuSt2IXHk1AWKV0$SUN7b9#tys=4V`0+wt?jHM^hr$J`O4Q+s6u zAedHR3PsI2NJ3>*XDct^tziJ8AfrPG*7kQP^MlY3WYYD4=POg!))#F zKy02w-;|%D%a1sPJw6pH1%WuN$*0C{(!wB!qCI8-*wITAg`2l+$L}6!<^eK&rzZ&;Svg-J#p8dcdaCN@I<^+4R#!)R6saV_@}r(upqt>^NQhYy-`w!$@;$ zHlH))V8ed^Eq9k)p&mB>m3O%{?AarLk?w_^!sSe{<)oqz1d=z{N^-|tTxV4+vrZ+4 zO0wcd!y%1I$*0)c!Kc|Pb0)7v+xJM0U_FMqh54|PWqR?~BbOg5oT@{22`fpR_@ERA z4$Z$UtfYq6DcNo|{cGfsbJW-f@kPL&JCbYqrKTC@CoZSb?%6*UHN5UHd#1fIO>tg) z!I|CH=?35Er=RyS&W*Q!jRvN@hay`1QHk92X8?d!`#x^HSJG#}!fRE~(~S?0$6Ltt z5|OGwqIAb>*nv<0g(maOcGXjtQ5+CKON~{&aFx55*Dm_Ifo(3b?eI(s(P0Dvlj+pD zaKBBLZzUr>D||i(GR36^bzo6*u=$wUR}BgbW2PDNypOfX2PeE(@t#Y4pcm{Cv^Ev5 zFUGhAl7^WszfU&1i@GAL9co9^wpqT$Sj@O3haaYv6qi{CDf|icWa0W8wD97w3#c&| zzQMTlBDvh%HsZeI@#_RwdVt_{$XCFTrmATn1@*=ab0k*m%-o2~1Yj+at%=mRXWa1S z3S(>r9~>a8x)+>GE%Z)o&6Yeict{Qfl!d`Xg2&E11sg40a3`l~0ldrffb)Qftg1JS z7h_4{A+6z0P8imv!y4e0_8idYSDkp1sPN>zYz?GN?)+^&ey0AsZvkGzM&zu|!6*~; zRozHrV_&b$ZHqZ)+%m(x-*kfjK8)ZkU3Yd4KZ=T8VE`bFy!2JGWJ)clqVWB}UtmyR zWan+^fhE7J5_<>N!e})aMytTz=rxk5pSSFJ>w{-7Vs>=x0A@ua=RwO(Kp`tDhSWEt zb!HK+1a>32#wv#uVH=i3_1N*|=pn7o@C|Sjf|G&es7hOgTlxM<6z-(aBH(>r!l9>n znIUrd5%7&`+5VA3*pqiIN&JE1yx&5XI1@;Rz&3H#u_UW`+YnY!C85$c1_T-EYp@O+ z=gxv$bTh6R^4P$71V~(VKWVUOhD4;+S=3$|qe2S(2BpJiG-xEGX*l!?TCjdM`xE5K z1!8{7e;7Hcj*nVJiUlIq4H>z<;3$`^V@O}jJIV~j0H}0b8m{}!q6%OmP^m9P&ZaVbuyPrMx(N~B05rTHJz+e-L$2qbrbGHPVX?Tr>)dkgCwuU+1# zeq#gIEiBz)6X9wAj^$l?bR*%86Y2)*Q(Ct?kbx9tEt%Re+Kb&@IS3}X#cP*D+nCV8 zY@qycrA-z~&cf*48KrV7X~j3502oZT6stETF2PLn%fdekmbms3bA2_+e39x&s2h?m z;6U~VgC+e<5?3r32{`ledJJiNfwmKjTB$$rtq@J)+aPqhl)d_}`N3RL_5zLnml&2p zQz#*^q!n#iXCmr2p}!n{-$L4e-^kiMX?)9LWeq-?0U!Xmz(p@)EA4Z&iCmp;|JE1|U5H%tE5aRJp?uX~dsekgTrNdrFa^=@kiXiBX}h1Lb5 z<2Eg2z1eGJgk}CLv7>eUnYpVbSij!GtxX@V$@Kxb-mF9XBd3a)aCr~0U58HW=e)TJ zWGF0&AvOIs*#~^xJ9+}rZI;oPhhcRNb&F69wn7-2txpCev0$2ov*TMM=lY%im~T`@ zuy*hepA~V-ShKEmC!$^pWSQ{>2lRBvfjbN#8U1#u1xf8H0?yb%a52U)PB?WqOM_Ez zM6vQR*b>=jURKH zGj>UX$EqBO%9!7aG;K9YkI3)Vv(C+oN-=7fv2gCT$V97~+uYD(%2$cOrE`?bcxA8# zDWNocFv-JdX8s%IQWs8&M|S694j--{5VNUo`0ho7+bPWl{Vc$&Z$}S{DYdAZK2kv3){wRo6I%4e+(|JP=3%zOmFA*Kn zeqATg^bL4lPDX&uXQgx|AIH_l5^Ja=hYC~R;SW`yiv-ABf#VF?VcNSCT zV^>ddqwf`VKYFyn?(WBa1-td!{d4@UXNLmX&wGAY^YsjXhVB7o&|pVX5|f*Q4Q#W}dg}=h`C8Un;4)8e{s7}XH5)w+F$+P2 z8&nm5X;r{6!?uVVoFbk?a(_4~N1NZuc8!fu_?O#3&=49LxGOxU23vi0#^&YVfM zeK)Q={xO{JDo=q7Td5ETAc0j$!9{AxZ4UX#(~+=_pfjFFJfNi7QNNY#$NO_i?C-|w z#@cv#xO5oRr2-6o4G6zp65iDvIkqxCx^}(H^)41_+nx;)U)CAL z`jY|}{Pyhv=Yf-nVR}nnpD)oHl+Y3xkDGatWimU&OQrMVTM$<$xDP?K%Ig*Fa>m7akZHW^*OEiOS04D)dDB7xl95Zq|YFpxQps%Nn90bE~?hi?N z7e_`9SUXfLU?;!@>FzoE&tl$X9Dw@fRSt=* z42lvb$AlWZiB{U;6FeQpyGmlOEyL#k*sLYnEMsH(eA1cXE(&p(W>l%IG~9r1rH4Bi zJ6w$U8}QN!igt)s-FC25SzKzgunjuCCixL@M-yZ;+<{O_wv%po}# zgez?pO1kk5sqw86^R=;PZ7TXfEG8s0Ykf}dI|5pZ=G?i8evu}E2UfuYOOzz}Tk0BN z2;8p#2062!6PX+RAerA`|4wE+ysI-u~v*(l3^VGU3} z&?@nA-a_bdFV9OlOSxvE={nszn{PSXRnl=K=efX0|Cwz_Utx*`>+Y8N~?G;{2I;D=Z~;xK-d1HQ0$AbbpX5kE#l< zGr*A-5#R+C5Kt$f+H?iOw6D7A&#a?;aI80Y%J8Nm!*epuQxJ!lEP&I!j>j#!GE#&TPgk5>;uKsf0?lUGo6SQad+1veD6-IQiy4v;-}bEHM__)%v;MH%w=CRoAHaR_H30XiwF7ji08F?7Pw?uOC?p=V<8Ac-9zD}4oS`@~ zq^z=1PVrX%4uXFu^XxO@*-YY{!LJfr+p@4mOuaNvS0TFH-QQI}y(xR3!nW*4w^vp8 z0%#X+V+f0`2Aa)ho+kxzcK6!W`d@FoJ(CC+DB&u3CA36KpU`v^^-W|)$8d&HE>;BR zVqI#hkY2guI~2BW5IuON+y&QPK`WKN*t+@URBlfB^AXEf#;|MBT=9JXj?MQxe%)W` zID^*)9v_?mBLEYx_X%(}DyFDs`ZyPMSI@AOdXry3ZnSKfE#tv;+88IfYj&*ld@(dJ zMyV?fdV<_ZlkaOnz7sLn=g*oc@TG%HPJvg4TPIzD&7vZWzZ~lc_@s$ksF@g?Ny**J z=3l<*jrlmtG5Zjj8J&S(}4Gzz-ORCJfdNP&L zh|ScQG{Oux6!#U3zSx5nra)E2K_Fdo8p~zT8F%J#c!>dO)g1(9uf6*89-gJ9dwefE z{EOLC0c2IzX3H!fBR))0G;~0OF}j52Sl>xsWA|8?RaK0S+H4m&3!B7?Kl&V{GVogM zp(B2Ojs#p)@LEt*_W*!|AI{&sAp9*PBSJ-!!q>+*W2G41oW4W${tGYY+`Z!bV?`YpjF#jLXHdnstm>*9;C0bF;;f<)x z3Z_y!R>U1#1KN<3J?rGXfDc?!C!Z{=RWFdupVX@3YX{a`;;i8exP#gjE9+VJGX{r9 z^Mis)h#}z*YED$6D)^gL(If#{iahthyiN$H>Lc7_xCDsbTGVBMN(F$5jn>X18X|h; z3Zn8t7dGhCCp3w)oz~TzIhiLaOI2q(>zAU}Cf1z8%PtRG7xe8POc=?DS$VrpQB(o$ zW=?d*`gj_T%n$Y6l`Hd`v=?QQ8$&1T4J>q@tJ*Yg0JXTmLsO}e1ftzX?a=@%= ze$9$V`ZIi$z`iSB@@5>(fmYX7wR1YVyS->A+vaUe9u&(5LZz>!1g>Z@^i3DNO9D2k zWR-~W&Oz5j)+VTtI${AuP{4B%zUp7tAxWMd;$YC86#8&c{4OkAm{hYum|>FWTh8HRJ8}r%yyOG_RVQqiDC2eX7>nbL@LJ;vbn44@9!fC<-SUcW7AB(J0&LK3&V`76MKU_ zKe2QfyfCF)yDfciDt3D@oQZPvWfdsgde*`|8Ngn^F`|3d=j@s9 z80VCRevJ+>(cNf>PIKVw3XY7dtEs6;-LgWE7`{U06Jh`*8!zZ;p`5IsNk%ELt7;?OS`^gEz8eV|d)h9( zllAa*AE^{gW0K1{IEB(Y1oZR{8(-sS^=noJpDs-vzQh5f3Z1*4dm~4%H>S726oI!QRW~1OO%Wf z$FoYMn@?@33Fii!6V)YAOgnvtYlzRKCiEZRTLzeb+0KQcE#^|Zt7SOyH-?imAgF$l z){KoD3>c*}^|^YFq7b>0qByheC3kIw2;4%8kKQ3WM*3~YYu&%81GmuRKy)$g%|aWw z>GduMmUF&AFXZn0wxaxMhp6V3wF7ZpI0U`I|2J{)-`oE z1)A4zcCglfHd9$vQcLS*=>q(u;PC&U+aZVmwq0O&B_!4Q*~A8PjX{J0t@Vn4#9$h5 znv3&>%8O?F^sMD1wq}avvIh9xnV!5)za~}_iG5}~Tbu_iN)VA3wq5_ljpu)}+T*G` zWE3CWV>!iw#Nd1H+*uIa!Jf`)?(^av^CGU7+AX*&ArAuX<2e9Rli1>HQk zN_CiyMI3fO_jHG&%S4=Za!;obwn|b=ChOqHGktt{gPkIYY_S^HSS9QbyNQn!roORg zOV+^GD7W*$QsO355Z5`*xlV8mN0Pioy(7K?bXP|jqNkfGcyYht0|G8v^w^-_GhFVx z>s^&pA5@U+b4F*UU(u=EEUjnu;Ex#3RwKeznAKKk` z(AWD3`-Vdet@TlR^WR=Hb0n1$4o}{C3RQCcE;;^1hpkMc z0GN^PAAtMtE1zj?<2`9K9DM&L#hr%5>Jl1nSM*pE zL)Uyr@G;F!a@R0v<=5?I@Qu1xUu3w+FvOc*6G&*MsC)kY+JeKb#)c;HTJ(zX-%kxn zlJacc2h-OK>E1~t-rIxl8_e@7uUZoK*xe0rO%G}ATG)KIY@!M@y?W@?;L#6BO{4zu zI=1$B|5vvs{tliNxZm|Seoj#i>v>VV4<1o{tUCasy82>OIZhu*2rfO9br>!0l9Ur; z4FMyywkVyD8jx;FAdy2)p1h)c+V6>}&bRV|<*+5KGVr*;JzbQSP*nPAe8u+Vm_X^o zbO`P&9z3%su*0@%ZH%Lwm1;tbjp6*w6Ov%xpe**~1xW^}Dq9Y`Qy1=qTbHzF(D$W?_-!6T#3?Dxag539^B9FPJ{>OdgX^D5WaT4y&ENPcj8 zoEKD{N+iy)5HHTsLngCBOp{{l(%q|n3X7x}z|OvH@S;N4W_1&E}M2*1AraeLUyCm7N4?p6~p>bWtzaZs5sWiJDq8 z52Bi_nzQU!_@!lxl4k->zKoodk9`{+G4Q|aQAU|BR6$!qtvRCXfI$(x zNV1Q@v=G~xZdD3YNqW_rX=VxcTMOqoUyzg>|8?KF;ZwaNJBZmf!D5;hYHjF_G{Ct6~OotCNC!C`I4WP z4KemTkUgSV3GL}AAka6CWK}C}48VTtL1;+_?tbQm64b;agr(Q}NCIDp;S)}An~aX7 zcAKJ3x1_d|LgT|>`1sboaA8?0v?`eqBJGYwqX?ux4P6JNAXrLa4zDqlGFO1BHs!ZBXGzdv>aOhCyl z%kQ+n$S64%RYai^?ej2JUwTcNs9RyUjMx2=T4Hnk%=+_qXyz(=YMG62;y9i&_$(*8 zEApkq2C48VMc9pxkP3)plbcp^DlMCH%8ZfC&rJ|bBlhMvB8Y6BQJEXrt^5ej_{Vta zIjIAW(G}&NEbOMAr8y0{b3hRQ(ewzv9=z-=6MlLGEpHC~kI>K`7z)5kN+LT16z5#^ zftd;>3<1HTQzIvXP2YnU8x0@T06?zH1u9A~TJ`7J*;EFeoA#dLidEnj46hc!XE=8J z_+DU3SlE`jz>Q%-Yhi82jPZc)M_khY^x<+>e!dO-aNh$eodW-;f?G-r@Xs#rCh+7L z@H6}m9BwiE;Y{_TcG^5H?Vt7p7oZaM)^99{-&Nj_X1 z+#^>EkDpzA8>o;e&IiD>f}BV3U#iN7(*tK${}CV?IXRo=$mu*htXSP_c6Iv1U(A9f z_ZPF|3iX#}DXjJ{GlZQ9_b;C%cc6bccty1ND;ml}^IytUK!T#h0IdzRqP`@VDpveEd(ITc;oTrO}t`&iI`7 YgV)+DzKH!1%u_*H+wCpbed7E70MbA&RsaA1 diff --git a/apps/termtris/verify.sh b/apps/termtris/verify.sh new file mode 100755 index 0000000..5d0420f --- /dev/null +++ b/apps/termtris/verify.sh @@ -0,0 +1,107 @@ +#!/bin/sh +# verify.sh -- one-command acceptance for the VT1200 termtris port. +# +# apps/termtris/verify.sh # build MAME, then run every test +# apps/termtris/verify.sh --skip-mame # use the emulator already installed +# +# Exits non-zero on the first failed check. Each test's full output is kept in +# apps/termtris/build/verify_.log. +set -eu + +DIR=$(cd "$(dirname "$0")" && pwd) +ROOT=$(cd "$DIR/../.." && pwd) +M=${MAME:-/home/arti/code/k-space/mame0289/vt1200} +ROM_MD5=b46a3e442ccb86134d2356bd70d22fd2 + +skip_mame=0 +for arg in "$@"; do + case $arg in + --skip-mame) skip_mame=1 ;; + -h|--help) + sed -n '2,8p' "$0" | sed 's/^# \{0,1\}//' + exit 0 + ;; + *) + echo "verify.sh: unknown argument: $arg" >&2 + exit 2 + ;; + esac +done + +mkdir -p "$DIR/build" + +echo "== ROM checksum" +got=$(md5sum "$ROOT/vt1200_v22.bin" | cut -d' ' -f1) +if [ "$got" != "$ROM_MD5" ]; then + echo "FAIL: vt1200_v22.bin md5 is $got, expected $ROM_MD5" >&2 + exit 1 +fi +echo "ok: $got" + +echo "== 2ine toolchain" +LX="${NINE:-/home/arti/os2-work/2ine/build}/lx_loader" +if [ ! -x "$LX" ]; then + echo "FAIL: no 2ine lx_loader at $LX (set NINE=/path/to/2ine/build)" >&2 + exit 1 +fi +echo "ok: $LX" + +echo "== emulator" +if [ "$skip_mame" -eq 0 ]; then + JOBS=${JOBS:-8} "$ROOT/harness/mame/build.sh" +fi +if [ ! -x "$M" ]; then + echo "FAIL: no vt1200 binary at $M (set MAME=... or drop --skip-mame)" >&2 + exit 1 +fi +echo "ok: $M" + +export MAME="$M" +fail=0 + +run() { + name=$1 + shift + printf '== %-9s ' "$name" + if "$@" >"$DIR/build/verify_$name.log" 2>&1; then + echo "PASS" + else + echo "FAIL (apps/termtris/build/verify_$name.log)" + tail -20 "$DIR/build/verify_$name.log" | sed 's/^/ /' + fail=1 + fi +} + +run smoke "$DIR/tests/smoke.sh" +run fmt "$DIR/tests/fmt.sh" +run render "$DIR/tests/render.sh" +run input "$DIR/tests/input.sh" +run play "$DIR/tests/play.sh" +run play_keys "$DIR/tests/play_keys.sh" + +echo +echo "== play acceptance" +if [ -f "$DIR/build/play_move.log" ]; then + for mode in move panels quit; do + grep -a -h 'DIAG: loops' "$DIR/build/play_$mode.log" 2>/dev/null | + head -1 | sed "s/^/ $mode /" + done +fi + +echo +echo "== evidence" +ls -1 "$DIR"/evidence/*.png 2>/dev/null | sed 's/^/ /' + +echo +echo "== ROM checksum (after the suite)" +got=$(md5sum "$ROOT/vt1200_v22.bin" | cut -d' ' -f1) +[ "$got" = "$ROM_MD5" ] || { echo "FAIL: ROM changed during the run" >&2; exit 1; } +echo "ok: $got" + +if [ "$fail" -ne 0 ]; then + echo + echo "verify: FAILED" >&2 + exit 1 +fi +echo +echo "verify: PASS" diff --git a/harness/mame/TERMTRIS_REPORT.md b/harness/mame/TERMTRIS_REPORT.md index aaa78d2..88a7688 100644 --- a/harness/mame/TERMTRIS_REPORT.md +++ b/harness/mame/TERMTRIS_REPORT.md @@ -94,9 +94,9 @@ The run is `VT1200_SKIP_LEVEL1=1 LOADER_AT=2500` with the loader payload at bit Last full acceptance run: ``` -move DIAG: loops=333 events=18 focus=00400001 quit=0 -panels DIAG: loops=323 events=12 focus=00400001 quit=0 -quit DIAG: loops=277 events=10 focus=00400001 quit=1 +move DIAG: loops=348 events=19 focus=00400001 quit=0 +panels DIAG: loops=338 events=13 focus=00400001 quit=0 +quit DIAG: loops=292 events=11 focus=00400001 quit=1 ``` `focus=00400001` is the termtris window, and `quit=1` is the game's global after