From 3e1ff312a5f5a8f4c026511410e0a6317196e6c7 Mon Sep 17 00:00:00 2001 From: m3ultra Date: Fri, 7 Aug 2026 12:28:25 +1000 Subject: [PATCH] =?UTF-8?q?Lane=20D=20R40=20=C2=A740.5:=20the=20peds=20com?= =?UTF-8?q?e=20in=20the=20front=20door=20=E2=80=94=20100%=20on=20every=20r?= =?UTF-8?q?eal=20town?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Verification first, and B's R39 heading fix did NOT clear the gate alone. Measured today (tools/qa/door_footpath_check.mjs, new): synthetic 447/493 foot (90.7%) · katoomba 71/72 · fitzroy 138/139 · bowral 28/30 (93.3%) — from R39's 0/493, 0/72, 0/139, 0/30. Two residue species, handled differently ON PURPOSE: 1. A 0.85m kerb miss on real towns — plan_osm's setback puts the facade past the corridor edge, so the shell's d/2+0.6 door point lands just off the verge. Fixed by new D-owned door_snap.js, applied in sim.setShops: clamps each door into the registry vergeBand of its nearest footpath-bearing edge, 6m cap. Corpus: fixes 4, breaks 0. Live-shell verified (493 points, 2 moved, max 5.41m — matches node exactly). Real towns now 72/72, 139/139, 30/30. 2. The synthetic's 36 strict misses are market stalls and arcade shops WHOSE FRONT IS THE MARKET SQUARE. An uncapped snap would 'pass' them by teleporting a door 59.85m to a street they do not front — passing the gate by breaking the truth it measures. The gate instead scores walkable front ground (footpath ∪ market/arcade block ground) = 473/493 (95.9%) and reports the strict number alongside. The check ships its own falsifiability CONTROL (the R8-R39 back point must score under the floor: reads 0.4-13.3%) and a fix-only arm (clamp breaks 0, asserted forever). Deterministic. Remaining 20 synthetic misses are artefacts of the fixed nudge at index.html:433-437 — not D's file; measured, exact fix documented for F. Goldens untouched. Co-Authored-By: Claude Fable 5 --- D-progress.md | 64 ++++++++++ docs/LANES/LANE_D_NOTES.md | 68 +++++++++++ docs/shots/laneD/r40_front_duckin.jpg | Bin 0 -> 78363 bytes tools/qa/door_footpath_check.mjs | 165 ++++++++++++++++++++++++++ web/js/citizens/door_snap.js | 62 ++++++++++ web/js/citizens/sim.js | 22 +++- 6 files changed, 380 insertions(+), 1 deletion(-) create mode 100644 docs/shots/laneD/r40_front_duckin.jpg create mode 100644 tools/qa/door_footpath_check.mjs create mode 100644 web/js/citizens/door_snap.js diff --git a/D-progress.md b/D-progress.md index 8eb1e36..2c45d00 100644 --- a/D-progress.md +++ b/D-progress.md @@ -1,5 +1,69 @@ # PROCITY-D — progress (Lane D · Citizens) +## Round 40 (§40.5) — the door points and the footpath: measured, kerb-clamped, gated. (2026-08-04) + +**Verification first, per the brief.** New gate `tools/qa/door_footpath_check.mjs` re-derives every +door point EXACTLY as the shell does (`lot + front-normal·(d/2+0.6)`, web/index.html:433-437) and +classifies it against the plan's own geometry (registry's `vergeBand` corridor law + lots + blocks). +All numbers below are from today's runs on today's tree. + +| town | R39 (shipped) | today, B's fix only — footpath | today — walkable front | after D's clamp — footpath | **after D's clamp — walkable front** | +|---|---|---|---|---|---| +| synthetic@20261990 | 0/493 | 447/493 · 90.7% | 473 · 95.9% | 447 · 90.7% | **473/493 · 95.9%** ✅ | +| katoomba_real | 0/72 | 71/72 · 98.6% | 71 · 98.6% | 72 · 100% | **72/72 · 100%** ✅ | +| fitzroy_real | 0/139 | 138/139 · 99.3% | 138 · 99.3% | 139 · 100% | **139/139 · 100%** ✅ | +| bowral_real | 0/30 | 28/30 · 93.3% | 28 · 93.3% | 30 · 100% | **30/30 · 100%** ✅ | + +**Verdict: B's two-character R39 fix did the heavy lifting (0% → ~91–99%) but did NOT clear the +≥95% gate alone** — bowral read 93.3% and the synthetic 90.7% strict. Two residue species, and they +wanted different answers: + +1. **Kerb misses (fixed by D).** On real towns `plan_osm` sets lots back at + `max(KERB, roadWidth/2 + FOOTPATH)`, so on narrow corridors the facade sits past the corridor + edge and the shell's `+0.6` nudge lands the door point **0.85 m outside the verge band** — + 1/72 katoomba, 1/139 fitzroy, 2/30 bowral. Fix: **`web/js/citizens/door_snap.js`** (new, pure, + no THREE, no rng) — clamp a door point into the footpath band of its nearest footpath-bearing + street, applied at intake in `sim.setShops`. Registry's published `vergeBand` over the sim's own + edges; graph-only stays graph-only. Capped at 6 m so a plaza front is never dragged to a street + it doesn't front; margin 0.45 m off the band edges. Transition-checked corpus-wide: **fixes 4, + breaks 0** (a gate arm asserts breaks = 0 forever). Live-shell verified: booted the game, + diffed `sim.shopsByChunk` against the raw derivation in the running page — 493 points, 2 moved, + max 5.41 m, exactly matching the node run. +2. **Plaza fronts (a definition, not a defect).** The synthetic's 36-shop strict-footpath residue + is **market stalls fronting the market square** (`use:"stall"`, block 25 `kind:"market"`) and + arcade shops — their front IS the square, they can never be in a street's verge band, and + dragging their door 50–73 m to a street they don't front (measured: that's what an uncapped + snap does) would re-break the front-door truth. The gate therefore scores **walkable front + ground** — footpath, or the open ground of a `market`/`arcade` block (outside every lot, off + every carriageway) — and reports the strict R39-style footpath number alongside for continuity. + Peds never reach stalls anyway (50–73 m from every walkable edge vs PATRON_RANGE 18) — their + door points are inert data today. + +**Remaining synthetic residue (20/493, under the floor, documented not fixed):** stall-vs-stall +front overlaps (6), stalls at the square's edge clipping a carriageway (8), 3 shop + 1 anchor +corner cases, 2 shops fronting into a neighbour lot. All are **derivation** artefacts of the fixed +`d/2+0.6` nudge in `web/index.html:433-437` (F's shell, B's R39 hands) — if a later round wants +them, the recommended fix is deriving from `buildShopfront`'s own `doorRect` instead of the fixed +nudge; measured detail in LANE_D_NOTES §40. Out of D's graph-only reach and under the gate's floor. + +**Gate arms (all green, 12/12):** rate ≥95% on all four towns · CONTROL — the back point (the exact +R8–R39 defect) must score under the floor on every town or the classifier is vacuous (it reads +0.4–13.3%) · FIX-ONLY — the clamp breaks 0 previously-passing points. Deterministic: two runs +byte-identical JSON. **Goldens untouched: selfcheck 157,647/157,647, fingerprint `0x5f76e76`** (the +clamp is runtime pose in D's sim; citygen never touched). + +**The picture:** `docs/shots/laneD/r40_front_duckin.jpg` — a rigged ped mid-stride ON the footpath, +frozen 3.2 m from the VIDEO BARN front door it is ducking into (staged via the sim's own +`_beginVisit` + a pause at the threshold; steering, door point and entry are the shipped code). + +**→ Fable/Lane F (one line, as briefed):** please wire `node tools/qa/door_footpath_check.mjs` into +`tools/qa.sh` (rc 0/1, ~2 s, zero deps — same shape as the other node gates). Not editing qa.sh +myself; F owns the runner. + +Files touched: `web/js/citizens/door_snap.js` (new) · `web/js/citizens/sim.js` (import + setShops +clamp) · `tools/qa/door_footpath_check.mjs` (new gate) · `docs/shots/laneD/r40_front_duckin.jpg` +(new) · this file · LANE_D_NOTES §40. + ## Round 12 (v3.0-alpha) — the band and the crowd, behind `?gigs=1`. (2026-07-15) Friday night at The Thornbury Hotel: a band on C's stage and a mixed crowd at C's watch points. diff --git a/docs/LANES/LANE_D_NOTES.md b/docs/LANES/LANE_D_NOTES.md index 297a6d6..06a4f84 100644 --- a/docs/LANES/LANE_D_NOTES.md +++ b/docs/LANES/LANE_D_NOTES.md @@ -6,6 +6,74 @@ _rotOnly/head-bone normalize/upgradeStreetPeople). Measurements on the M3 Ultra --- +## ROUND 40 (§40.5) — THE DOOR POINTS AND THE FOOTPATH: the kerb clamp + the gate + +Summary in `D-progress.md` §Round 40; this is the measured detail a later lane will want. + +### Today's numbers (all re-measured 2026-08-04, `tools/qa/door_footpath_check.mjs`) + +R39 shipped **0 door points on a footpath corpus-wide** (0/493 · 0/72 · 0/139 · 0/30 — the +`(−sin,−cos)` sign at `index.html:428`-era, B's lineage table). B's R39 `+sin/+cos` fix, measured +on today's tree, before any D change: + +| town | strict footpath | walkable front | residue classes (walkable) | +|---|---|---|---| +| synthetic@20261990 | 447/493 · 90.7% | 473 · 95.9% | shop:carriageway 3 · stall:carriageway 8 · stall:in-a-lot 6 · anchor:off-verge 1 · shop:in-a-lot 2 | +| katoomba_real | 71/72 · 98.6% | 71 · 98.6% | shop:off-verge 1 (0.85 m) | +| fitzroy_real | 138/139 · 99.3% | 138 · 99.3% | shop:off-verge 1 (0.85 m) | +| bowral_real | 28/30 · 93.3% | 28 · 93.3% | shop:off-verge 2 (0.85 m) | + +After D's clamp (`door_snap.js` in `sim.setShops`): **katoomba 72/72, fitzroy 139/139, bowral +30/30 — 100% on both measures; synthetic unchanged at 473/493 walkable (95.9%)**. Corpus +transitions: fixes 4, breaks 0, moves 7 points total, max move 5.41 m (synthetic) / 0.85 m (real). + +### The two residue species, and why they got different answers + +1. **The 0.85 m kerb miss (fixed here).** `plan_osm.js:466-468` sets a real-town lot back at + `max(KERB, roadWidth(pe)/2 + FOOTPATH)` from the centreline. On corridors where that exceeds + `edge.width/2`, the facade stands past the corridor edge, so the shell's door point + (`d/2 + 0.6`) lands just OUTSIDE `vergeBand(e)` — off the walkable strip by under a metre. The + ped steered to the gutter shadow, not the footpath. `snapDoorToFootpath` clamps the point into + `[kerb+0.45, corridorEdge−0.45]` of its nearest footpath-bearing edge. Registry's published + split, the sim's own edges — no lots, no plan, no rng, so "sim stays graph-only" holds and same + seed → same doors. +2. **The plaza fronts (measured, deliberately NOT dragged).** The synthetic's big strict-footpath + residue is 36 market stalls + arcade shops, 50–73 m from every footpath-bearing edge, fronting + the market square / covered arcade. An UNCAPPED snap "passes" them (measured: 488/493 strict) + by moving doors up to **59.85 m** onto a main street they do not front — peds would duck into a + stall by vanishing at a point three shops away. That is the R8 defect wearing a green tick. The + 6 m cap exists to forbid exactly this; the gate scores plaza ground as a valid FRONT instead. + +### For whoever owns the derivation next (F's shell / B was last in) + +The remaining 20 synthetic misses are artefacts of the **fixed nudge** at `web/index.html:433-437`: +`door = lot + (sin ry, cos ry) · (d/2 + 0.6)` assumes 0.6 m in front of the facade midline is clear +public ground. On 4.5 m stalls packed in the square, that lands inside the neighbouring stall +(6 cases) or past the square's kerb line (8); on two synthetic corner shops it clips the cross +street's carriageway. If a round ever needs those: derive the point from `buildShopfront`'s own +`doorRect` (buildings.js:410-416, :583-597 — the actual door, not the lot midline) instead of the +nudge. I did not touch it — not my file, and the gate passes without it. + +### The gate (`tools/qa/door_footpath_check.mjs`) — what keeps this honest + +- Imports the SHIPPED `door_snap.js` (the sim's code path, not a copy) and replicates the shell's + raw derivation; measures both, so a regression in either shows as its own number. +- **CONTROL:** the back point — the exact R8→R39 defect — must score under the floor on every town + (reads 0.4–13.3%). A heading has no falsifiable arm inside the file that computes it (B's R39 + keeper insight), so this gate carries one. +- **FIX-ONLY:** the clamp may break 0 previously-passing points, ever. +- Deterministic (two runs byte-identical), ~2 s, zero deps, exit 0/1. **→ F: one line in qa.sh, + please — `node tools/qa/door_footpath_check.mjs` with the other node gates.** +- Goldens: selfcheck 157,647/157,647, fingerprint `0x5f76e76`, run today after the change. + +### Shot + +`docs/shots/laneD/r40_front_duckin.jpg` — near-tier rig frozen 3.2 m from the VIDEO BARN door, +mid-stride ON the footpath under the verandah (staged via the sim's own `_beginVisit` + `setPaused` +at the threshold; the steering, the stored door point and the entry radius are all shipped code). + +--- + ## ROUND 36 (wave 2.5) — CLASSIC KEEPS ITS PEOPLE: the DJ bodies gated out of `?classic` **The ruling (Fable, on F's §36.4 held warn):** `b339402` (July 20) appended the 5 trellis'd DJ diff --git a/docs/shots/laneD/r40_front_duckin.jpg b/docs/shots/laneD/r40_front_duckin.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c222513c41c35d96a7842c8cef1de28ba2c88d37 GIT binary patch literal 78363 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%0DAx9ciCJ1R?dj@oAfptp!!9!`I&{t)PYs z8WdOTE9CTh!twAwzcsqkHh5>jIMwW6D7HfFo2Zxj-=bzI=KNJ%LmnydtV8p*5meKw z$SaZ7D||R`MpFl_c8 z(VG^y#jo7)k6P0^TSOj|y-O!i_q+`vRivs(jf|mh3BCtjngRbR+o(MQ41Z)J`Ro8a z{D~i&{szAz&wj5qJZXB}{sB&*4cUcO(ac`e2jfo%{SFp9=_Smz}fQo6Z&+K^)iU<0@7)yAk_!bo|74a6EOg z3|9wA4LS!WSCu-YGdrM%uGlq=7f-seC*D3+p|6%I)n?wHeTcg8OCh+`QmK1QDK5=a zU&pf1A`G@!FPWwrCdqE5*3hSw}_){ly2vHq)1pwL$qTs#VyVR-)K-fLQFwi2_%B^h!~7dU&Q z>=-Nlt5B1t;v`;^@^pS*G}jc@5>qr)MpYBijq{J@|RFr1Z}P-2~(Ut9ps7-1R>MYToQsk za9w}scPk=DxV{{sRa?|MJDhNs&Ew__@&&8$?jwyld`&j1O@K1er}CKZa__0TFn7b{+uumGdyc1h5=^ZAik`QG? zu*>}6=OJu$nKx-lI7c!$mo2I+|Hf`;$~%$MWx^mzK)gRaeUvT-znxIe@f~h@vrPm1 zc~2>(O#(8h$+V{`0*ZwT)uwx^CXMBNrY`1ZSci_XjLTUs)7oUOyv=P?JP}n01*8<` z;as*F1#mi{58}mo!odY^)ToqptCa-R4Rv6g{I)NqoXwp7;A(B{Ra2b_zrD*TGNi0t z{-#}XvM={At00?sTbk2&-H?UmGa>katZ|=X7Ub;wl!!ma+CzAF_02T*`p3v26v>`; zx9RQE_jY)8!h?|8E(|p0LiOO~_cU`8bYcHALlV2VpN^s>lJ-ADH;pwovtjHIM8ljK z$GfJwM4QrBCF}9FJF;obCAzg+0pYFchU*O@Nc=|rSP$yuCE?jJ5p&3Dnj zoqMlLC`;)s-Xic);4`gDiAR>b#-k|BkDRsWPU`9u10TLD-2Sb@x15oSc!mW#Fb(sp zuj`APFAfwK2JkVm?X5^NDkcs!GV?Xf-jo(y+$;JSBQnV&NBlff`;ol!C2Fw$cZyL^ z8ENKZYJ_|6p9Xx$pyK0rEu5Ms2J<4u#XUF&#Pa%1f_p~RPnRxTR^ip#w|&w%AAgZ$ z$=LX@d!u_QmUC?SV)!{FZDI<SW0Ob2xCQ%A`7nAdMivC-+lRO3%lGA|kgAUN5KO ztWlv4 z&0?82P@=VJ$zuMiN<3x&2SqBtugALQ_}KVdj*ISvlZW3i2D^OD8Lx1+NQL3}kQIFQIE5Z#Gk2_4+l8w`91339HltcSae~};pq=Qg{wbnJ%ZHo74 z9z1higrK63E2%2)OxcRk<0&yI>Sb|s8T+*6wXMqO66;%s2SKoQBD?xvp-X@DfgikrPal8tD=aAueXP_JPF0nRvuIS> zBtgV-!o?lv?sH9A!wBa?`+}y$eLh0G+!aMXJgD$StR3}N7+vOP7#tHGgykCs=SPNn zZr)^wmom|0h2W;;%l<+g{6gQ!R4LX{28!480iM!b+`s#9*WdDyW`3rs)ql6rQ`$31 zp9eM3Tw4{iiHKKUxPX{BS}cwEGA$!jRa&S1RN?RK7WuTMeN10Fwu`x;WtlQU_)@Cu z>GUoI<&yx4eYD;nYQ2=J$;%H`l>likcArFn0)fAUGG!;7yvKHxGcaFfVcW}P%l%7|B`79@2TJ+nDP!4sW0G&HR7&lp#LHgTveDH7UaG@*Gh?9+?YHV z5N?Ruv;Hi+Wz=77SJ>|gU z(4kPh)uWk2cgqW0dW~8u^Q!YiR9sg%oW38PPpbL@6xc+VTK`uwD5*(tIO2Ax77KPP zV2v!J6}*|DgzU`Scg)w9g!Fe78pp-cDyX%OnrH0z*Uf9Hyn(Oppo-LkgcKKoYj;++ ziqEbZT*&|G)$B}JtCt<&06{AaY|HEiBEP-G3!(MQ4W==ztxqb%?Ud%y#{Tm$hb(h^rsfs zEle%6SYE1HDQ{scbow?--SGEtJ zBr#|wXCAs_miW4MXaXq=5eFK$qb-!bDQ`_hTgag6=BK>=_JcLj5G!y>EmMf4pu|r( z7C#wRI5N=tOh6!cB-Qp|c zuy;1V9pd!_3P~kPb-eSK>bfjT6|PK{ga@S}y^ZtGQ*q&-5~Cb@r7>4aoHXOwK(^PY z3|ZeRdXMDPZ2g2>LNEz;3woacNsd9%SyBUiJX7OrUo#~>lmw}E7U@9VV^VMBpZiI% zmMy90bqf;Mft~A8l1h9f>39UX78Yf`uj#KDN_759D~85&5uz5)|8l~9 zw_17R><^m85@ZVr%)LcmI9iKOx80~x2T9K~mU&inB`MRVwsc|kt5F4j98Xiaxv2Xw_u0=x+|>=#Q}mD!#F z)KbNtV`5)ZF6~4lwY-r8GQ_;k6y=4ruW=ReLkM|7H}$~-G{z3)Rl-5O;w?wRs-(M93lh`|p%75&&dpBNFwWbu5Hx{EWI}O}HRifq$ zXQXQSELAz0H$Ea>1tn-gL&;hF$P>CnS$2NgL#r!ZpRF7epp?m}GW1C@R+9&E+e5dP zlK?T&YlvnwVXf`lEo5D^&y$A*j%_;9m=lR1rG=u>%Y6*ch+NK^k~4)9$xrDiDt(Z+ zAZ&&hX;tW>%sDYR${OAXoVm(e5T?M7)fj-ObinzBrF4dK)<=5^=Px5dfXq$(5<{Bp z=kA=32$+wSv!E<3(_CQsT1ydMS99tTKHPf3YK|XU74B>s8S*=4yEycF2=RW(Zthxu z&VRdTs3Akq0>KCGe~AbyHd?*{osCpaSK>(kD!Q_#GSH1)wz+?%QI z2!+Tx3sSz;dYToU1-M177r3VE;5qmn@mEE4B)q1+B>%0dsyb+70m9$T-om)WIF$-E zVWHzc)zGj`Qg|fk8ZA`1Brjhhnqk2bE4p2;i0Iaz>yVL?xfa-9m?rWNNPhZq^_gaj zhW`hK@ttzmW*$y1>Z?z0`{>E6W~}@=z4aRE zHfy~uT}9O#;VuV_o$1z4Tu-{3b=DEtr>}9;&JrG=e2_fcpb8VQK^vm7eoZL-^4FId ztkF?4C=u3ypoAz!qt%Z$#@3$MQ`~`y@bGc^ z%g=yQ+^wr*IRy+s$M|ee%O7R<@f?{-8d%3g?yBr7VHCm8?E;hh7GedBf>d}@V9+Y@ru@WK z(&H}YK?X;IF3ukd@oLG{!xGH3%Ff)2GFt>zhO%|E>A&+#Cal87ic${ocL%nT%}q~YAf7dz4VHKi|??5}3W z)I`aC!}Sc9YM5;d9eI2co9teoGiP&D)n7xaQDC#%U-Kz7c~>x6zpDlbS9nZZ{aY0g z4r`jUrF?pA8sUqfk5pTNdrs76Zge>;Sh!6xBR3#!hm2}QqViZ=^~?NK^X{#J8I&4!6yy(TPp$a7~zloHP#`TX{Erup2ryC|*U zK9*bxnP`r^&j+IP9}OZnDMPZx;#+CC;AK>)r))J|Q{px&^2K_qik2M=;KfTP^Ryc< zR45l|6Nq7Vy(`=_^Z@B3LNa~s|VL3T$J9MndEFCjC(#ZL`)zn}!%@y8s(V-@-|DK7@RXicib32Sh z+>dbX^`KY^8khn6CRsFa2&UAO?u$P0%UQw+9=}>d^(jjhTjVIA8wbkL!&{+eUubh2ePSu;L9ca?F4t&Lh*f#0vS2v zEIM`BJiIo2LzGUmP~X@sX#Sm6HgXMZhQ3ID!1#&cRDs6ctM=gp(|1`2iCSV@(Gb(g z0*lW`p0=W|x!XI1p5bpI1n3#A5plCB_%gq7%R2X3dPgo81_ac0;F4Mkb&YJE2 zC3br`68g~lcXBcUX8lhjR`u^;g#bxJY@#S%8#TeN z?=T8P5`?hd()!!e)`GB?t&ioau=EQ!n(X^Gjc&K=w>~N4jEbe84u-70qc+`Drg<-X z^4h<~Q$PnBr~3q@clm{A`YRg_&%blgEMEfaAq3Pjz|x^sVn%9j6xbQA2!}RWgz^`8 z3&-q!40jn)HO$vuHqU6qIvl1ytmGc3Ob`8MJ45Hnr4RRCseOl!TiIfDFt$eVpk$`C z_(KvsG5*#)3(n~-dnw+S`Nfyfs7IVGQp{0kp_}^$mb3-5eASZetLz?A0cgURgHrf%t~u0f%jniz=qbzp|0qo5#8X|X=m0{CD@L*k$<_Qj_rh6S zuyEmhz-*(#z~k$r-&gq)haiSS_yP!OTMDtlO5cQ!w^MMlJbn~@ND@zGZV&Mf}r?>xka9|!r>Mg$g{5SG&`{#!EXUZ#xVT##{fAg37x zO_b`-^$#4Eu)J>Fs~E~J%IyjSlHa{-$XukNrXSEXM7n*zS#>JiwTFf=HEKmKvaT6G z)bI##?!->W(jig$@1E5!&5Gqrt! zPt!zFxZ$BMf5JpVlI~c=HqWu9L8kZOPCL3~bxTs|!*~OWH5(_j$K-h?>uOhB-I^A4 zPJ|2w6j|YL`jkbRM6TLP=K2Tl+Smp8C~kP)50mQkKPd=pZ+o36?L}dpk*!Xj9$s4M z{a8Ku&T5Tf^)|y??9Nxft4%CT`uD4aeC6;jKQQ0`-9RFokNo9ET)4s_&RbFi80YI*gGk^o0byG8bzd`U=wE>!}2AyeP-uZ)l8DpUN2Q7bN z$>?x>qFMi#nJUp_44?Rxto?UEeNq65T`_{U|vSm!kR*E90V@=vlE*r}-rc_ZN7W6em1q zL-+O=Bu*9K9WK_|Yv)K6kqbXuoFbYc9#jt8!ThZev`(W))PE$lT5EqSpMED~ND+i* zodIacx9Tpe=Z?T7L*@VBNR6?TrEF5pvqtpmvkCi)aN>RHR_+3GhO+pqQ?UiE{G5L0 zg^vqL14|(%#gv&I3LfPfljlpz$~6c5Lk`84MG#}X#fdzos;}`5(p<`ipr2bSa?NDc zO9j&pNMxNYWGt>Pld_Hy7R+8etdc~j?}$vRz{j*0u1pJf+^djzDt>c3mu-C)<#y$m za*Rtc^^n03q)5v22oEJNWXsig0p3!gHij|;`@Ur(zZZL9ISh8TEu6%3?OhfRVYy{W zYQ|tl0*gIvs_(#aU3~K*k|L#UYR?>>WIq_kyGRER%sx(OUNK@EieELMv6L5J;Pzg! z=@nkpOdRbUzM;NTW~(qV8WHcV)0>-MfWNKrzXAVm$L3UJ^;{Gv{O_gZcsLpPXlgKn z^1l-7L}er#}_5_KhfP-XGOnB7}y}uh{$9 z>CEr8Jd9jI$ZrBa1Vc)ob!yLY=!E~&?e36plFPrA8Bsk*1? zUo(-g)0)!y%4ipq-imGPMxQHB&|9&eg0eX(Vfwk&Q^qURJW9fu9N(I0!z^ZAbP1Aa zmJr$|i)hr6hK}IkTMlz{*_6N2r?Jlc0$YGTZ|N28$F1Ie1!>y8IeiXJ2@TOr#k+(g zjqEb;4`3rm7?epWQ^&9Z%-^>lSahm0h?ZtJmF+iRxto#CjRU=Y24rzJN!H_dsPDNn zq&yLpb8nHpyQ_J~b;^UioNPTpZd2Xci5{3zy)lHPo+Yn`!a(r4JSB;l|htd|&dnU2rXN`t^2Gb-Oi*r4AP`<@)=wi?fy1hE0{##`Q%EU*3X16cBNruP|sdG+f!!!2CcN&q|~rF+b}W2}?A zpll#v++Wur=BIJIwG}xvj`ZPONo3yI-RKBq%%BAIYu;(O?$x{)c@H$qV9Yoc$&RQe z%_|ebq~y7RkV=?kp>pJahOi+gT6k`i?UhfNbkRh}E5!lhHL6EYX}fF@JH3lcx>8e} zsZGQoLu1a2zM4}^b%n`G0*kWjoXrrRdjzTjJ1D3}kZ zE;u~{Vt8<7-xW^JzlbxCw-@LzDGqB=XP2JV)4b(Pn431nDT~2ZZy-$8$^qifM0m_} zPZ{T2BeTwHAqZ78`D8@FOdj^)F12Ink57 zKhte7w}a`l9eHZ%cTnv$h}3ql79ucyvnPwZHvLT$H0NXP!pY-GyJjk}d%Kl|v|kX@ z-7(`Zk~vj5pWg6!#Cs{B-ZuW2c+YntkIj0TO#~!=%}47lNl5|K$rmW}>|~9MRnMQu zSW~MjzNJEzP`Ssch~7}!JLYku8i$)1{A-f=3tY9=Y0x3Er^Yh}(+`;7To znJ>}Hij(WGmeOE3J2*LlH7LA)A0w=NFW_92M7rf#x$nldzQ!$cJy$$Lq_HY~QIDTOIyFK0C}f>_Y=LoK zgOFGfAmeg4wP)4i>g=NFn&M_Ru&I)oSbQn2CGz{Wenk=LzNKROm$2fUlnan+1b1`$ z%GwD?-ubYkU7)D#S27*3Jq19EK)tr;97Vd!ha4h8OxC|}8?1X4v`bMLt+lDfcdfay z+;%_ef4qXgKfOViYG-D?B~Ja`h(&3^(2-@Ja&<8Jxe&W zTx$=+SczE22+3bnIMWd6EnEdk0q){N-NbF%_Jl|>wK%j)iNaSax!KKRvwf))hmamtYj157+ee|U>328}F=ct;ixPHDhu zD3m{1pioRJIeUFhZj&yine=3QDV=7a#CBvH!&!Mo)3a{ETe^EJliE&u_-=k9gIKXa zmMSRJCNDgNnqb{G`z06Da1^@PzcQ10QsvZ9aHaYBNe24pIQyQf#Z(hmH#1M7$30Ea zKzdt!T|^thoBS1ykE8$i*RzkyS%27}v!b-}PR065C`gpqlcO)r!s6zNfs!z|a9W=o zV`A`Cp`yJ>iR+(O0@|jr2U3vax)!%g#WxJv+y(q&(8iTH)lUiIKzB+9(G|QF_XkkC z)?Tg4tUqt1G4Bp_QgNIXE>mG-*_h9*#`jIWsa-sTjEfcJW{S$dVL}X*&xuDbw_F?! zq{_4swfZH0l8gJkbVq)C&r;)_(Cx;8gH*ALk}jK2*{hey1XA3sp0*kf-%5HVzuP>K zb*1P^?Vv&As`tH4OR27#ixH;>gUszZ-xBXp?pRxp11373Z-gRaHTtxd)tLD@_wRrq4n>4rxcpl}3Cu4iH)p2o#lqh_CgXtoi$l21$sCQEi zpK5*+X;T%+xcRx)siz`>^y(VVr}NUB%aG6S<%iZAXnKRrs;Xplh{4MrMvZH`C12_h zUEa299*IrH)>+NybAR;LvE$%TJ}PU(44UxTo&K6kR8suivGzVDwd>$}U8n3R-_}6~ z)VEuz83Y=?{5rh!&C-dEoy%H7E%R(*$fY0=4eJG*Tr7Rvy`R(EbDnXZM%NWAz&ENm z0`+eu<|0Yuu^hBAie>d4Uv=^;hC<_bUfmbB&i8F06ioEdUUbpyRFQJyST zZYC=!B5U(>?wpswg@N%-8;u_Ij@q7I>TsPxolD#-OZwMM&?X%hIqMX*y-}qSgVx`eImfrRzcG=7O*8`ZGHc z-H3%Jc`&4oW9$s<4lgv|Z>mHoO&r&*~Ev1j-{({Ys2csUJCT59y?}JviTRptG zNO#iDO~yAZ#~Nf>c@r3Ij~UrpDv)@~8JokuvPz^ya9Pdn)9gz~9kA~F&1IwZt<^(L zjS7uD-7u?zqo~q4v(hQ9nrRJ7B?hB4d6(meNZHuK%rxJYkaWo5OF_>paCK6>LX|34 zY-7t=XZz^VYhIWN&h#PH2GjTGidD@t`b~Ihjd}A$-hpNYGud!^EjxoP!d0$1kHvfQ zRGEokdy0uV32c!qM7=WB)}>w5F9-eOEOPm)MIIwg#>AR(kJ0BIq$NaH-xkKikH#>iS$391e?Rj*qhK>+UCdTO5@Op4=ca?@dy{* z*R(P$CfThyQ^-WfbAlcsngHp45Y}%HDaX5!dJMQDqxnc|`)J&vFJe&iL;!dR_+}d4 z--NCnjG1+(;b{IcU<0D_lZbZFrsytWo^9 zVq@Mhow!kW8ah(PpT+SGyiE;H%zsocr&Dg09a)3Z*o{aB2U67bXG!%A94Xtgp@Tc8 zL%;I&qm}ClHKwO_JOh--WN_~~!2Wp_#GMPcpibAQE!ZP`y_xPZ!F`xVbW+K`a z#wav*N-thGb0sK`kkFoX8{=Gje?pHf4k>n{bjYHlV3bGTF4I_#|4?^c1S8LNX23zm zXkJC&`j@3fpW};9`+I|LoMP5t4Rw8!OzKk`wxl=J-D^{?{CM2N=Cd)7gLf!Z+oGs7`?o27%1W zhQ2=uHcK@|u{A+zg&4RS0+=>MmDN46RctpBmBa;N4N7EUod~9dvI#$YgW|FbWiwPZ zZ?FZNQNO->{rN14U+GmkR-i1!feRLRwG81-yUZCyt0A502@eODMbZ@tonMhTayW(S za?4{nS`Xkk`E?8;JiHO_h$3L7SHQ^}!eBl6;&U+>nMG#V>D13l#LVD8l8hSJS)H0r zg_85Oc)(R*)`EX#NJm3&0pZ2+yrnT9{OuC$oX*Ll6}$k^I7d>}O@CXB75-3Wl&sO4 zH{Si>P$!^ny;LJf`|i0z=vZz*p+t%Z|Gy`43;&}_|gw_L7o>x9lhtoKgJ=Rp8tlgUHYjS*DA7>`iJjSo9Y z)bm=&`lH9L(G@h9u}sI|3i-XpBB{1UWgBd_)@xZ8uSe9If3ZmX66oWjnrKjwr+^Ej zh(0X+CPwI@<9e7~oo9A8Yl1t!1L~Z5w>PfyDzYamP7C40ev1@cmnW{0ByF3b!mPs% zVsee|4hhJv^uXyH?_4j_8+4cN&EaHAYrV{OjjSjZn=)bgcJYS%Olwv2BrGT+SMh1U zZQ?Y1rg6`|@NvaOrf7YF)x@}~`7+u$dyv&cW;^v#e6NIgPYb~5;|I0O!lUE3u^X~f zPzJL<175~uDg)tLM41hPkw*~rrMGrSBJff}Bv5_oq^JF;pk}D?4)?-pN;Dyt+)1jx z=VrzeGFC=H#(t4&=tGVcNcG!FO2K*|-50?J8OK67M?Px+fS3GW)@IQ@bBgj{+U8NH z-AUb@=)y7u3F1+d*n$Mx%3mon|BA(Z|Hw)z>U7hZ7$M9R8 z8R%-RTB~=Mou33>Y&=M7o{tYDPGgR2y?hL}-?{@;mfp*didW-8(ak?jBw0pyOchbg ztF6Q5@c-d`gj34%?{T5b%}>?ojNBwNO)H&ygd7sOvJl8usmbIKOI8y;G_>90W$@Cr zKV^e%x@?Bkl~pe01e^uVk+b96XK7NqB~GjT573?gAy2_PCP%!&a(z_t7(^KBc(J_n z*$pp`H%M)?Lk5?;fZcqX@LS3=4+XVyhpra|YKbi|7-LzntSDxlHXgM>)}x&!toL;| zwFFP$NoVsJn&of~A3ojh`e)0^s4Qe#5y|m1oMzOx|iz&g$!|B-}dJ}Y>n}dAG{2-s^ zqVWs}_Ct8emuBN2j`c?8#BzEkutpL+>8f)hZgFfa_h9&m96@5A)TPn5#;MZ!OYa<9 z`*vH3C$P;;!Yxh3011NoZ>e3>1#Voo1a0I(0pCFsO*A=hpVGjl6#y8VhF1{FTpvqwPh*K0Q%Jagi#z5#d?pq;XYNEo_aa`@sHgi! zNL6Zf9d6Ob0D#WW#5kyv@UvGZ6b?MS4GI`vahVpwtq(!%1awzzw@NFl3KTD}7hMs} zZY$l^4*)UXy`$e_GGV4{E}tt?_zH(;VmHx+%%)aPJzk|l0ZlD6S+WP)UVJHNeg~P@ z0TWjlaR^nY72JG@{(f@qUNbTvH@W@Dtdhs^cUavr#D7O&;M03p921yBx|9b);i_l{ zEf7Zv5Ae1yT*VrWT(LYV)>~pUo{*o()4#i~z2?=ekk#MpN$aD57Y*himI+|TxhvTUG9 zaXB&Mz16%}6!tIfDYk~&3m`#b2%KWEPlA^!M`a^{4bMNj|+MsSozV+WIZ1s~wUtmA6~%53wPR2_Wl9 zSbgLYCjA>O(hCg^qk0{JK97EMZV6PH9?*0RyPi?>F~XI)HsXzP$e5z|?GRopY#g(e3B&bRSpV$=!M@?_g~65^kLu}FjED$uMx+~|BS_P+(HyNdt%I=-4{&JhQA?^SwWd;aVUmO_=p5hq4<% zg;zBK3U?m6d$0!3?98nxPEw4bqdg0kiNOVoQgh#6?mF0GG&}a=z*A;oBa*gsp>%qLG1D$9dX=}V0 z`NpI;&pGME=LOWws2*b5C@PuP6PSOeGIvqSc_T0!eHLIg2!?S+J_Cf7H=EIWo-%(w zp*0Qczhi$toMHRb%lRoHGnJ3R_zWEn7H7GJX_L9Jf~2=`fi45DK=hyy48u=dZCGsX zWa4DrUNZ{a24pQV5E%=^PNEo}MwY{Iu6gS%-p4k6QmG+X-%l+mbANJKlRXxHKcws`1grF5l;?QR2X zE~pE;!3g0`tClv)I{kUJE9w569^HJ|94(y?b1aRGUOJCQ-J6iL7zXZQ${ErG3@^!_-@bwbgXt!hujiaVt z7U18B0PK&5NNy(`npNoM3cA>QNcoaK47xYGn#B@i^k*$<&=qjGO9$nZQ=!^k&;B?2=K}CofIHr+MCbyu}9_x8Ig|bs2u_4q69$b0KS2_0X|D7Ha1{$3*#1t z4i{j3sXM;t6q3le|I%yO%=~;Xw zfIxFo%cN>b{zM1muQ1@bqRAW#_Xc^=q1X{zm#0=rFv$d4?IDEqKiLx+xTNvAU#!>B7fwqv>!(UwoOnO&G_8bRW9hE1_T&-A`a1egfn(WI}^(B@9PPQk96egtbyXi`-eQq8) zpPmTmdS(ldioE~17c_ZuTKMlnM+`)N%<4ZrX@nOX5#cUuSV{rq8LTcH`feUq=@E+0 zDLN`+wnjJoS;o)ar1XWYfC5&#u84u@IZE^p4{;xlHgsG=Km#;3Al18u6)7BY@~PHX z)v^P*wRIQX5eBD2pfiO$g|ICnZe+UQC>u21ftJU;sCX6rFyXF7^M`p>ZMD6h+lbwh z>8>Qj+QE*F7?*^$d;N$48a}|g@$M7tJWs6Ahi}q_N`V}0jtbbX7rDm~IjNZ?e*xYB zD2+Ep_m#Jm?hyYMLc+q%caBFa?e>-^A zsgyW%RmJd!h~QeAs^?|)$fGaotI zna+vmB24i01vx|9p3aE^bJru8qQxNKN@TSO=7D-+ys*TlS>@(}Wz&?w+0nS|DY+k( zB~TnneDp~6c=Q%z-wr7i#ydB7+v{Jcc|hpJN^|Y~Q@OI-u8ar=tJY>Vw`Omygw(kv z9W{}@iH+w@xYMxOp)XAztKND#!cB|?a1zpPV^tW5*km8kxDREcue{_DE;g_wW3zy4 zS!{rwP#?a90KZ^iU1;O=l;Rz!B^34wCgWYc^3PUw4SUIx?`eR^vrLx@8 zLF~t$q|gKQ8sTYBVJ3FZ99pANscSPzsi-II#;z`!h_i|m^RL4T|`L_8@H3{g#&t=b}*$-oV1S8Xzh=})h z0n34kI}Y*+dy^-s2xKaiN~pAkVandSiK)zjm>3XLO|p*R_$or6-|UKb{R{`0-P3{+ zH6Br=tB#V-VueOGFM zJ!B#;!#z{l+5LN0YS{^Fv2l@1xOGg{Lv~pflG4pLI6zIA&dHsaPjbYEw`|!^SZ#q| z2u5Z^&XiD;>z?6~NpT+U=Ny8My9NNY|Hja)lNuClwkb9Hy;+dOafLv!cmbt%%s`cu zHae1cH*Rf5;l-xn&UckuqN|jm-X1s*H71EMnZaZcSBNEldw@zjXIU zs`$QM)fr2ubD~CKD|ll$O)-il>~qHQ`dO(rPUe>WjOPua=GOI-|L-f-oUn8SuBX6+ z?v2#5q}@ivL>ysm8YqQpfbu?DuJ+%l`ur~hQ| zEKIR+cqMn^|8hq!q^GqbQ5}1DvDW|?Di}b$<~&@tgIAP+K_p_n&e2y$ED`JC>gcX2 z^u}<&RnE*p%SCT#BnOzQpja^halYGF*C6rrA1ommk;FBGyP9)h&5k=! z3)$qJ*^i4{XqgDy7d*t1=(>ZfxSlE7Nqa(cUs6IpxUqAm@BG4{PVP#V1P_vk|Ti9uHoT$(jcp1s_MY+VN`puWh5A0V+u_c+a=xkjZ zRJ$8RtsN=Ml<>74-NPZ{v!?3M5}ok!_wxSo6`+J;&})DE;*&hTUwfYEku~S?Lz*u> z@Kyi7i8d^$f`PDtZD3#Qc)3?{>gj&66#(00bW#RKTRmlc1jx@pSo)|Th*z^(o2g@s ze61&<>VYHurBeRvKXzY-%cENYZ33@Igz>XKRP>fBt8%knm9)xw#)y2{T1k0%CEEfy zAI*=A8(J@|ZqpqgSTA+w7669P@2fgA zbK6~JQuika%jrg5de_j*{OBR&@55;wx}Mn#QA$HeG_sXAf4M0GkfUTm=< z5>BadnzsG?1;Wu<^Y8oSu<&KCS-R$}XgAJzf2Mxeyb}J#|3urRR@N^RIyN#N398YY zF1hkCHICqM)G`!n)Le{1%am^3P@7|d^Fsu@`E4faU#gA!oofIkPfvr=jJ*(CP1~p*-vHi0Sm}Tze%nqeGLql*7Kt)3*WTzyXs=fqk@=X7zUoofQ!}Fj`m4;IvU{QBPH1@rP4}; z3LJAolRD|?BxY3)R|_ZcQqPxCuf8V*rZLNG^=LqsmC%;bb(q~|#e#=v%4mMFW~7Mu zg%#29ev7K0v6{6ak$=ks_O;cJ5z$CI{;XHy{+%JD4$@~hs_>54yVP;CSlj@*OeTVI zQql1?-C?x0?!qT@j%iuR*0{XpMs7dk@rFGN=_y@P2UL5O0v7xl3ZXbf);+l_)-K}~ z+hI8BNYE&oa6pQI_sX9xpAB zXacb{eUAJ1v%+KLlOh-!p`(^;k(*LGTy7~ebaZ_u0Cq(>Jtejmm63W)#Y7_PWmr&~ zu?!-<%@$X1!oGH9V1seSjn~+U6#8seF@oSzwgWMpgJS@726lAoIpWdWIK8v*yQI&lB|Wj#AJ!fKY4zSM8FaH&hIndeN4g1Ox1QAFo>`P-a2t?*=qIo zqu7pE1gU6Z8stLc0s$NQ9ErPT$a(aJ=Z*q%X zjHERq8moMIC&^mHe;s>M+1lLOqxvcg13^Wo->XuY4WbW5md_&~j8j-I>CALN>f1 zLe%4{6B5kP8jx;4rK@2ljI{4(W(?z%6s9|TS zVyRUPEA#?Uabit9`h@jOLBL9~2U1XeaGupA6IX6#hQx}*WM>2wV}D=8+Ap582LR6j_T z>cd~j*A;Qp%2RT+t4uE5F+JE-^xF+{C=6VXe2}&w>xJ&Nd$8Ym^H~dhqD*8|Bjtex z)?xJ5e1~oFw4e{QhZW)5QCyTy_(j0rdr^f7^K#xT@&T;{N&>f81=FWWTJZ9-D;hmz z4V%OqNpXiy7m0pGLfd+vwEcYRD|al-jnbLC$4>kn6zGQIUjV3bpy4~M(V45YnoFyO z_0KmML@3|j`*R!%c40ee{+jcig=BE-5+U4$h0z4btUk@cua!0>hF@{;PoHNWX-b&v z5+~q4e`y&qO31a3Tb$vff-U1Pk=J zFSDtPo-97xsHztx*2^!_S--3^){^skz7d7eAa~XYCSq+25vIpdNJ>v_r%~7>eK|p~ zHP_D0N=xwGuQYDTmzi^7NuhVLXOrE2Y+&wEm$&ZrLI*-Qb*E{e+Ao5M2$*Md9p~r} zm?e$N;G9OWPegZxOTX!=;Ui=G{oXkQix}BHOM88NeQ1YO87U8!T!4Hue*M566>Mod z)Vz+-)EH)hA74gJPOj|?!w+VQ$5x)An=(FVm@Rs-MDNP{Hs_odQKsN|QYG{l&@zAs z^akxh41lf#jExPPz52uNY(hFmcI_eYevDzk26UZ=S!nc2M2?N#Awfppt7O*r8Lw9Y z*#u%N)fJSdaU5xU$*`p{d(rq~Q9t?GV~25O$V-6lE)8(CJwu9whHu|P?PbOBx0>Q^ z)R&lq)64>~5a#S0^2_)pY-J%hyVr=Uj@@>uRPWm{xgOxI`(UFQ_L1O2x;Ke0S#g`W z)kUFS-z;~KS!d+WW=BW{j^)uohGvyBDISlb(xnpQ>;$)HpX2W0?VT;VU^TYL4WmWB zLv}dDY+AsvR*O)>zFixSY*Mj$-n|9$!eQjLM@1C|bwTRDr)f~2lZbJsrU}wxIy&~# z!I;BSzP<-RAvbt*&LsEBngFpSCgP-ezpUuPM~)!rKT;SYT~)4=69Bs(^6Miz%^_OdIuI4wBt z#Cy*jybryVsREzMe`N~hQPgN`J4m|!0A)TGy)Ko9s-hzD=M$OL+?dL73f4cSZh%93 zEu_X?jJXdCXm$-H$_J@t&I(`eiS4|n38V~+xcug{0`BDK?-zDq-#-Uh7xT6PNf3(i z{kBnU4^04z=h}xc?wH_)p>6ZawYp_%M=@gE1R-2FQ6r9bQEsA_HBBU^>lL^kLU=zz zgJ4)vO`0NZ7QF(NLd|-$XZ56R*u9zN5)%TuiVW4H;GKzls0nojQ7kDpW*@#F2ACSw zFe}(yPfp>kQ1i)!g8X+LmFj*X=xGr+g`A5eXp4WONLoQ2ZC-+e;(sYa$*jW^uJ-r? z2PDmP*zyD1J9t%g?WpBl$%6$Rj>WZR|1NTfQP7vw{1jd#x=L}w2u#8=T)mc3i!i;` zO6xo+SK{`-1NAH0Y!f%O;is8UHrZ#7jXlOzr#Lbo^N&8%k$V-sv`kD9 zwpb55S1Qn%5vV%z3URxD>jPhhzG+Hh@s_lul8^lK*0lv2qeU$UAd~zT5cKPix;VuJ z)3Y+!74@6glrI;Qw@2%8=Lw&9HrhvQ(ShvCTQG>r!citPFPP^{#ZU76d7AktI*M65 z6G`-*y2kA;K@Lr9DV16TR@}Sd>(?hLgdF^hR64CR!UtHL_~4NTW!J`+pI?x!`+rk` z|I!xjg%2a*g>a=@bWX%72NX2iY}9f_W)Cs$ZO z>AsmmCmpF*pAji=*(i5O6l>uSE3ZN+q7ey&k)FC4`h#Jrh$WtZM^>VA)XZHD#blf# z-s3kWokvV5{L~p#R>oFpf4CQAavw277w-bsH|m|TPBSVO6OaYSh868fqf4V{{$zQ# zm^`q|Ps#2Z?M?Me6Yfo!@ta6awb$q#Z+@o;#KBFa(5>Ee z{1W353SAb#w{Hr8-DUOpGew!x zBlg0G33plv;+9^eEeu=FV#gk`=Ci=`Q!EA4NJLSAq4ap0y(G-Gwx2}m>l>h&RS6`v z^xMVv3PY3_xxrmV?3mo_>aS&5L)_?p%-n0_;;17UVabr|GCs|crqByzk=rwt!^{TP zOq4CXTx8yBFZ|I|_|k%rPA*D%|4FPCKAmFXOtAw z-Rf;1YG0SKr;VJ?+W}u~A~x`V{W1v*I#cX7OT6wBP=7A<{Ee+8#1eOPxwv;ZuBiC^ zcs#&XvPP4%om_&N^te`cM%d;BslC$)Qcd=k#dfeubhUt9otE!hO$hnkj^WD_F}RJc z^oUiMJum=;{KS>p4ERC(sT2rtpRzGpwyv*>5#qR^Kl6V-=RaRr_H3RM5Q_R(SQ-_t ziw&hkP6+3Y>0!9bIm~$a5le@?*aystat(hfDy(sGJz1%b>By=p7G6m?=t8M?q zT!42X#m$TUfh)OJbxcuB?IkwNxwRQT8gtY{JH0&Q&MDPm#y^@=#SgQ%lIA&WjnA~3 z6NAFLlnJYntR^jnOb|JN^@EE#yi~R93f&U}lWq{~L4WeEB5n0yb^<|l4D!z8tLG(uCYUY%kw?T|LFI_%JWdm^?^BZfAGb$qC=ncMVK+Q2AWF0b=hp>hZ- zXZf<_#Embp0+EQXlCe#e^TA@ODwQv8-ny|l=9YGeB%%XSd}@MV#(9{%Cn^P|0{97c6@iZ^DioSm@*WHFcKozNSVRTLY`O*|i~ z=hCmEuqelHJ723<3N6alua3Jn1CQ+9$#mRIJw#dB3CbW&)DN*X29Vvi z7`Uk)5ltl~+s;z8hZp#FrcyXkqov3?ARk7mff^)u`Rr;83GT_z$0xVyZVFyspX;d6 zz?7?|&4@q{oc`|%1>reXoAj=-w3(8D?<_1f8|`eB1q#yHnsU#~-=zqcyb>(_hYTMJ z^U0+a%f<*>#B9sPyg1C0dp{hwNNrYH_4G~e=*_Z;rAK3_L-p6@ zt?UIQX1+?cC3?I{ow=A*4hDgZKdyi#nAka*+lQ%LIZ?VPIwEu(&U*3+`?&#vzJ6F- zq;;DSbF_fvrtbTOWVl#KiesX>9Hn`;VUbX|>-Q$b91Z)f85f#g=U@!v7wo>yCB;XZ zlQa}D1ZC|70WBehmM*3vXPNb4{aHuNvQ_i$Hu={s9<`I#V=*cV6M;2=SxB4{=OOz76*Ql?XQ}_}{ zJ-}B+6?WyT_C~U$OWJ6zcqSd1EGd|7vbHYnE1Fe-+B=hlPV0HcuvjicEP^rHh2_*k z5kGj=Z5fxRE`JVL7l3Hpck&ky@Kj;qF3B!$S7zZZ>*)8|NSB>&!t~fyJOtlzO5~=5 zskHj+&%viI_0phTzMD+Zzsh^swBVYS#p#JMk+szY7Gy*|B}%zE#CAceN| z7r>+c_~WKt#TBhF_iGHE-=RR22Cp5a^a;MmnZq0R(WM@4uaqeHpH5g0xb8^p zIe3QCeU4|(pS)Z6RtlrCqp0~C)$));#D9bD(dXC~x(cQ%X+9UqBeD*ISBh&LVVanh zTUH>b_I~iHVFe45j!tf!v$Elm7V1h_T77Yx5!K1BLN#D?F+qJbOJlDYVtd}&0A!3P zM&`JSkmBW0dUN1X4*Tq8Rc+DCQF}+|^iJD%k?fiCh1iY?{_N6=Q4ZmhNbM>gW}Ee2 zE#-9w&_6u;#1Fb5lY2;vWQ`IRQqKorr}HG_2J8LS4*aI;?{m5y&H`Epu z4p^`X8#(fDzLQ>VerQ~8&oZQ_kBWmA2=`JXSPJushJab!-VwbG#-8c>={T}v;3U0K zE&g>SKLP|}^qV2u;%F#hjW!cz{;{pKaCB@dD!4!OP(uHrZmYI|iTBIKer7c{&*mA4 zycY0Pc)t1xtA(Wp#V5_9WR=9Afz7j_1DBGDs|O~u(Cd!M)RsQpjB)b*{?Ev;PK$JrjLh}4MdOv7gUNRy z?jgGGc*WTltm8_&H5JBc;O+ACgSjY(SVrDgRmVzh9}W<*YH>ke!W@#E#6hJuZfy_5Dzo16i!#&Va~ z39q}5J~hqP`ng%^-211Pk-~|>d2k**?Km?!(r=U`U8QM;-m}7==WyARtT$;tkJ@q_ zl2M755gsZRDr=B@;xC%Ymm+TSmj70`q4_xND{D_`O~|2PQC_kH?)oKePV=BR-^pyX zzBlPv^qLKR|D`E*)Ai~d6?z9))gemwmETSx+bG0pu6aFH(DTKRfXeQl0>tY<5u!_? zLzF#fMI%y<=vOrAtq9%BP%5rj-ae5~s!N4)#wP2QPD-N95M;VvUm>Lfm+}l`DiFxVdkaQ2)se*yJoB*6E8qSi(^!ADs_s_3 z`&2mE*vE^dsU9oZ9bLjLHqvZitxnB}^GcD1OuN>(enku70^7wKOcx|@oX(CKQ0WO| z5;PA;?T>V6O=Z>Ki0l8Hd8QsW;LBfpLdrWW^otU`o*YeBA=E_oRA~F_u16ER+yF!U z$HDR@EDYx8NlF6A$Zv0a?I-oxWt_8;^hD@Jw=&dP+|4c$MmRPXFbWZvcAPFPOvnG; zI?ude4co6tfvS@f(-<^e)*jVqFsKCzhap0Z~p} zMtYBZG=HSx@{U(}`W$jUd?!t`oG4(NwhZhfqWY2vzP3A;x8sf5S>8;`E));xK$>Me z#l}d3Bz9$#c_#VN-o=)8FgCTg%40nzDKxQqbSqI~LGJS0qaz=eebt<}_t9Y9Uo&Rz zKJ5BZAI~h|x<|(*EeRpyo=#-PXu|KPpCIN8Etj!=7oQSsl7re-JJSz2&OQkWV#1*c(3= zm;K->Z&nC65db|*KZ_1R%vbeJ;`R|{dil@3!I1(@irbqm;<2jDxt47KkQuC;{|Aeh zCHVoC5144df|`7GAe^0LvgtdCn@5=4D8i7%#bYN$jDcTip9%?k#26Hg0H; zikLgh6>ROrN-t#tY=q1*CzC=Qsn^l8{qg;Ga9)L*nk_o?2|*93B8t<;+;hL$lU6GA zB-7#=+pTpuBf$C>K)ZY?)m<6LUvO72%D<&AXdhy;4=zudt7QaMmGR=lm7loRytnjOVk!px_%lUbD z9N}w}I*09M1VPZ0IQSNx)jnGlPQiHew1BP&CX6o=20W)U*)}v!^Zv7ZVJn2~ShwUi zBB`lE&>UYB^yM4=Gu%&Wgt4xeWZ$_cmb-O*zOhrQZCUzvLX5rjqfRD4{xnuMF^T)iM6WlC zeCe>y*`KKR((W9AJnE}|pe`+Yw~x0cJ0MN*D+yAsfcP$?z66g#$5#!3V^9KlfE|vu8FLqhdVzsQthd#Gj!HZofG6?Ago{-&LSmOl}`*3*Iox+DG;YZP z8}taJ)$+YafCzSULy>fbOgBB1tJWCEy{GD7+2|a=;)oq zgw&@6!Rb5MtjR!cgr;)D6ATrj)9WFuKxr}0s z!_t^w79R zUa1@(^=`BICt3$hskJbk$0+YVGmu%7b8Z3wTjtfhxU_fqp|VL7-~{;_|Kfy$&%*fr z_jc!ukJKBF(`t^hwy(}zcZK-fz8or5nKUijed(X>L5CK8?hlnB!7PLShy%C^2Y(`{ z(?|FjnY)wf{BI1^#}F2`E`=VA?Vscvsa}*QR0rejYy;#*nRoJNh_VHKhhyXe2D0w& zBY6?WLtAm-tQxE3QzL$oW@eagX)cy!mC6zhv|cydB-*6r5}F=hXiI(3nWzeCW?9|d z5+pC3nA#6}AA{vj{6hJ$P*ubTJs?(Vs{q3y?q2cX*XSXzm!4pZHO(UAn>WEUrvDKu zO2DM>6?TeA&Ydoz4u~q^_7`y$S{NQEPr-j`#z zEbGa5kXgR1_1}88S3fNUWJ&0rkEy)W1@a!0;lj~AMO^TvL1aUFMXs)4M0;x3CsX6s zl_P2or5cpUcIYmtvDoz;LTEQ1E;on;PW}_dU_j6=JpSmOgQZwzbDtA6js z#Csw@0AkGNb3NuIo+UDc6l)Y~t0`3fx(eJ7+7xju`qv1_p_x;H`dDK=#Z$dA9{rU+ zCgEI22Rc6~oLan4$Dauhx29KBqb7*q)q`uwLB6>xn3Lg9@rVbkFnzyDwr-%S=UNj> zzGjuIK4t{Grzf#*4S_>8mHAtlJVK ztCYLjhr-q&0cYvA33rFkr;io^FW0=hil(22Q9kpHBNVT+A1gGa6WYn?uYm8DS2ngU ziRf}*$@@jwVu_f9j2cvo(EWl(tut<#h~m zT&#Y+<4(`l?HHO{VO-aOgov8zr{0&jDlgG882iafCu37g0@OMWFYO-&AD#N+{s@B3 z##i-SgR&TQpSzvH4kt5GHZSVDh)_LlC<3$%Vo4T4f;$oUv4~l&+)6#vIAvgK?2XHF zR8vX>&Fh!1d9e*(8vX?&BF11o{obXvp+uPxLYcZo~H(Y=3CJ1{BzwUHoZ5y}|zFY>6GF zri$zjck7(Q$kX?ldHL^(cG{cuifGY?=+Z{0XL;mMHm{FCd9yf$6gs+6(XmJ7ZLm3^1Meb01SBhCQRH2+=PYOkf|d=-Me3 z5x~=ohFe4ObtH0*x-;(Ia80!ZjBEsiK9`2Vqr2GuLlx>(E9r}~1$rq`sntAwqZq`| zASkf$3IUn1dqF(%{}d?htru$)65NF?nOOd`jbMV8PZ-EP#Rw(yTb?8#7ZM)PgT`2nV|HG%m-3kdA(`()7P3SGG@E`QjL}VMj5iDPLug$4AEMh3{XK?=o3?BUjYzUmPK@PFp zX6Z)D{+q$aX>yN)6dVbHQ@QgVs{0C5kz(QN-FAUHnx~cjkn*vBZ!eCvlj@#+HE0^s zwX53@vFY;xL1QO!e*brVMsW}lc~F3=-$80R(~|wAEG4b5`k|+#hg&QlZ^cTl8UHh++(+mB&NS?C!TUnL?Y{u> z^F-l~wLia{wzbWOMNUn9fACKFN5NCi@3+iRK^BPCWBH;Y@Xl5$VI66cv1M&l-^Xc#f!cL#=-=$t!j@AWg}H_$?5lf+3RREp zOUwU%e36)gHT(}q`%JFmq&IxLpg<$Y$daT~xe>+NrL1TFG)L~&C%Or}U<`fny?@$t z50`~xMY<8JiDhgL$Tp-PHny<6NU?5N>D?nJ^Zs##^y-hT5K%ssjIG`&w@30a4+Rb{ zQq=LqKaCk>@jjJizmF?R@Cp!)hOAQ7+bU)yXmS1gApQ2cclx^}rQo>@tGHaTpSBf* zbSCY5}qdQ1Fz0zGWj6d#{A@HBm zQN@xB5d?R}^SmafN5DcM8}I)c;*Nm~f(V?xz1xbxLjWh}nGE3*dIIYc?E2MW&g|QX zx56MekCdQ0i`BRRO!E#Y#E9HSxv?BtpTvLEB#uBF@ai2-0j%S~AeL{s0^^@dzjux2 zmD>4wzIluMyGSN5vFKpMLE8X&H$gvm26=|AUhf))9LgX@xSl__5I~EVM0=WSwoiP- zu4E7eOc!+gq4elFstw%JFm*(+P&Q8&8DZwJ5KDLxJ&AK=rEQw<;L<4T;%b) z{v~-6hOLF+3W8b9D36ViTiI5dD<5+^pDjmQ9zFYpBv7nZV_uC%`1odr)@sr**ffT# zb+2COypj^MQ&sq!d|%P9^hjyKUctKP7RHzwfUSmna1CcM1IWq~0wxKMh7y;SjLXklwrdrPMAj#vEA<3te z{r)sOALvwIGpQ$d-$kG`0p#8~xi2cN#EP~C)R#F+%IyNO1MRut;4fKsdVISDMdTwm z#>n!c^%Av|mNY6wD`sQ~qd-Nhf*vRM_s!^+nS|KpWL;pM2VA7vVV?;U(U%fq+arDD zLllD;_xMmhtNoiryw+}IP$tU2A`=H)Fa6$HI{>Q{S{D1v5S=O`e+vMeB?AQ8JqmI z{9Z=*TC1#ohRraC3zu9h7>6hNbzINUuz3T`E15C7)q}6{&XHhmV#<^Bq^o2rUz}dLYt^*MORZ+HluI#_wYb^ zLwGg>`>NB>uMr69%j2%1{7plU)o>No5-SyDjP#%^P9i&5#`rpRcASvn{|hCH_@gKh6=YRQovP2)XDP%*=Y$6 za4CB9iCF5rXs=isUJH-t+d{WqJ%)5;)MH${LT)l_3uo+;mnTUWNm)O5X94<;4yJ>z zBTz-RgK!Ngrtt&c;dxH&dV^3fv7}|eGMlkJ2^{dit2_E*v8lZkyFDZq$|M5*oQEUm z{3Mbk$XWFV#U59$EMT#GPKwqV>6)fh$@qObUl!(%Bt2ZPWbv)TYA~(&1naHjy;|(T zwKczmFMB_wtl%LSGA_c%9C>Vj58@i5iB-AzXv8-$mA>x zo$mZAEmaG(6WFmn7P7lhGOusT)EwDXB-;6X2Rhz;y;pd)t{R(M;rB-WM}rxS_Rl!% z$EX#f{S6U+T6T1Xu{${1!e;kQ<`y}R^szQmerk_R)3jOb>mQmtgTW+|c<{(Zq;cmdqQkui zj)9;rSE%M5Z$06G#2h&|FhN48Vd5j};aWQn45Z*C!{0ST2zWtDB!p(o$)@?5!7Pj*~qSKj*RvI>tM;na+*kZ5**9K z6?_JuSsX<&0i1|Ve6gpE-G*ZVsnI6Lva~V4tJK>$fATEfMPnfcMqXKsvTWZml11ln zqle=A9en&?%+^j!472A9G~UJ`MBjM`N6B^m{^bI$k`*b6F-SHA7G)QYrr)31TXV8I z!$q<2$@fRe5R(p~#mMsn+D!#QvG?o0KBz?_W9@7b&{>2dD~lhl^a%?DZ3i8ZeT^jG zJrTu4IfVaM_4uOA2R;cp6a_Y6cu-HiMeTmW>EM9PzIhEl>-=@dUM6}15LJ16Y3>w}vkmgr9X zjLlEgO@-#JxL2348LmI>l3UHz&);0>P&eDLBXQ-yD_-e;w>vmGI5?(nE|@bBJCD>2 zM782Yy-3;0uY)xU&EvIm^!OJMg*M1%jGUavDM+TNjLnInSh_WflO{T#71roA{A#Cn!s=zx{#V@e~ab3ycswuQ8SjwESwf8l`U;c_uT;OA{BBgo_3aVV4r# zhF0!P;^A(L$;LzQr4hx$v~f_n8fy1Nibwr+-Aycv!g^|5o0uJlvsDgoeBD26h2Fysl8~03bmD+_#}J&2W7H9&eB%Y zkJAu>pVDZguL)?PP`LRsK7I&fbD?#r@z~12>V%G-fHQ%Vwgvkj z=K3?4euYhs_@Ih2J}})xAn%gEguSs4+5~c7N0#onLf%WKuh>@rlsyYCxu9tTidG2n z>&11otg>GE-?ZOI)hGk?E;1ilSg|9K9rD0@K}X_}u<0vrT(9&&+&1XrB&q#XVKO(6 zGSO780^EDS1Rz-{sKK8l%R{-IR2Exl^;Q8dnF%w7`1PKPmSNI3`^2@=%c4sDXh`ddwxQ_ddds0A&Ri=|4hY&A?l)jMCvaOR-@oF44=8MZvmyVUdk3!K2 zjy@5MaXisx_k=6Hd@{$t`xFve0Q+U}Gb)EokdNM|H+@j(`{*OJ9qD_kV}5R@B&js# z-vK47`6m!w=^NqM0&FtExw$pj(r9ualz2b<4#wf35UbGWm{LyASOO^3D|V|g{|#PQ zKICgdxE-q)Tv-(V4I@$gUC~Ggop@G)D_%RbQh$>~=+~6$w(}&U4OCtlt>1fMq>&ji zz40jHQ7=%CYzUPArqRPbm4)^1-IZw*y8V0cz~%rPG$mII$xS??U0r(`XY+MH;QNne zq0=3%;<(0Ac{y|fce$U5GMHW<(-yp>jpS4T+#ZPWX92yY7m7qls=o>|xknOj349f{ z4arudg-5UUA+PiL5C90)vY^V6o5rq^)jqdbq=5GF%?Mahs(7+QqbyI;T1g;43Mfbr z9myFV=#VY;hm~eJCr5=As?xz71pl6TKcQqQL&<<_XN1>`YK(f$E{oC?k=S-386Jlp z^gROCR0<0p+^ZWHV&cbhmGxB*(vgEp8dGB%EQ8WI6_iCbjZ2IF2ALM`g@`S!!>`cE z4rNZW8aFw&qm-s74xN&xU?zSA>J>@1l z&Q3B(oAn`Gvu?(WzPbD|4GHY=P2(D4)wZ(hM(9e;J(hjLstwsn_3iY-a$%pvzJa(S z8ORJ%Pf)|Uo_u`{B+lWXj$vov)t6t0Y8EDzm- zO4H(4)AcYQ&j&|<9R#oB0%P~(CBqGjxnB?>dqlhebVf9NtalG{lV6%YS&#UjFnF3o z0cvJUpd1~7?b&-$N300#@!nFK+Na;jpREV}K)wZrMOaoR0-PT3k^KbGY3e*Aw!E`~ z@O|+{XynFYx3v=Rasv7L)qV9P2o^!1g{y&!C|F&97kLgdDAL5&V0}8D1Y%CtH3ou; zm#acAAU$b7IAEHC)FW#jY_;DKtuRO$i^kfkX2&0zbjVqSJYGN!Dgz#9*ksMeMh265 zD5hqeP2n;V(25DVD!JZ+S5Od7RH~U!;dT`iodiX|1pEM>H2v{|dr&i>Zah6teY&73 zF!rkdOJ|0MG~Ag1Xa$N5!V?sj4q+GMdpp>xFo7aXKg+1)(CBP#=q$bZk`tF*zTqMs z09zpz7=fY;yVpfi@PZ`?h}{~!@uLT)y}=X$@eHc z*;|+qMTt6PVk~TK75WeZ#Y@YG8xOJP(u?DK|{LDp0g?BnuVx028G0 z`%Mm_={&1}CaoC=DNsCyL4MOhgSa@}#uB}{T5l_!>^;DSKOn-eJcBemcQ+ZBGB#H)x*aC`~R5|75IS4`L3 zSY1le*FMh;3MLfqeGQ7;-sd=VmsMc(K#dfAKjsp>x~aS6>~XJ(hw28G1q6Yhop6|V zz;(_G+JOaV|I?mfZDXRT3-9k{fCotssVvf*AhI1c_%|=|t;)s=AjNZ@SJqeB{GHK8 zk32G)ct12UJD*_|^ZRZT5gQb+5^fVD|6(Ch$0X zZmD~1mgu&e#kF1^oujRNH}=fJF0c=__lSKXn>BpFWp3lTu1dZloQD>ujeT_|dM5jS zDEiL0rq2KElR-#in1Re-4IF z0P;}&)~dV<`&{HcuYYXs?H_>u{x~+py#Im|>JRDMjjO5l4vOZ#T#xkAAL&SOvUSLR zIhd@gw%b_C2h2o~Ct&{9KAv0_B5S9fKF8<{&i;nKy&iwy@v$V={K%8zZVw(-?oE-~ z`Kc>xB3VDu96lg)&Y(Wkl}$B@lo=_tW!_HIh2l3bwhm;OI5i+@o$Uj zIc*D;rRp;0A@^0k>iF+)!0cP7n8<})g&%^^=y~7X(a z=I5%m`@b7k*N0b3Wg^w=M%DnWPGvq&P;*rA`9jGqNU)F~_0h&P@lj z4G?3#Jm>F@>ywZe?{!o*;_(GB!RV@UN74rZN%1Tf>KBcBf@TasUomVlaKW9J$e8(E zphIHJIU*ilJ-hyUF^XyPV7|B+zQ?#>k*=XQ1g03^{_TNdFgjX;TJL3IL}mNxC5d(4 zI8WD`yog$*b|jb^z@D7RuD}GxB99t%zB|B-ylHPKZe5Z_o#mb+jNkkXgotNrmWw6L zeQa`sra{4l9Rmms#@c0VUgE3BM;jlp>DfL&&s@%G4y({64;Oi~4&=6{=bjfWafKvQ zTS(mDN<);cXo(Z@do@Y}$F?2-Evpr^={h>+eB+&B4=?TRV0fHageLyvL5p>(`SF{^ zf+eMnuJv75=Dg-=36`;$9EwfPM?6|*trAsuhC%O!UI@1$>-NCRRfXreJX7}@WZ!Y? z2$Mmf31=CAUy7cYl6V^#y@WLHF>?Fiv*-NeY~ozad@9y?;gYStzFRjTO0RmllM+x? z7UM+gpRduS9KFpdA4MyRwAp|uxaH8vn{Qm(Fcc3qxP9Y_5jg+|0H!%WPoiz_rOyMwQ zp=SNSOmEiiVhv9W+GdservLCneO&(kkc7|L(_JLi|IPwmd-w`lj*HrGe=a)UXVY~To z#R*-J(US89t$)&7BgZw!g2BE%|q9 z@+X6)zZ$&6o$Q|v@BQq(YDJdIoT4on${#zw=T`-DMCHcJ{Dq|Z_<82t4BboR+NW22 zpZ=`sY;<`b1ID-#Khe-xR5<~)rWdvVE6!nAzZBs1BkNwsTgzME;*XdgHoJcOzoRF2 zJoAESl7giE7QqkF##zycYwkd2$$)#bEbI0Amk%EX|N3I>*kt1atFku^uY|!lzN4qH zt;B$xvG?u4mg+T%=X8|*X|gHG?G7O5a+{Aw>^&O)3@*#INvkdD$0UBt*DX&kKrABk z3y@|pDWnAyAIp5_I$mWTi^L0vT1C!t?(xS1FYT$M$(==OOdfpl6Q8&?LFjmquw^3H6^sv32Qw4)@Wc9uwz48o+Jjuqhn)W~{~M zPwu~~wEx!PFk91CUbo#L2)T(n%Khg*7x+>DHp&``g`HQo>ud6m>wdYVO6h;t&mXnH zQpy6bzsQIos)Mo^FUXV1NQ|lK&>TMiESLTAj8a~cGdt5?p_p2;6UH&>q3Qtc5DDSj zpY^mp^JK0rJNt7(!NCDPVr;8{lG441PFJE9PBX<|iuGm88><zEhzz) zSer;yI5MLLu^j|xuhxYA6Hy?^skc(%S4PlF1$*NaV|I@?hB2QYK*|8Xr}Vq|wH&wQw2F5qa0Pr4u$HAn9qO?a;$!h?~umn!bO2 zUf`-XGYQ|9@;_`UAHVxLkq<(G^nKtGNKxsM2Ruh=k8Cntgq?uLI$d3+gFK@vK!EO} zbfxA8-*rWgERX{U;YuUWuuu2r;n{HitPmI&qq!E(+gpK#!dS!#scYP>9QcVB_D+$V zS>J@{aOG&$-&)6yA)e!UdGOdrjUI1P%HC5R^0#GP&HbCy2vx}+fH8x(-XJUQvvqQZ zV*}M9s&z()p%tiEv?_5|vP~wfj1`LoL?xz*o%5w|vK%#@!EuP^O-Iy@D=FWY8t6AQ ztyVZa8DeKt)3?7FlNjGhC0fM<@Sno9%1Bgr7~1(d4c?qmL2)i7dEH-};7Za3zvQq{ z&c&q}k^v8RT76MhVE+L4%1Z^Fv;7e)2sTUEaxqpLr*&)5RiE!e{2vhL#Hc{wQcbQ@ z>z_1So7`UnF+%t<<5Ip65oHq5s6L7yO)<3Kq(sy;zz|7GmY&b2_TzB`b+C^#$Gl$h zL?+fuEJDNXXH&m4ekyVg9~8}UPr5aKB3W479dV7HBU1CeeGwOnIOjSk+|p8xQNOMY zWytIrI7-M7D$rFb|+xb21~?7Z|Hxw!EXq;`GFR z^HxZEDxO+Y5!V;a11fxubaU5=)Y`G1=OndfC?rQs^y=3Y@x^f&h2HKwD4rdqf7gg{}N z2M%Nu*rP2M2mvPP-NaR1Wezl1S^uhs$of zEIkY{wP8~2Q^mOe3PHa=5Qrq9<}xs9&vyw)4vpPP;bgr^Yty~bd&5+z&aHFKV^JgZ zJrZDj-(hm7c@F$pq^_Hfb9Lh4O`!A67B?wbSr}(Mpn~6ayN`z?cFWPX%=>o(l~;CK z+fvi_C*;yq@o$SRq@4b6DtOLs+#NA>C3xpPB4Sh4_F>lxeECg-aswplPcU7Rw(Bzd zq-0debSV2x+uL9R_S>Dko887wbRpg<-&oOpjlm~~w)e_JDVA}!3u67=8iSW#w#C+6 zG~8K{oRyrgo-Vr6u6j?y1+5(r68zLG`@^e=huUXF(G{6D{OW&m%z-5E(P~e=of^|D zI~TqZVf1+H?ReCBcb$2X5!;CwKt15UvtP2qYCB)f@fFbCGH zRkKNomWs75#MtOAEF*T%M}*;Dofnx;sEp@8Dej!q0CMX|8;6rrwoT({J(hrxh!>B( zBNfV=|0C%kzTeK`mP*&!d71~qdK3R}B2mmP=2lHbPHm&k9y**kI9$w^Q0|MO7iq}6 z_Xyr9%t{dG&x71))#ZU|*=8PQg#`NZ(`HEa{8Jhdk)RxecK&*#vDHQ+R{s(lDNok+ zHd8L7dOE+C+lbfunbvD~M<8nX<9JP|j!H~`g=u$ZB zQL2YoqGn9lJ_5?T<{cVKv_{G}IP-dop-vN@ly2pnP$SggCT<>NJXa2<(HQHfg^((+ znQfzzH##Z|4$w+2LXy5d#CuAlA8Xr9RqbkFYS`E|>i9^3Xns}Tt$L@`(0Sf!&O=i) zk|KWDtNo4>pWJBI?HcuV=6dsm13-o1%a`w6^&ZUh08Wa`BK{aT+(WI5d=fSF&d4Bl zjAB0ESfFGkclEFb6?;hSgIMcR%{Re%ZX2qJHO}$_ttosmHTywDe}!D<=8=tC+SXzZ zx;{m@Mm*Cp(?BizDpML+7+FO}ar-1Q-5@tLgUmvKe&-gS3;tXFe8LlHe~@<$46pG! zY99J_`x)(Ja`cmL4H^OxQG1WG{=J4}5qf4xJGxrea05D*$m7E5>XNAF@?zdJ_0<)S zyRWN z<4i30bHW&%DYmMQ8n~*<3WrYSRxZ&>CnD#AjmLu!^9!S`nqPZI z&<5~MwDn)>L8tu6B3he=PvEDbBl*jeM|Hnay8_j! zp#kJUy9Crf|0@6W&se~8x7YHMIK<+t54WRC>VW}-sxsD%p=I#hk$z>8KKCd`)^J{W z*gzAjec{tHL&=cIVMA6dNYUlV-7ee<7WI!1blsFWyPGzINeKb59fh1kM01wlzoo6s zCR(_Bo!3AB4F*ePC5<6UD9B}3PeLE;#M+>`DzJrAZJgPU%79~0c%<7>2{Tf9+>nRd z{cug-ofw%1HUIg;H5|#ptTMkteWe;wZDCf;wC)_*qt|;&31jbbb!==6!B`eklEaV{ zQhi))->Vw^8q_m{IbEW)^414)OE{xhW9Mc9&r7S*ZDtn#yUzg98Y^0r8__=*_%dM9 z@Zpn)k0iX``8oZxqvgzZv)mpTnN2$ro>S0iZc6+@Q1HL1S5KkuG7OKaQJc?xhLT(l zmC!z_5}$k-1!9;A39UzRC^_&!$kS0ntCOMi%_$)AZGX0mL*vbB_n8yJovUE?vq>+!T?MY;kwgG!UY>_0w63f>e`z4Sqj*Vfq;s?MJ4500qPn-yPR6 zl-lMq2mf&S3j&QlZY#K`ghkRWS>zEs#voDYPi`PvZ4+c1fpLJ%30EohV9*P>BaO=P z)K?)_b;MFZ5@qO*huI~~_cNN1b1~;eVyK)ng#qW~Su~HIdHTMo#sBgL*J(4>5M;4_mJHtk_FsP4X<&S zziYrdTus?=T~*$Ak^g@_0kV5o@T9j9TS;U_l$QQVx2D=sI}Fc9sAGzk-4x%x|h7J+mutQD}|M{{g9@d=a=++?M@i_ zC@se|e-j?(RyT&|h~W|Ya3*B<3i<3@yjMiFRsIGRus|QSs=sQG^onq(V-`DatFO&B z)4d8Q?jxjf8oYvyuD8u2v@rS;ISQMLt#)rNxWbLlF6l~df#Ch^4@!;%dk7ToAogna8S9B{gXyvc)|gb|6-x4CyFOlFMk936S&W4`0{2%ET>$27s7-OIg{ifjO zRch~P7V_PbsMvV8c~A6{Jq0h~Dm;vW;RUw_m_X%dL9h25S6UXJJ+Jk5!*YT7^4E?; zDj8k`AFk}~t$^@$1y>+; zqL)ZMLDZ%kdwz53nNumFh_(A0IDDXFXeT*v?V+c>>TcSRX#0RU zjEWdTBh2~>(@vP$_b->-CTZR6`@S)4> z7bkaboEr0_XcDsQNEJl{JhhJ))zk@Mb z8QHH_O+KJ?a<13nYt5?t);_JYx|N5T91CP&0PMDnSn;JD%Yd*nWvzl$*yTZ|g;==s z^#OTNa|T>{G)e7gZXt6kbE$aGnOvbBy_sxKTsR-E_-!BB%)&Ojd>L1iV1APc;3D4} zLJ5lQD9RFI`0GN=7a|2ZmDA8<49lU#HAM@E(;@?i2J_7&i@OgSgl$1siD`p9E}W36 zG{()@gxb8Uh5E(tLL?~jM?QI+LGm{b8+*cqJzx*l?Xku3Ob=pCJNPn03Y?>qQIOe% zfbaVlX=IkX=!u5+DiKIRd zQ0la;@Og9jI7htVaNX-uclrR5aX9>lIJEg&A!+-?ZefF;&|R8Y>$&KYUd0XhZ|Prf6Im*MiwKXOajJM7)$-c~7fvge zM!iYRNf$7%N}cA>d#bFHoxNu{G-|AzVu-)oM_gP4L|ZW3gV!vd=A8pa~LHezHTl> zVC_2PPcm@fG1sqF^}KE|$)Q+noINd9)krKTTjF?=sQO;w+|Y;p<39bO2r%z4O(6iV z>r%cdTpjgjj=r@QRxRM(Dm+psvY{p_^?;#0*9|Keqp((aFG~XvSFF7XX^H&fGX`Do zaLGz}uDXVTg& z?1!HGeWD~apqfehiQ!3!fG^^h51#}m?s=f}))zSIGlq6L1&eNw>kk7`WNK`>vf zXm*mMz>Gyvx#B$ri2rWrDLMR=t?QV*kv7v$fgw$eg0GNrCGKw0%9XIc)I)7GRcGqzs^Nllli& zy~d^m{?5DG2XCfchF`uV862U0*tZ^@xG0}}{aJJ)H|sWGvu4DBcHysH^rABOzKJMc z&K$Lh{yXZo$&YtqEV-Dx8GVrDn~wvLQU8i#ixoSQgQGffLRW_$?PI+Dw( zPk}3s>ifPrJb}MU6x#9sa0=f*SeI=*GX%=(evBMU#Oz|fgd*Q9Tey-~<}NaUZwA>tf6C*;1m0R0jbDll~Ea%kUyCN+3QY*zkpt*{*?x)6uKe}O% zNJqHJnQiq8XH~AkvJpQ9G-ZvV(up@BqU5!KJQ|5b;=T2o0JKfGPlz>^Vpo8$vwd&E zW7@z&|5>9;3x6uRtO@&L3G-xCP1Ou4CLAPu|6FaSYK9)KZR}T86X~?)4sgIw-f5X0 zj)2Nv5bZeExv)K(J566zSG|1M(<=5Ie7%R15aWd*N;fGK1U`QFef9=2+;pAp+gD%< z%{Id$2f07O`Su@B+|t%ef#m^$LN4E-KRbtOAH`AIc^HndBJ5R(sA{r|ke@)CoKle|J451QpJr8c+qUFp&{qOcbMFX%zs?3U@VN;yxBpH)JRL z$3+Qzv&1^x0IWZ4rP#bE&j0S{X5(L4M|*O@BPr|K=W278{lObPWQHiZRS8R=8|jUa zJE?%RG^6iEC|9HAodJRVG`s?r0aBN+7GsdnWlL%%WrEm@onvBPeo@8b!3W| zg=$4xDdwS)F!&K;*Ab2Iu50q<#x*Q?j2iP8d33kQjB`{e4lK9{A317d!=32_29N%2 zRR+G4xyN7d|5iR18b0O$aFT3VEcfA8oXVLB+Fsd#34Uv{o>jwRqxJ$Qt7OwjTnOTN zQ=Nis2xs_)7;?*baY*|?Tm3|JJ!eEzHC5A5pv1P#%8$Rk9XbM;e+Wwy73%ZiNYsz3 zMed>9+%^v<3hbV}Knd(jZ2^)f4|8cfBfkF1R(L8>;BTVOKall1Y5poa-#}+f)BiR< zghL?&ALj|)&i<&G1SkmO)ZrzE8VhFUh{##2D9uO0g^j)1oxstnqgT^3ScGA0svLG4 zDCQ^&N=>M+wpDzr0KT?sHxO*T#yV$e)g9rR!W>l~=)l3e_&2;Tgs;|@>QP)-ha+Xs zqDPXc_y+uw(MA!xCoa!k3yaxHd?PQ9VyD556=8sah^;0F=&Kx3w0}g?-?K;cDFO^*oX7EZErp6hGIy=9gfO~jXp(Wppqez?4~vlrr@ z#8P^0d*{4u4XW?Re{yEZ9+Uz}kuv#`3%Z(8DSx#%9L~g!4z>kB+$atn?(&J1+ zTgZg1iye`fyP#AUjwOoh$>1?lVj-FCJ{q@{iH5y3hdkUHmry(G&;yK_Yh^Q9-Y)C( zk^CdKo9m{txIvu2324YRHV1l;6ysT2p=2NIqo6+irvCQFx%dAh@9#-79nJ0Tfi@AY|s*g#svs`gU?RXhjs%F-pGB1HXk~t`_)9oQd|HYp-Oet8S z{;d3=Mv9rg8AHr%^|Kaaz!u$2lK=?3#ZdUhGvWQ$du4_ELS)3-ou)F4RG{)~CSYXK zdC0Dh63&@+*YH|aY83}$x0ohkB6#t=iS^+f?@L+YmJt7Js?q>>&6RUFoX9YI9Dh9P zq9h{)Gi)lq)WkdbJ9xH~=zmhRNp6bg$MPW?Y8N_vIW=|Zc=5zF6xVyBnHBt9?dk>ZGacv`PF7ms1t9n&9`ZV5(PMe~a$@t-Yb=HaVhJ{LfRi<) zP=6J8HXL)h-PbkBNm`gnayojBv=^2Lxx`!L)(Te9qpB~i!k6wKF+xV(JV1fE++J;u zL2hLZ9?8`1x5k{S7`xaFXtzH&dY>p}7H8nEpK_Js5_$;n1%k>2&Rv@_)#p&f*Uiq~ zyQ{jF)OHbbLT&3&_36lm6mIdV{#aIy_I5}0K?P$(Exoz#(HS3@(JhiZ8rY(r@~Gg# z&!*ml5JiWZvLGP$!t}TqHJf<0Y>Ful17j(n2TiuG^fIWV1O_*9wHig*TSekVTT-U{ zj&v4C;Ai5>L^6Dgw|4o$IpO(9DNGbg!AuS#;crH7YMQG@jK@*=Z=0pBTJ>r2XO-u; zTxBlqgIBhG8tRgj&bLh?I%BLi|AQR=4k8KfV4$`1jd^{DWZYQq`q%4?F!u9)c?$1_ z4IN5(zV<0F^un;1Cy*~#@_2z=h{&)Tk@wKMgM%uG^UbQq<&(Z_QU_jS3!gY5EOKXV zl;-t|ln3`-C_EScAW5EWSg6EM8qk3s**PL0z(qxmv)(NZ>SH2WlvdRvb5$93Qxg?L zUs-~guu-Q)c&l4K5M_S&nPXbvIH0s0vLOn^vVs2C$_2xMeTnm1^N$r*yv0NSYLh$;>^PL+k3Oi zYcjf42{U39<)P@eNk!GnLWsQ{)^B8Fb1CLd8{#u|UYXtrSKps^P7nqu`!;g!7?J<( z2o`39lVz+}@D^s~O(^8~M?Sgh+a6?!y>5JVSw%13Yk&B|mCKaQf*JfixMG_>dv~SG z#iHTDMY-uZZ1|8^@=>f>aU^R&?8FuJqhA_z3@<@}689=Nt-Q+>5M@<3oHh$gyG}+I zfEE^CszW+~g04Pp7jV}p=QbQB(=)U4Agl$rT~FrktN;CQIQj$>vA$1#vcw47oU3L$ zCFrQ+x7hj-a3RHLAmblbts8M4iN-N5H3m?SUm0|o(G?g9yw`&?&FEd95CC-Idr*!V zlro)$DwBjsa;)W4x8+A_-5M=JyAkWAIuwhh4Wksoc$!-Y8_pf9`9Huu_xX$_p_CIU zZr++}pdtE7aZkJs$M(;q)=^}0j2U!A**W@5gNJFk;%7EK(bf2*f2;?+e7Kl{_}+!O z8&i43sWh7;8=xpHoar$wvt|zF0YxgDA`(Yv!ni(hO6RAa z@o&YJS=5OFHV-J4n+fd5HjG`E* z4~k8C{D_CzKTeRp47+XsJvaWev~Y|WX^MhGqIHkYauTs5+B%9MAg5H_nTtN$Jze~5 zcr_CiB596&rOE_e6daD#B2E^R|8!sHhB9t&lX`#{c1f+-E}+UFCLTg`f70Zv+q78H z2@e|>2~nnNb(Y3)KX|i)Z}$VSNn=DAE{2LYdTuxI1UTFvr8eYf7?vhlSfmu)f)w8e z7UloF`;!{2GTU6;gv72mh^(9jkdj5|oY zbG2;OBh#AHN|>Z86`qIELSw3@1@y-~T+B`QPZrELD_5oh&$~Pm0on712vq_ZR8qP1 z_MdwXtq@nmJ`I{<=V&OM6Z!RjTt9vtm3<)@GnG(U?661ilW|!=?I3BsXi}Q*as-2o z@6_(UWG!#n1&lVROqY5Ym09(s)A)!4+~0bn$`@yvS)Z-?5JEU5Z^cne3_rt<^HL;= zlrZsB&p}0Qgqj{Kj}HFirHMFK-b7mPp!83fc9IJzaQ^E=3_C)VjE5G7W0wnTF*gmo zF8r31IJJKxa8eg6LyhDk(TJhs|5IO)1yD<_z9jd4n9(}>Xgi>eDO6XXv zUOyKSV5o-LuxN`8MkbtKhNcaW;h4%kaBw}8pjT(qucZ7+?fyV+sJU+YWrVe#$Ka5j zG>6?L?07pFbishYF2zE>(HU~O;o%GtM;y@b9PpDC@>ZM5Nh_75OS77jVK9S z@(es<z}o3sxtVqJfp}#0l|jv98qxEwxS<{ z_>6bFP}deAtyqOF>;~^=9z7TGM_{n?I-j0`Vn%YgUB3v(^du{{PvftGIDJOJ2l zq;!entV$SmRd!YkU_X4 z%8q$+GhFD0;g9NN$u*IviV%On9xv8{o!}>$^5`o=+tRwg zC(&z8ti=P-b$Eq)T&?Uv9y%$yqRl&@{J3&Q1$rETy8FD}`cv&aJlb3;xY*6tYodc} zH?akl+UB9@{2R`85(Y=iqGS-tk4fXV72^-(T5Im$hIFRx-qjjFj9w{3T1og$L9jpn zjz9=k%g=<4M+Vyqtz zDFysePXH9--OOebJ(ZXuMkN<27gKd=sG2&&Ynw(D_xnfq(}vJ}6EPh5pDK7#qr z1Fn-*6tRf6HM5RM^n@qJvXn-=u$s}jSxuamiIQF-WM@lx&XuGnyj^_6zH00_N~y%6OADlqK6)-m)=?=Bt8NKU9cz-m}gz4YW5A3##-?*ucRIfHzJP0`EoV@!@# z>%kX1>TbXp9ZjpFS+Dj7{G^7_sK1=_I3Q z0vrT2GP}~1!U^;xn&ZSecA^3>PE#DBIC(T%^RxI2+o1q&K`&J$+VM2!h*0|f0p~_= zFYU5ryvh3LsdgUiew(|Q4+lEgl+l|GJ7_h3xA(GP*5tj5&>oYcyK1tp^HL=%kZRFK z#S|T$yt;V$z%IM?0s_vA2{T)c+p|7o+c+t-idjPv%%>X?6qHFDti9gUfxjD61axWo zUs&-$a>(fuo0=BjrXeiy<>#})grpD-xHa2ATLyD5tu}1E7xsZfDGfQXT65^?64VEF zH34cJN6{`sI;^$%nTKTz-7~}yDP-9}ZZhlkBlNYNX4d+E9d-ULaZ|Hu7@$VT7s6Mq z;tI)`3mRs?$7;NWQV2`HRo=CS;K|~XY(QZk4&MCoo!&1F^}`Q}Gri4z+}Bj9Q7^)b zF(Yp6GiMA%m2LCHh^qE4lO{kM8Edh?g=(kgjVDghVMO!hF>(yOG`|l&;0+mqXV`n} zj|#wa+L#Z7LEW&rhw6QB1oMb~_$zn`7HNxW<3ROO;GH6F^jH+P%+yRvlZVz-h8Ndj zN6Xw^v(x(5bZ#2Cmgd)k%O;=MsAL6zjuG= zl!n72Zb+3(PRu$6rAr8mF-Q1n+?cMXZLRjLZmmr(qr?J_fU{SaV-Vd#qm*o8^Wq=S zkP^J~n;zN!JiB0zz6sPS1aCEt}$Tj$qUC#G+u z`Arm#t`V3T(QG}~@PMwlm&`%Qs4SWSHYJ-H@*N@GKMiD)pEzW+rKb>57- z$wgRKFU$!<$~9d<`f*ql3T`qE*L@sVFhA<{T}V0i{SH#Jh-8<5_c^JU2S4dkCw*Ny>$9gUZ0CB^JxP1d!->%Z36E+Ez@`Qe-us>4|QF`Y(&wkA)! z_|>l2Ma8cV8in6TaWt2=+7LcDEqA-`6wG+RgV^-Ko(G@_RQUog@cuY3%nJoIOg)MV zx{1!-Al60<+3t_%p&Y*|t0AKOASp^d zH|-}lbGoY!&@RK_#5HlIEme5<+6SkrM>FD!GioZlZJLr&jPPhzzc;^y53`yM?(@*U zZ(_a0MAMa;5|m|gWH$j}?9~9kf9#KBUkgAgQH)Zsf#)j{8-1d*H z7R?kX9c#T3p0Vv7p7KYS*Hw0{xKg&C>fl_ntXZ{s|= z*PtGR6P|TdiM_Z3dfgJ6>fYmfoR70$nP(5h7nN6y-{kB{q)`d-K9*vOOBx@#gjeVE z^1y^WU{>2HIH(R`hlLL&O~{cSpDpgQxo9$b=_x(Ya(8POwLM!&|2fYncL$V@CA*+k zJ~<1pLoYK_XUiZ-FDE~M@SLWdDrQ+$=|3CZzyz*ToHvdHU*8MKn-g;f$Ku-#Rab`B z&CSjJr`u}Pb~0UhDjJ&OZ_||HcGay*tkooZMW%``H`N@ORZZM z!%tVNs&MoQhGV=W**Wi?IlPNqrEZYH#B^hB7V53_^zpkiA)6Iq{Wu8kZi;gDJ{|lh zy_%#6nGR(S+YDDy9I1G0~4i3z`Psw~5 zC_iyYndT~&S~6u_JaY@rzI3t3U4COBU|v83|9 zLub0Lz;-e5UWYXc0WwbQ{sb#%E?^%2k>#ts+-LV1R!2{|I)+#QOH%?7m55Hd^?3Q< z-q;(o-tHHrMao0+=Dzyp!>d7GiHimewQ<%njAtesob;Fk3t!l#)~XKAj#FFhz2%!2 zgRV!04o3!@@es!h&Q9>{m9v4>J94m}>3yi57_Kd03a4(b@_lHletXk%LQMGPwofXr z7%1^h1o0H~?Mvr;_CUg-mf8}@Me=rr5Gke&y)uzx)pBeom*niJjMxjus755+gFn6o zTfjYHcs@1NWgVb)_s5M>XgsbK8kHYv`jRxYHKET!M0KS)-BN)h2ch6#7>sa^QFsvk z>NU~N{A}R1fej~X)q0gfL_E%Euj{J-h~$DcWB72p5SDx?6Vxs;v9@`#tq0<1pXkeF z(V$2-S=>-!GlvXcmK$*m$$Dilf(s>W5qV@smQfV2kSfj0pu`OaYAb?{NB`JrbwzGy ztn9JUglniNnLd=u9|oYbA2l?Ami~As1~Uy8t}#C;2ghJTA=|@2s5xVSMg^#qaLneC z!HtThlmjx&7{y9D@v~aNRqcM7ElPJH3q46phkBAtq>0pnx3#O@(q*6SQFooc^eD-9 zZ1QQ`-zu=o$;OtSyG}2W53Y$l5z5Dj`wm&wSiYE7GXRO!C54RT8vpXaNnD^NebG>` z+&1F;4h>*sW0N9mjPR~xqFt?gOFqKtIrGYNrq3C!r&|c2QKLcl%XR9pakV0t%*|n z)`dD0{oaelVr2;M|1g(GhL1Xe^;c-^6qow_?if;on z^y7uH{oA+LNJPJbfXQZj{l~KXBV&$t(8Z83JY$vusHl2g_s98F;O)$xr9m3Qg+H&) zpjR6maxSf(HN9_oNW0!He&M20x`iL>S+6(Gi2l>r&zsie{|6K(KJA$XA`SLVMZ9m|42-wc952g>vCsaM{bOqzT-y5tLb+RIfnUc0Qa9aRXxjE$82jOE4n^0bDTFy|CvdIGID?Z_iJH-?8J(=%EB0fcx~-Zv?$#-{ z|GfJW{4ApmfPspGLai2Yp9GTqpfaqa>G9>9fI0krquz9`n&@cCAT=)#c8SE~!=J8mC>k}jkS?*BZ z{Ie44vPx9Qm+rOdumE#xLJXx7pa{lmvOVC`igWX1Q>jz#H}BwGLT{rJ3TfOxW;DK5 zf}$`*+efSwjj}6F|Gc$3-vl?!!KxEw=&uQN&u46F4kjR^yFCk2rPoX(m|F)hMy7?m zOB`Wcw?cSKty|StKhI{8WU*|Nic!4+Rf>Ae7F=LtE97&NQvrg=pqkzNlV4;Nu1 zJjLxyDXjgWnSXiT3pTy)F1&?pfXPrMP$pECaJ#~A4D*r#$9^2)NH)_X2*>H%bQt5*QfU<${-s=;#r8P(Y_w&?+n{~NT zvOT6%9}}c-kDvgsHMe|Nq4fp>&hd5d|Iq<8{TPVUO()hVYx**0Zk*uf_IEWZK$@toX{qz< z(h8)r163%B`Ryd-Yk*gAiE6QbLW?*y%9>+tvW2p&;ksqnU?F)bEPMyHYpq98DI>BZvta#_vPLzJ82LR7ej|YpJ=YL4dgZ0MmFtT zdm|=Kf}e@&zA(H`C4OW~TNDc%z}-SdnD&tFOP|KBXAW8qnQO1Ln?S}?Fr>ZVW$)Y? zBh>V-j7NZi<$|s?Rc!2}e0mjDf2i;h_l#9qbKQ2)5)sowSeQCv;P3{JSnxuiHKY(` zT+xlof1cKBvOyPg_`98k!Nc_a{75=3;Dy))4A_MHk6x-dAly+OG$yMcL-SviyTgyh z!dQA%$?agq)7>f`9Qb6{u6%cL*EXqq06pD#_)759b3uT)#j0N-qqDPV4!MZbSy2~# zs6&~OD3p;|`tCM}>DM|?V~ycpSgVbZhRCQR6Z&>C@3K38CpZ_3(GCt-CdNC#{Lb&- zAx<=!I^O$S8RU-AkNKO(j3SZ7^jzJF$)||sf9-0V-O0_$?_z|1M$z_fBju6ploZT? zsNfu@jNk#oL`T7xtyO`ub?&X^&WYFk~L6MmPn9@O+-&pFyEN4)?z#3pD1!(48 zc6A6y+np&izm&DHcCzO-XPSmx$Lgq0LphjL5=Ch97G+}i>3d>c%7rl*vKaHJ=Hyg>*$n*`(;-CxR zs>*Ze^~99&GJVPV7a_~F!+o=z#po}$eU|gkl2@SPm!;A@#r1CJH3u3$kHEY?YF!Ed znhz^$83Q3To9-!{$&Gt`?n?{23`?LCO+V1U_`+p#c27Y;Vt%oQ6 zPDt?!pgY9duJo+?HHLZzE>a|27e1D2q-&x^KvG0yxEUWKX6l=p9xe&ksn)fAi(7hi zH-FyON0X&>YxXF;wdqIgc>jAT0{4p^t`AgoDAU|6B+c>n(|MlI_81*lM`(6MwI>gWH?!9CQR}60j7^zA#sv?!R1RWZ1y)DOovCsOj zlCg=%@PnZYG!M@%YyC*-9FqyaOymr0JnofK5sa*s&{T>l{G>2|>8+SJl|43oscZOV z&L|ZqnUNBwc@>v_IlEu#`hMnsh^zyVH??Q;DPT+PLi1!Z8?z1+*sy~EVEAGXT2if_ zky*<>NZ0yI(uNMCeyR;eM$vV%&4KyNE8$nimvCvyrY8daaWwEN2ajL~h(E?*6cSMu z?to8N{YPB@`Re1b15%=NBLAJD(x{C`BV(w63BY@nHwK9|VWJQvC9)HO5 zO*%CSl2g3Nw$0~?XZ4zcjyx|#oCr$UZB?msch0$*MuWTL#qlge$u~LCjsriEtP;-T z0A*?jY{!~_)9vm3C!usr0-e$#n@T!P~0685uZA}e9o*qo@xhEWnerGPKy2{~!( z5^v3|`#d+tUN92DMU17**aYIlIIgofPOz*elJB=mfe=zw99N!fRNzdAaY=QAA6A-= zowpM=N^m3A*m`NyetMw?M5Iv|01f}`NdO?H1{&T2N84MVa99^wkL z0NNtle2m`SMB|T)5BQ=|z$d0m%X&g`OEP9~J_7;Jc75oA)h>GY&IFvuUDP4pV@s zbjPqTZq|s4!3k;1IX~)(MCE(OZTg1nYw|oOm}`+F^WvG*QK4m=`GQtCE(Q(}8UazV zqC#In?NyCAVEVLX5^k2e0J^Ay*XWw%yw)G!ai2V`*nWA-`um~1tS@L*YM2`^;+IIl z#Si33$2#Dfwo#vbjlVTJFCCIV`@Ovdvab6x(||p}{etUE(^4D(pz|RMY9I(lL?Q$` zA?>I?$+&X@foLMH7;_W}XK=`=isF6ZIx* zG++KUZsLSQ5*63tURZ0Tt}L2Pwpc%Pp$#IF=+en{*8gB50Dh57VG@xBi`T(SsV(c+ zMi#)wMn{w2y7YC9Gw|Tb6a)OoPm$Mb5PJ^BE0BXff@@T~ZZ*%K#%2$4_BPV$C%Bdq zQL&d@{n3DR=6TOcoEpc`87>9At3ec@>@1YwEQoB~(`o>6>nbZ82{U69K2-IXpp`_k z;lE2rKQSOH^})+$E^OEpmb7-jfATO-af3LiU1{bmLR9g{@QCMM4scIf@9s_Z;F%Sy z*bo*6#j{4#m_Vfv{k_p{mn7kpoBs}xueIjrfQ`SB-k&VzCG@U3fM9WXC89ucz|L0I z7beL3fv03F$&u^1fbOVGs=5A_ao(d8?F&-;SfA%70+a(Wb!SwcvWY!3$8u%Z&C$9?maz}Um-3vW4D2g8ZfSz#lM7E$SHz#U zwOjc2Ypm#0=b8n(1pj-5JK=wl2#b8(r77Wen?E!Q+Ekk%xgtZ)%lYZv%D#7Mbp`+D z{cq>vON7BYIxnT@Yd}h0fE7U{<1CgU`81u;(4a9v_@XCc!3jbEj~#EO_cb@1Q+(DK zjAp(HnVINL@4Xs$j`h~0KFk|>`1#iRrHQ)l@Ltv2&-te!XKEpE?cbD)c8!Kq=)=00 zmRo@pH$Es9%u8L8{aDn3BJG6pxIh1@c*DP_G~8<#$llW5BC}09$X0;UTo{12x`~vB z10Sdi%nG5iuRf^gt$3Yeq6Hl*4o=pQD=UE4k|$*V;Im z=K1fs?K*LpP+JkKrS!$`@v9_%Scxxga(aeagey_W3{E(QZ406C&J`i!h>8R2^Cq5U@Bv0Hge(+w1# z@&}N1pF*p4)~85cR^+4qGL3bwxHAuNcB^pNA?TOvEF;?_qp=bid;zXI_crjg&z-yX zxDWvP{-9zox4%W$?^)IYn=7Fz7lLFb5j{GKyKmZWRA?ruyPR$9Z`pX{A$CaR1l6U$ zTOOcfe|5_a*&W8Tr*yBfxN&=|B(qNntDZ=k1{kGXY1y^ZyhBrtNg(TSzCY~d`A{95 z4rsq>npL8@xWOfr84_y%zu%zcSH*zS`i-?kKl5CVLQ-)D8w_kw{MkZUc6uqtd*aJk zKIrZ%KE7Usm|}vK&SN8rOjTW2Fr05P-Ahu!AWZyBMkR2cJ_kr2B#&FVmn(X>}$QsBc%kYJn> z_3EC{o0|{&H$GpR4HHMa&;UU)(doV9w+W}tw&#;+8TP=}<_?upULAvv0*}jTt;!Gr z*NrFoQb!2PwNa^HgBY^zkIKIH?mlZgkfCjv{SXAYCZ(~G%sKw^V2wR>1P^$mv`e9a za1CgN2C0gOPl`MzUxk>SIvA9QNBN^%ou^dedf3g?Pp?Zk+@5p3)|Lw2y;0g|vi*CKWYiEeP^T)%pAMN|q*hDjL&R1XS{X#M2V})nAxw_Ue z{7^NG@@`PD&Ngf89tOwQ41IjT8}hgMZ~N+NqUtZbm;X!x;7=>HEecn-3#MEK&wDg2 zs(-;@m&J&-5FS{Em{q=N_-3&hx07y)4LvCP7s^5nWd-CMInZZZoW5(jDkg7Arxa_d zcSfn4=ix#?R?k6j4|_0lp)TnQ1XtULl*L)j0{2WEZ$h1>yn;kr?D?n+cqSlE0nR^e z6-pi)$O=SR$M#kX)9VpR586*dE zWD5}s_IoRTWwCgD^~Ssofmm-&$3XE+0z+a!NbHcL(dao`y~Itnf0xa-IvSn2XPE{e za#Wqd*X*>mGC}=+2{$;07JfP73KHuCBi#@x*klY-GdM))++3bqw3!@03(;Vd+QUz8zKzw84 zd#cW3%_$EAz^T|_sgsZ~-g~vwB%R_%YMS>~Us@ES*l-%IA9M)xPYXNyl$VgRc4Shc zyv2w=?`VWVWm!+=+upy<+B{*ZRzRC8{Oe^g;1}{$&y*ckeebOP_pDJrwzE6JsKDlW z(!*P@t3INIR5}`s<)Wg>p50k>`q>q9Tj4j>ld=(!RAB)%Scw#TRoZskeqU4SbHn-+ z7pE~PpvXk;)?Dqcz{&9;o{y;#D$m%yRtmZbU-4zUZtcj(>(f%SFWtT6X@s;I!D%(_ zg66_AIQ~u_+2EwV>ivZ_hb8~kywBEYRP51qq8Q3L1^zxk zDuYmW>yUKQNbTOt`f%WS?3?o%L4yudrt|h#@(0-YMLm!g$f2`>=I$Dwea|2 z`6RXE1jZmN_>{;4lr3ME{vo~>! z;E6q@8gs8(E4$!1;syOV z8}GMY?$VM0l1M`bcdnhbkka&Ph>S}uY}(ZbyB-ON-o=!7kokGow+bueCG+5S^1@87 zyhwGpj-VVPTkvBIEE+g9y-OnYM8w6W-o7UI0ay?HEu@5k^jC<fYs?7n$5vS zkkh3CXe_x(;Q$d;Jwnj!5C$fmc1mZRTVN?+`&ia`Rcao;1^uHt+)I4fd;Ntsg&Km7>kGFp;%s+)h7V7jCVY~!j&JJ3oex{Dj^%ro z-|~s1R46Fb!5`eTn7LY&4KA+R|IB3~;Yz@ex5|=RXjH`;MJaVt7Q={VOgstuTVx3iZt%r6@0 z7o{N8qn$T@-aHtRR&_53V4iQF6Bw=-JFC`t?^-iDp1#g6P?qWs2+5p~X9n%c%aZ-D zS~KO=jdE)4$1o(;>CL?WKQv8wySQ&ya{a}`==&}_jhMBURt^35GC3^ota2g|9^2Cg zx+!hPL7%g^nw|bp(593VOs*Udfbnj{1t)p~ppQgk)tb!1s`bo<+(j{^C-ASuNlS~`VkYgWl{;djVA1JbIrZ6281~cI2Xt((@I6lRJQ(WOYEaj`Z298&;Xr*PoG#73W-U2qRuPhsO~5cCYe4vPBX}|MGOm( z#$_g9%8De`g!RcUCY0it9#cE@`F!H2gXE`r;a4E{9G^j9j+zI40x+*$cIRjR=N$^ z`<#2|>LZh_e4y_+PU78{;@NG}&rB5AOKvz0jU?Eve<(NOPn0whm0WO?qMP*JXs>To z&Wrx^RJADNLe8}sG;6Os z4Cz#8JqvK5weR=bpCJQWt#3@9@9E0> zZ1CX2W(44jj3b^DOIs@=_N?SyFo=6`Fk&HDE zGhhIMLLG-iVtmY|t*f4@LIX{p;Fdyg2c!fV?M^dT+pKL~Z_QhC0Oa@(PNarGrp-KX zpQ^m@J0GI$0o!3+rp@*auP<2M(TE=+$r@+KgM5lK=t9RS5Mo09DF2wk3ng3PN-#M+ z>nyUz*QDN4lZWFxuS*cZI3Sd&;XrnXiGwTIuX(Zpc(XyjijRF{llq<`kZ;_@TmV>w zShIB|pv}*baTG zww~ChS8ME0V3)_k0>ttuXrN%59jK(+o;tTu0Z?c^i`riok_Sv18Tv~HOaU^XC zNEWdsynb?>*VON$*TZ5+?7MC-5`~fY6K)rDhm#ZcYR}y&wN+}zM2t8IFfE+o56ka5 zS}!bl16taiE6nMg)nh`g{m%8vwBx6Sh&?=ilj7sqRk`7`zd(QCY>$Ehb>5fQ0chruL ziE~Enw0h6>V=bK{$T@jzKGcyLdblH3u%X>B#r?>?%wok|^hR7@X&Q zxQj1QFvTG3N93Uq#^4bIF(A6ih^}rGSm6VAU`Ouf!q*eQ#6Y42WJgSV)bn1n$!Cn5 zaX)Vm(H2y=W`F`_qi}=$k&tl;NvSI>P#BrG>ab4^E zC(}wRNizH6?4^K`<+qA2G6D5{r;9Kz`wm0a5R5KxA}17 zgM5@MXZvqJVa-dLXy!OO6-LD}4k^(Guq*4Z{LNxs0J1!~+N?}f#z zubsNwH~vTwRz6wXu=qF8^wcuq@@SQ@L9Ou|Ht6P&k53Fy#}^XXcINOoSb0>tNIba5^SOmaYp; zpKp%0?cpuJa$u|Mr&$4`)oUV>O7u`%d z?l}qmQZVfnP^L+{(y6D%+P;u(v?q?hlU7;(8urVR)ZawQEBTX^qZFD;FDi{mXK|n- zEU8@r=axPfRT0ZnODG~rIT};4lJlJ!X15tI26!Z29+E4j4j#0AL=EBd zKPPh|`?<|VAmgUx2rV9|AcT%+N96@ZNcPyo#X0@(-;w(A`q@?%;g`&PuIV zC;mIP+twh9!Jk2~0Fttn^(@`xr)klu&!{G?^N!HokpBx>J0lj^-=fmN2pn}&*(Fa7 z_swha1eJa2A4-z`simAKzFA1x8~!t4!x0_&b3mY*yy+Ngm9Z&QdUMX%xo0IkQsySX zuP9VNH$_q7r0c)ojXd0XM6YTrwD`^*A?ru#;njv6RW@I1#nsmJ{hpy}ytB)4RL5#g z{qQGsiea%u>nE+a9{STn4URhbR1v%J%RgPDq2XT6G|l8til=#e0vS$ny?hCxJ|HG= zMaDo=qm+5zXj=p|yj$Si?Rm&+h#q2bEua;-HUC#1CCpdH0LsOet6*CX?Fj&H0_-BN zY?J2*3CJ^4koj`?^ncpL*Rr@0n7!L&Z&WT1l9@Jbx|l zvEAV>FUw+8Hkh}#f&3w?(IQglwPB@mDB~7d%c7CkF8j3>j#;F+6s84|dr&j8ja*o# z?L5epB*i9~WoxDr={{grZ_f8W@`kyd;W=JJtktfoF&jQEH$h&k*a7J>hvIfHT~kvF zxvqM_JPFfS)Qt95`$=8v5V}1--^7{PY~{40lpWE2WM_7fw^Lq6M0sO661;0b$wzW$ zB@4KV0F(&lO>f*|1z+^HaW6w-F5*W1vs($<5JuEd7|RpGr3Xk=^m^o5ljp?ZyGWi7 z^YdQNOvhUW1~+M;23pcGsO3b!a{qRtUm}ocT|vHHDD2PK$@Oad!R&%0t^f60vmFAMjYGFa4-y=82nfinp_xLCn89Vt2=rLk7lFP@UA}2 zGth6kukxRm39D9JUz@d(+7;GR8=|^1Q42Z1uC+km2}7sjJ#CB%lxo zb3`c1MLT$U36k}6e zC@AwR>1+*fgOQ%t5B9k9I-kax>wH~{SIj)Q-J8IT+zvnVnoG`lmD-+-3mNO=IK1|$ z$w6~tTLRD*Yn)T1h?b2|8JN9a49Oi4m?E;?9nYy_9c@QD)uW}7h*LzvE z&h^g;()Un|fCJ-0gJ>j{bOo_P0Ipco}>JzfGry%yzWH@f~2#(^tov%$eA zP;&HMLJ7=}0mwxmW1YvEvLK}}g^)O$D_Y8`{nOcNCZ4N~3v1fUr%uC2Pcb=Y8ItAB z*#`yTb>*k|L2^-sB8Yk<2NUjaW=A@EBkVCUv-?`!h-$q2#fobKYkDaEpQ2gu*tS-u z+hVgJ*Pd;)sXAqNz#QGuDpzDO?hc7TKk1qtdyc>iJgb|o@(UGqn0EhS zvm(1Htf=E^3|vJ$1X`C5;+CT+vjr%|Z}y|mho%Y7XW|tV`3Y1g&c@swqg@IUveHJS z%#*`VONWNS0@FwEjBhn_c`FhMMy&hB K%U}7w<^KnPl@N^p literal 0 HcmV?d00001 diff --git a/tools/qa/door_footpath_check.mjs b/tools/qa/door_footpath_check.mjs new file mode 100644 index 0000000..13aa889 --- /dev/null +++ b/tools/qa/door_footpath_check.mjs @@ -0,0 +1,165 @@ +#!/usr/bin/env node +// PROCITY Lane D — R40 §40.5: THE DOOR POINTS AND THE FOOTPATH (reusable gate). +// +// R39 found the shell's patronage door points read `(-sin ry, -cos ry)` — the BACK of the building — +// and measured 0 door points on a footpath corpus-wide (0/493, 0/72, 0/139, 0/30): peds ducking into +// the back fence since R8. Lane B landed the two-character `+sin/+cos` fix (web/index.html:433-437) +// in the same round; Lane D added the kerb clamp (web/js/citizens/door_snap.js, applied in +// sim.setShops) in R40. This gate makes the front-door truth un-regressable. +// +// WHAT IS MEASURED — each shop's door point, derived EXACTLY as the shell derives it (lot centre + +// front-normal · (d/2 + 0.6)), then passed through the SHIPPED snap (the same door_snap.js the sim +// imports — the gate tests the code path, not a copy). Classified against the plan's own geometry: +// +// ON FOOTPATH inside `vergeBand(e)` of SOME street edge (registry.js's published corridor +// law), on NO carriageway, inside NO lot. The R39 measure — reported for +// continuity. +// ON WALKABLE FRONT the gate's measure: ON FOOTPATH, or on the open ground of a pedestrian +// block (`market`/`arcade` block poly, outside every lot, off every +// carriageway). A market stall's front IS the market square — it can never be +// in a street's verge band and dragging its door 50 m to a street it does not +// front would re-break the truth this gate holds. "Duck in through the FRONT" +// means front ground a ped can stand on, which is what this classifies. +// +// GATE ARMS (all must hold): +// 1. walkable-front rate >= FLOOR_PCT (95) on all four R39 towns (synthetic seed 20261990 + +// katoomba_real + fitzroy_real + bowral_real); +// 2. CONTROL — the BACK point (the exact point shipped R8→R39) scores BELOW the floor on every +// town, or the classifier has gone vacuous and arm 1 means nothing; +// 3. FIX-ONLY — the snap breaks 0 points corpus-wide (every moved point classifies >= its raw). +// +// Run: node tools/qa/door_footpath_check.mjs [--json OUT] +// Exit: 0 green, 1 red. Plain node, zero deps, no browser; reads the plan generators + shipped town +// caches only — touches no game state, moves no goldens. + +import { readFileSync } from 'node:fs'; +import { join, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { generatePlan, generatePlanOSM, roadWidth, vergeBand } from '../../web/js/citygen/index.js'; +import { snapDoorToFootpath } from '../../web/js/citizens/door_snap.js'; + +const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..', '..'); +const TOWNS = join(ROOT, 'web', 'assets', 'towns'); +const SEED = 20261990; +const FLOOR_PCT = 95; // §40.5's gate +const DOOR_STEP = 0.6; // the shell's kerbward nudge past the facade (index.html:434) +const EPS = 1e-6; + +let fails = 0; +const ok = (c, m) => { console.log(c ? ` \x1b[32m✓\x1b[0m ${m}` : ` \x1b[31m✗ FAIL\x1b[0m ${m}`); if (!c) fails++; }; +const head = (m) => console.log(`\n\x1b[1m${m}\x1b[0m`); +const note = (m) => console.log(` \x1b[33m·\x1b[0m ${m}`); + +function dSeg(px, pz, ax, az, bx, bz) { + const dx = bx - ax, dz = bz - az, L2 = dx * dx + dz * dz; + if (L2 < EPS) return Math.hypot(px - ax, pz - az); + let t = ((px - ax) * dx + (pz - az) * dz) / L2; + t = Math.max(0, Math.min(1, t)); + return Math.hypot(px - (ax + t * dx), pz - (az + t * dz)); +} +// strictly inside a lot's rotated rectangle (the boundary is not "in someone's yard") +function inLot(px, pz, l) { + const c = Math.cos(l.ry || 0), s = Math.sin(l.ry || 0); + const dx = px - l.x, dz = pz - l.z; + const lx = c * dx - s * dz, lz = s * dx + c * dz; // world→local (inverse of rot-by-ry) + return Math.abs(lx) < l.w / 2 - EPS && Math.abs(lz) < l.d / 2 - EPS; +} +function inPoly(px, pz, poly) { + let inside = false; + for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) { + const [xi, zi] = poly[i], [xj, zj] = poly[j]; + if ((zi > pz) !== (zj > pz) && px < (xj - xi) * (pz - zi) / (zj - zi) + xi) inside = !inside; + } + return inside; +} + +function measure(plan, label) { + const nodeById = new Map(plan.streets.nodes.map((n) => [n.id, n])); + const lotById = new Map(plan.lots.map((l) => [l.id, l])); + const pedBlocks = (plan.blocks || []).filter((b) => b.kind === 'market' || b.kind === 'arcade'); + // sim-style edges — the exact shape _setGraph hands door_snap (A/B resolved, width/kind kept) + const simEdges = plan.streets.edges.map((e) => ({ ...e, A: nodeById.get(e.a), B: nodeById.get(e.b) })); + + const classify = (px, pz) => { + let onVerge = false, onCarr = false, minCentre = Infinity; + for (const e of plan.streets.edges) { + const a = nodeById.get(e.a), b = nodeById.get(e.b); + if (!a || !b) continue; + const d = dSeg(px, pz, a.x, a.z, b.x, b.z); + if (d < minCentre) minCentre = d; + const inner = roadWidth(e) / 2, [vi, vo] = vergeBand(e); + if (d < inner - EPS) onCarr = true; + if (d >= vi - EPS && d <= vo + EPS && vo > vi + EPS) onVerge = true; + } + let insideLot = false; + for (const l of plan.lots) if (inLot(px, pz, l)) { insideLot = true; break; } + const foot = onVerge && !onCarr && !insideLot; + const plaza = !foot && !insideLot && !onCarr && pedBlocks.some((b) => inPoly(px, pz, b.poly)); + const walk = foot || plaza; + const why = walk ? (foot ? 'footpath' : 'plaza') : insideLot ? 'in-a-lot' : onCarr ? 'carriageway' : 'off-verge'; + return { foot, walk, why, minCentre }; + }; + + const out = { town: label, shops: 0, rawFoot: 0, rawWalk: 0, foot: 0, walk: 0, back: 0, + moved: 0, maxMove: 0, brokeBydSnap: 0, fixedBySnap: 0, why: {}, centre: [] }; + for (const s of plan.shops) { + const l = lotById.get(s.lot); if (!l) continue; + out.shops++; + const ry = l.ry || 0, fx = Math.sin(ry), fz = Math.cos(ry), off = l.d / 2 + DOOR_STEP; + const rx = l.x + fx * off, rz = l.z + fz * off; // raw — the shell's derivation + const R = classify(rx, rz); + if (R.foot) out.rawFoot++; + if (R.walk) out.rawWalk++; + const p = snapDoorToFootpath(rx, rz, simEdges); // shipped — what sim.setShops stores + const S = p.moved ? classify(p.x, p.z) : R; + if (p.moved) { + out.moved++; out.maxMove = Math.max(out.maxMove, Math.hypot(p.x - rx, p.z - rz)); + if (R.walk && !S.walk) out.brokeBydSnap++; + if (!R.walk && S.walk) out.fixedBySnap++; + } + if (S.foot) out.foot++; + if (S.walk) out.walk++; else out.why[`${l.use || 'shop'}:${S.why}`] = (out.why[`${l.use || 'shop'}:${S.why}`] || 0) + 1; + const B = classify(l.x - fx * off, l.z - fz * off); // control — the R8–R39 defect point + if (B.walk) out.back++; + out.centre.push(S.minCentre); + } + out.centre.sort((a, b) => a - b); + out.median = out.centre.length ? +out.centre[(out.centre.length / 2) | 0].toFixed(2) : null; + delete out.centre; + const pct = (n) => out.shops ? +(100 * n / out.shops).toFixed(1) : 0; + out.rawFootPct = pct(out.rawFoot); out.rawWalkPct = pct(out.rawWalk); + out.footPct = pct(out.foot); out.walkPct = pct(out.walk); out.backPct = pct(out.back); + out.maxMove = +out.maxMove.toFixed(2); + return out; +} + +head(`DOOR POINT → FOOTPATH (floor ${FLOOR_PCT}% · door step ${DOOR_STEP} m · seed ${SEED})`); +const results = []; +results.push(measure(generatePlan(SEED), `synthetic@${SEED}`)); +for (const town of ['katoomba_real', 'fitzroy_real', 'bowral_real']) { + const cache = JSON.parse(readFileSync(join(TOWNS, `${town}.json`), 'utf8')); + results.push(measure(generatePlanOSM(SEED, town, { cache }), town)); +} + +for (const r of results) { + const whyStr = Object.entries(r.why).map(([k, v]) => `${k}:${v}`).join(' ') || '—'; + note(`${r.town}: raw foot ${r.rawFoot}/${r.shops} (${r.rawFootPct}%) walk ${r.rawWalk} (${r.rawWalkPct}%) → shipped foot ${r.foot} (${r.footPct}%) walk ${r.walk} (${r.walkPct}%)`); + note(` residue [${whyStr}] · snap moved ${r.moved} pt(s) max ${r.maxMove} m (fixed ${r.fixedBySnap}, broke ${r.brokeBydSnap}) · back arm ${r.back}/${r.shops} (${r.backPct}%) · median centreline dist ${r.median} m`); +} + +head('GATE'); +for (const r of results) { + ok(r.walkPct >= FLOOR_PCT, `${r.town}: door point on walkable front ground ${r.walk}/${r.shops} = ${r.walkPct}% (floor ${FLOOR_PCT}%)`); + ok(r.backPct < FLOOR_PCT, `${r.town}: CONTROL — back point scores ${r.backPct}% (must be < ${FLOOR_PCT}% or the classifier is vacuous)`); + ok(r.brokeBydSnap === 0, `${r.town}: FIX-ONLY — snap broke ${r.brokeBydSnap} previously-passing point(s) (must be 0)`); +} + +const ji = process.argv.indexOf('--json'); +if (ji > -1 && process.argv[ji + 1]) { + const { writeFileSync } = await import('node:fs'); + writeFileSync(process.argv[ji + 1], JSON.stringify({ seed: SEED, floorPct: FLOOR_PCT, doorStep: DOOR_STEP, results }, null, 2)); + note(`json → ${process.argv[ji + 1]}`); +} + +console.log(fails ? `\n\x1b[31mRED — ${fails} gate arm(s) failed\x1b[0m` : '\n\x1b[32mGREEN\x1b[0m'); +process.exit(fails ? 1 : 0); diff --git a/web/js/citizens/door_snap.js b/web/js/citizens/door_snap.js new file mode 100644 index 0000000..b3c83d2 --- /dev/null +++ b/web/js/citizens/door_snap.js @@ -0,0 +1,62 @@ +// PROCITY Lane D — R40 §40.5: door-point → footpath correction (pure geometry, no THREE, no rng). +// +// The shell derives each patronage door point as `lot centre + front-normal · (d/2 + 0.6)` +// (web/index.html:433-437, the +sin/+cos side since Lane B's R39 heading fix). That lands ON the +// footpath for almost every shop, but the residue class — lots whose setback or corner geometry +// puts the point a metre or two outside the verge band — left the R8 claim ("peds duck into shops +// they pass") false at the kerb: the ped steered to a point just off the walkable strip. +// +// This module clamps a door point into the footpath band of its NEAREST footpath-bearing street — +// registry.js's published `vergeBand` corridor law, over the same edge objects the sim already +// walks. Graph-only on purpose: the sim never sees lots, and this needs none. +// +// Guard rails (all measured before shipping — tools/qa/door_footpath_check.mjs is the gate): +// • CAP (default 6 m): a point further than this from its band is NOT a kerb miss — it is a +// market stall fronting the market square or an arcade shop fronting the covered lane. Those +// fronts are correct where they are (the square IS their front); dragging one 50 m to a street +// it does not front would re-break the front-door truth this exists to hold. Leave it. +// • MIN_BAND (0.8 m): a `lane` is all carriageway and an `arcade` band can degenerate — an edge +// with no walkable strip can never be a snap target. +// • MARGIN (0.45 m): snapped points sit inside the band, not on the kerb line, so a float wobble +// can't re-classify them. +// • Deterministic: pure function of (point, edges) — same plan → same doors, forever. +// +// Measured on the R39 four (raw → snapped, walkable-front rate): synthetic 95.9→95.9 (its residue +// is stall-vs-stall inside the square, out of this function's reach and over the floor anyway), +// katoomba 98.6→100, fitzroy 99.3→100, bowral 93.3→100 — and the transition check says it fixes 4 +// and breaks 0 corpus-wide. + +import { vergeBand } from '../core/registry.js'; + +const EPS = 1e-6; +export const DOOR_SNAP_CAP = 6; // m — beyond this the point fronts a plaza, not this street +export const DOOR_SNAP_MARGIN = 0.45; // m inside the band edges +export const DOOR_SNAP_MIN_BAND = 0.8; // m — narrower than this is not a walkable strip + +// edges: the sim's prepared edge list — [{ A:{x,z}, B:{x,z}, width, kind, ... }] (vergeBand reads +// width/kind; A/B are the resolved endpoints). Returns { x, z, moved } — the input point (moved: +// false) when it already sits in its nearest band, has no footpath edge to snap to, or is a +// plaza-front beyond the cap. +export function snapDoorToFootpath(x, z, edges, + { cap = DOOR_SNAP_CAP, margin = DOOR_SNAP_MARGIN, minBand = DOOR_SNAP_MIN_BAND } = {}) { + let best = null, bd = Infinity, bqx = 0, bqz = 0; + for (const e of edges) { + const [vi, vo] = vergeBand(e); + if (vo - vi < minBand) continue; // no walkable strip on this edge + const ax = e.A.x, az = e.A.z, dx = e.B.x - ax, dz = e.B.z - az; + const L2 = dx * dx + dz * dz; + let t = L2 < EPS ? 0 : ((x - ax) * dx + (z - az) * dz) / L2; + t = t < 0 ? 0 : t > 1 ? 1 : t; + const qx = ax + t * dx, qz = az + t * dz; + const d = Math.hypot(x - qx, z - qz); + if (d < bd) { bd = d; best = e; bqx = qx; bqz = qz; } + } + if (!best || bd < EPS) return { x, z, moved: false }; // no footpath in town / on the centreline + const [vi, vo] = vergeBand(best); + const m = Math.min(margin, (vo - vi) / 2); + const target = Math.max(vi + m, Math.min(vo - m, bd)); // clamp into [kerb+m, corridor-edge−m] + const mv = Math.abs(target - bd); + if (mv < EPS || mv > cap) return { x, z, moved: false }; // already in band · or a plaza front + const ux = (x - bqx) / bd, uz = (z - bqz) / bd; // outward from the centreline + return { x: bqx + ux * target, z: bqz + uz * target, moved: true }; +} diff --git a/web/js/citizens/sim.js b/web/js/citizens/sim.js index 6b9eccf..a2cac9e 100644 --- a/web/js/citizens/sim.js +++ b/web/js/citizens/sim.js @@ -16,6 +16,7 @@ import { rng, seedFor } from '../core/prng.js'; import { pickRig, makeActor } from './rigs.js'; import { makePlaceholder } from './placeholder.js'; import { bakeImpostorAtlas, ImpostorLayer } from './impostor.js'; +import { snapDoorToFootpath } from './door_snap.js'; // ---- tuning (CITY_SPEC budgets) ---- const NEAR_ENTER = 24, NEAR_EXIT = 27; // m, hysteresis band for rig↔impostor @@ -343,7 +344,26 @@ export class CitizenSim { // ---- R8 patronage + weather ---- // shell feeds door points + hours per chunk (computed from the plan — sim stays graph-only). // map: chunkKey → [{ x, z, hours:[open,close] }]. Without it, patronage is inert. - setShops(shopsByChunk) { this.shopsByChunk = shopsByChunk; } + // [Lane D R40 §40.5] Each door point is clamped into the footpath band of its nearest street + // (door_snap.js — registry's vergeBand over our own edges, capped at 6 m so plaza-front stalls + // stay put). The R8 claim is "peds duck into shops they pass"; the residue after B's R39 heading + // fix was door points a metre or two off the walkable strip — peds steering to the kerb gutter or + // a corner sliver. Points keep the shell's chunk keys (moves ≤ cap ≪ CHUNK; patronage is already + // chunk-blind by covenant, sim.js:401). Gated by tools/qa/door_footpath_check.mjs — ≥95% of door + // points on walkable front ground on all four measured towns, fix-only (breaks 0). + setShops(shopsByChunk) { + if (shopsByChunk && this.edges) { + const snapped = new Map(); + for (const [key, list] of shopsByChunk) { + snapped.set(key, list.map((s) => { + const p = snapDoorToFootpath(s.x, s.z, this.edges); + return p.moved ? { ...s, x: p.x, z: p.z } : s; + })); + } + shopsByChunk = snapped; + } + this.shopsByChunk = shopsByChunk; + } setPatronage(on) { this.patronageOn = !!on; } // Gig-night surge (?gigs=1): while a gig is on, F points patronage at the venue so the street // converges on the pub — it pulls from further (GIG_RANGE) and ducks in harder (GIG_SURGE). Occupants