From dc49c55073523867330acbaed47e5254233be481 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 19 Jun 2026 05:25:55 -0700 Subject: [PATCH 001/140] chore: bump develop snapshot target to 4.0.6 (#3229) * chore: bump develop snapshot target to 4.0.6 * chore: trigger CI on auto-bump PR Empty commit to fire pull_request:synchronize so the develop required checks run (the bot-created auto-bump PR gets no CI under GITHUB_TOKEN). Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: Peter Amiri --------- Signed-off-by: Peter Amiri Co-authored-by: bpamiri <180555+bpamiri@users.noreply.github.com> Co-authored-by: Peter Amiri Co-authored-by: Claude Opus 4.8 (1M context) --- wheels.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wheels.json b/wheels.json index 0ab4e69413..3a813debcb 100644 --- a/wheels.json +++ b/wheels.json @@ -1,7 +1,7 @@ { "$schema": "https://wheels.dev/schema/wheels.json/v1.json", "name": "Wheels.fw", - "version": "4.0.5", + "version": "4.0.6", "description": "Wheels — CFML MVC framework", "homepage": "https://wheels.dev", "documentation": "https://wheels.dev/guides/", From 5ac5e8ab53c19f788c289991232f2202b7f5c3bc Mon Sep 17 00:00:00 2001 From: Peter Amiri Date: Fri, 19 Jun 2026 05:49:38 -0700 Subject: [PATCH 002/140] ci: gate yum + apt-arm64 install-smoke (hard-fail) now that 4.0.5 fixes them (#3230) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both legs were continue-on-error because 4.0.4 couldn't install on those vectors (no arm64 apt index; RHEL Java-detection bug). 4.0.5 ships arch-independent packages + the Java-detection fix, and both are verified live (arm64 `apt install wheels` → 4.0.5; Rocky 9 rpm starts). Remove continue-on-error so a future regression on either vector blocks instead of passing silently. Signed-off-by: Peter Amiri Co-authored-by: Peter Amiri Co-authored-by: Claude Opus 4.8 (1M context) --- .../workflows/distribution-install-smoke.yml | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/.github/workflows/distribution-install-smoke.yml b/.github/workflows/distribution-install-smoke.yml index 08d312de8c..76b5269dfd 100644 --- a/.github/workflows/distribution-install-smoke.yml +++ b/.github/workflows/distribution-install-smoke.yml @@ -166,12 +166,10 @@ jobs: name: "apt (${{ matrix.arch }})" runs-on: ${{ matrix.runner }} timeout-minutes: 15 - # arm64 stable is allowed to fail for now: the stable arm64 Packages index - # is currently empty (the per-channel clobber bug, #3218), so `apt install` - # 404s on arm64. continue-on-error surfaces it (annotation + neutral result) - # without blocking the suite. Flip to a hard failure once the arm64 index is - # repaired. - continue-on-error: ${{ matrix.arch == 'arm64' }} + # arm64 now gates (hard-fail): as of 4.0.5 the Linux packages are + # architecture-independent (`all` deb) and apt-wheels generates an arm64 + # index, so `apt install wheels` works on arm64 (live-verified). A regression + # on either arch should block. strategy: fail-fast: false matrix: @@ -221,15 +219,9 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 15 # RHEL-family, dnf4 — matches the documented `dnf config-manager --add-repo` - # path. The release ships an x86_64 rpm, which this amd64 container matches. - # - # continue-on-error for now: the rpm installs cleanly and pulls in - # java-21-openjdk-headless, but `wheels --version` reports "cannot find a - # Java 21 runtime" — the wrapper's Java detection doesn't locate Rocky 9's - # headless JRE (the headless package registers no /usr/bin/java alternative). - # That's a real yum-vector packaging bug to fix in the rpm/wrapper; surfaced - # here, non-blocking until then. Flip to a hard failure once fixed. - continue-on-error: true + # path. The release ships a noarch rpm; dnf serves it on this amd64 container. + # Gates (hard-fail): as of 4.0.5 the rpm's wrapper resolves the RHEL/Fedora + # Java-21 layout, so `wheels --version` works on Rocky 9 (was the 4.0.4 bug). container: image: rockylinux:9 env: From eb73cb636e02ddb2964df1a1382c99bde2d701a9 Mon Sep 17 00:00:00 2001 From: Peter Amiri Date: Fri, 19 Jun 2026 06:57:35 -0700 Subject: [PATCH 003/140] docs(web/blog): announce Wheels 4.0.5 (with 4.0.4 hardening) (#3231) Covers the 4.0.4 hardening pass (security, performance, deploy, cross-engine) and the 4.0.5 install-anywhere packaging (arm64 Linux + daily install-smoke CI). 4.0.4 was superseded by 4.0.5 the same day, so this single post covers both. Signed-off-by: Peter Amiri Co-authored-by: Peter Amiri Co-authored-by: Claude Opus 4.8 --- .../blog/posts/wheels-4-0-5-released.md | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 web/content/blog/posts/wheels-4-0-5-released.md diff --git a/web/content/blog/posts/wheels-4-0-5-released.md b/web/content/blog/posts/wheels-4-0-5-released.md new file mode 100644 index 0000000000..0ba3821a7d --- /dev/null +++ b/web/content/blog/posts/wheels-4-0-5-released.md @@ -0,0 +1,110 @@ +--- +title: 'Wheels 4.0.5: a hardening release — 100+ fixes across security, performance, and deploy, now installable anywhere' +slug: wheels-4-0-5-released +publishedAt: '2026-06-19T13:30:00.000Z' +updatedAt: '2026-06-19T13:30:00.000Z' +author: Peter Amiri +tags: + - wheels-4 + - release-notes + - frameworks +categories: + - Releases +excerpt: >- + Wheels 4.0.5 is out, and together with 4.0.4 it's one of the most substantial + hardening passes on the 4.0 line — 100+ changes spanning security (open-redirect + and info-disclosure fixes, fail-closed gates, SQL-surface tightening), warm-path + performance, a much tougher `wheels deploy`, and Adobe CF / BoxLang cross-engine + fixes. 4.0.5 then makes the whole thing installable the same way on every major + platform — Homebrew, Scoop, apt, dnf — including arm64 Linux, verified daily. +--- + +Wheels 4.0.5 is out — and the story is really two releases. **4.0.4 was a large hardening pass (100+ commits across security, performance, and deploy), and 4.0.5 makes that work installable the same way on every major platform, including arm64 Linux.** 4.0.4 went out and was superseded by 4.0.5 the same day, before any announcement, so this post covers both. + +## Security hardening + +4.0.4 closed a batch of real security gaps in the framework's request surface: + +- **Open-redirect hardening.** `$isSafeRedirectUrl()` now normalizes input per WHATWG URL parsing (stripping embedded tab/CR/LF) before it classifies a redirect, and rejects backslash and schemeless-authority tricks (`/\evil.com`, `\/evil.com`, `https:/evil.com`). +- **Information disclosure.** The HTML and JSON branches of `/wheels/info` no longer render secrets — `csrfCookieEncryptionSecretKey` is no longer printed in plaintext, and the JSON branch no longer dumps the full application metadata (datasource credentials, ORM settings). +- **Fail-closed by default.** The production block on `/wheels/*` dev-UI handlers is now a fail-closed allowlist, and the URL reload gate refuses to act unless a non-empty `reloadPassword` is configured — `?reload=true` with no password set is denied, not allowed. +- **Path traversal.** `$getRequestFormat` rejects non-alphanumeric `url.format` values, closing a local-file-inclusion vector through the error-template include. +- **SQL surface.** Scope-handler arguments and `findAll(select=)` items are tightened (values like `Union Pacific` round-trip unchanged while genuinely suspicious `select` items get flagged), and `updateAll(include=)` join parsing no longer splits on a bare `ON` token inside an identifier. +- **Proxy trust.** A new `trustProxyHeaders` setting (default `false`) governs whether `X-Forwarded-*` is believed — `isSecure()`, maintenance-mode IP exceptions, and the reload rate-limit key all stop trusting client-supplied forwarded headers unless you opt in. +- **Deploy secrets** are redacted from remote-execution failure messages and sent over SSH stdin (`docker login --password-stdin`) so they never surface in output. + +## Performance + +Ten warm-path optimizations, focused on the work every request repeats: + +- `model()` and `controller()` take a **lock-free fast path** on cache hits instead of a reflective double-checked lock. +- `URLFor()` route lookups are memoized in application scope (with negative caching), and database column metadata is cached per datasource+table. +- The per-request action-dispatch gate is now an **O(1)** lookup instead of an O(n) list scan, the HTTP status-code map and partial column lists are memoized instead of rebuilt per render, and mixin-free apps no longer pay for a throwaway `wheels.Plugins` instance on every request. + +## `wheels deploy` grew up + +The Kamal-port deploy command got roughly twenty fixes hardening it for real fleets: + +- Works on **fresh hosts** now (the proxy boot guard never reached `boot()`), acquires its fleet lock **all-or-nothing**, bounds secret resolution with a timeout, and writes an on-server audit trail. +- Correct `rollback --destination` overlay handling, proxy traffic built from `proxy.app_port`, env-file secret delivery to app and accessory containers, stricter IPv6 host validation, and same-version redeploys that no longer collide on the container name. + +## Cross-engine fixes + +- **Adobe ColdFusion**: authorized reloads returned HTTP 500 on case-sensitive filesystems — i.e. every stock Linux Adobe deployment — and URL environment switches into production/maintenance silently reverted. Both fixed, along with a Lucee-only `cfabort;` that 500'd `GET /` on Adobe. +- **BoxLang**: hardened null handling across the router, dispatcher, and error handler for BoxLang's stricter semantics. +- **Oracle / SQL Server**: identity retrieval after INSERT now uses the JDBC driver's generated keys (or session-scoped sequence values) instead of the race-prone `@@IDENTITY` / `MAX(ROWID)` fallbacks. + +## New capabilities + +- **`wheels jobs work`** — a long-lived background-job worker loop (`--queue`, `--interval`, `--max-jobs`), plus `wheels jobs status`. +- **`wheels upgrade apply`** swaps an app's `vendor/wheels/` for the framework bundled in the installed CLI, and **`wheels upgrade check --strict`** escalates advisory findings to a hard CI-gating failure. +- A `subpath` setting for subfolder-mounted apps, a `/up` liveness/warm-up endpoint in scaffolded apps (used by the deploy healthcheck), and per-tool MCP input schemas. + +…and roughly **eighty fixes** in total — routing `scope()`/`namespace()` callbacks, named capture groups, CORS duplicate-header arbitration, multi-node `RateLimiter` storage, honest `migrate`/`seed`/`test` exit codes and output, `hasMany` shortcut associations, and more. The complete list is in the [changelog](https://github.com/wheels-dev/wheels/blob/main/CHANGELOG.md). + +## Now install it anywhere — including arm64 + +4.0.5's own headline is distribution. The `wheels` CLI installs the same way on every major platform: + +```bash +# macOS / Linux — Homebrew +brew install wheels-dev/wheels/wheels + +# Windows — Scoop +scoop bucket add wheels https://github.com/wheels-dev/scoop-wheels +scoop install wheels + +# Debian / Ubuntu — apt +curl -fsSL https://apt.wheels.dev/wheels.gpg | sudo gpg --dearmor -o /usr/share/keyrings/wheels.gpg +echo "deb [signed-by=/usr/share/keyrings/wheels.gpg] https://apt.wheels.dev stable main" | sudo tee /etc/apt/sources.list.d/wheels.list +sudo apt update && sudo apt install wheels + +# RHEL / Fedora / Rocky / Alma — dnf +sudo dnf config-manager --add-repo https://yum.wheels.dev/wheels.repo +sudo dnf install wheels +``` + +The Linux `.deb`/`.rpm` are now **architecture-independent** — the CLI launches through a portable `java -jar` runner — so `apt install` / `dnf install` work on **arm64 (aarch64)** as well as x86_64: Raspberry Pi, AWS Graviton, Ampere, arm64 Linux VMs on Apple silicon. 4.0.5 also fixes a bug where the RHEL/Fedora package couldn't locate its Java runtime, so `dnf install wheels` now works out of the box on Rocky, Alma, and Fedora. Java 21 is pulled in automatically on every channel. + +And we now **verify all four channels every day**: a CI job installs the published CLI through Homebrew, Scoop, apt, and yum on real macOS / Windows / Ubuntu / Rocky runners (amd64 *and* arm64) and asserts `wheels --version` matches the release — so a broken `brew install wheels` becomes our problem before it becomes yours. + +## A note on versions + +If you see a **4.0.4** tag, that's expected: 4.0.4 shipped the hardening work above but its Linux packages weren't yet architecture-independent, so 4.0.5 superseded it the same day. Everything in 4.0.4 is in 4.0.5 — just install or upgrade to **4.0.5**. + +## Upgrading + +```bash +brew upgrade wheels # Homebrew +scoop update wheels # Scoop +sudo apt update && sudo apt install --only-upgrade wheels # apt +sudo dnf upgrade wheels # dnf +``` + +Then confirm: + +```bash +wheels --version # Wheels Version: 4.0.5 +``` + +The framework itself lives in `vendor/wheels/` in your app — run `wheels upgrade check` to see anything worth adjusting before you bump a project, or `wheels upgrade apply` to swap it. Happy shipping. From 901e6ddc5faf5d475ffddc5151679c1764563793 Mon Sep 17 00:00:00 2001 From: "wheels-bot[bot]" <283220952+wheels-bot[bot]@users.noreply.github.com> Date: Fri, 19 Jun 2026 14:04:46 +0000 Subject: [PATCH 004/140] chore(docs): auto-refresh blog visual baseline after content change [skip ci] Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- web/tests/visual-baselines/blog.png | Bin 118038 -> 126496 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/web/tests/visual-baselines/blog.png b/web/tests/visual-baselines/blog.png index b122a1c1b446b383b5fb92fddc476d051d969a22..aea03024b5e01936a661ec64dfcfe191b2fe993e 100644 GIT binary patch literal 126496 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�+~Kynd@!hA9<6w`by^TtM3ik zsMz#bI}%fH=j$Ib61-?)X>L3ns#?+lV`TeDcYf3IV<3zpz!(vc?+7-rL^_=-6i%P- zt++=s%x|>zyi%<*z@kY@(`=eqe3iSJ4NI-1-y^oOUER$3SGPVLxM}CO!kGlQvLQrH z|CL`f^bVva7`(*!`~H4BdQC8fcApRpWE84Dx{9m=WXiqMJ~c)>t-~m*l2GjZfK2|I zu=e~I(Q2nY+MR(&a{Lgm;6mFYU$8EJD(%{PFmGjQ+~-UzGX=}+RwZFc%^w*-X7a>R zQRRf1Bd?|Gat|9bgY@zGHSH0TE91Bpm*!~c#>Y-%y3)%%y0i%^gJdDqelTF3{dJ=y$WS;uav8Vngw`*@h_*O^fw{;s93u6K4aCwLEYifkpbbD*gnhWQB z^i-}g8OG?|RK$@?&O?hf+t)1piLPu|xHl(YdXuth&AU( z8@Ivw;Y1~hG6R<FI1ouM=mFvVGV+Q(!RJ`i3u{zO* zdfQCv71{Y6CF>oHAE{&coYGBjlCrib^-LP);g}y?*)mNWm*~O<)DTeub}QIZWS8mF z97n;CGdo+U1};l2^GJUPOvFSOU13VZlcwUMf2Em2m;q$nTN!u_X?ZczT0WWRv%T?%)$kkU}+89*$UIdaU zbg^Q#@S~pRbbau&%YnM-$#}aLIw`@Z70d5byFlYI&kv%Gzm~)P)&fjZGMG=Zt2g8A z2bNre=`{6e9wJ20jTOfXOZ=~b^&uJIWIL>^`!UO9|GYlFR9IOh%5uq?ZvsCUta7Rs zh0HeFpj)hbDyb=7zX{1H>OWkXK_OJuoVVdlIJz((|Lx#^MNcU;a?BMmuw86lW3}d_ z8kP@kbX8h>;W{2yN%%GCVOySVUSTUJE|zgrI&Zno?};_MqnS z!T?9|;}Kb;MI1ATUc-51qaKNx9VXrAFH{Yon_m2rUEQR&IhU_jiZhT+IKZkDs!&#E z#eyCg{DLEHrocL_WkTnagnh^HC1G2v9&FGbyOj&Gpw3Iut&_7ms&|{v_El!C#acUY zhn}_K>*sj-}Ts<%D0(4SgTn8?@U$A81>>F%a5|(56`o-phpy?tyr5IOIE#!?^ z!hDaBpAbk5+phbireeIXQrP~rS zCsVwaxKHqyfIB5Uk9=n@epnyToHO2l>rkn(C;~N7s1TRtj0(UryR6%nMm$IbiYT>R%-2$lkQRk7PbC$zAmg(WoO5dA3rgPDE@nv zaT7F+qL~X9{YlQaIl+?OuVrs8Gh}$P5~yR+i|XlSnQi1~>df0*$C&mCr;sc~a#YXL z$l%WI$|7bsF_%DiCcTJ&$?=07(`r^;XM^UU>8YH4)xzz#(31Yp*d+0tV+)b49}LDf z{VG$RtWDXV%M>SDt&Rw;4*YB9p(Z^pr95AqfsgA0DYP{{k@I2R_DgR&t+AXjIax zvnQa!x7V@%WjjRph?qLS+VhnoD@24P@uOn&gA=)~byZW~RQz<>$^_hM?^$7JEX!1B zz4n@vT>+_jw;qu1&6_U5_g-)%gdZj2P+YV7Os=-?v}isyG|gJn2*YT5&u(g=wH`8>IY03IWtFQvIqWSqv6v zb2qilqp!J?k*-S_U^85AWIq(@ap!NU4wF|&;1og?H}JG0$U?}wv`!MoversZX`tfl zy>(oNkT$5>Ek)dLlj61?bD3I>mxr3z>`)gxGz}6RXIln{FeNYAvptzC5=z-788e(9 za0qmfw{bTeRGs~_89)1k_Sj9E8S$|_lb%jjcD^&dwh^(npq<0k;oz8kGh9-CoN!fF zpg-R=47dQ7gt~l^lXL zRiXWg_)a{GIDi))!gJi)Gk%Z9!^&Gz>$-M}~<-SU=)OmU%9uA_8Y`{yVLOoow)AwX1dS@tdeE4h%4yo$PBf&-s-0D7*28VTK z5V}?n5-p9sK2_CxI+`+!9kE=H30HyD{W zO|BrukFw&^kR_y%K4E%?6^k&$Bng1{EyTd%(g55R7g`NaeA-*FdYdYQOq#*Z`t!#} zxzvFaJF&%bMF|ll_lgc2VA))bl&XzUk#NL%mBP|$g0OmaWnvZyU1F@tr0QrEXcnlZMywPa%9j%TEx9=W_w+Pul-3kucz+YOC}Tm*q>M~9F0rrCE6?$p z0-&sHE?Sq*fhsjELE6knt9!S`x=Oc1^bNiYz@tljG{}?@t?}j0jbw@1@O3f3vOYt) z`Xl&4H$V`r9A*(b?AlDPqD)D)C#4in&=Uf1sIOt$sKLy`5x};ldo?fr-DNe`s1li+F~Z{6GH)eyWY(gm;)_C!0NsN;ytUYCvLw9xU(Xz@hq60Q zgUn!))|>W!=mH-C5)};V{lWrjt3o{}v>fdan1A9`pf5y@pcl;t!nPn zEy*m1|N2hB-l4|xJ(e+Pq0}ESalM@qaS|-3XG1l|hy<#zMFMxZBE=_atfKP$Y2$}-$|&oO_+CVe zf>o5`UHreCw2ILu>E`ciMr%|ETNX#9HzcS0<)Nof&Ryj;52pr@|5h?kXxVz)GU4?w zM##%2exMR|oW$~@q@**vKFZD;Qe8ov2!63`xmJF{*%p~(MVkL|;rmbO_`U1xdZ>(` zG9H}{J{mU1^wK*`FvLFgOS@J|3v3SgjmgmX@#oB%iwZhT%@N+HUGrx(?Wh}csLobc z#SQ~QV@h{RSJG65-}(j$g&_xW|M72^9%^!mOS5>3%AjyoY=-R1;nUNuJw$h9UbEGH zdmdsBtOXtAxEz_R7+l6JaAd~Wru1H+Ul?sre1$NzP@bBVmcUN4!IPj^T0x~djbj2I zt|KQZu;Od26(!M?n`PR$6m=DkOx3NxXLHxLBXi_USTNxNBe2XDK&A@D;{HS;-pYGq z`+)Ki9!%=0LO6G43Sw6onTox~)q%_R?$YD$D;t#wH1tRCN0sBw_*eMdJI2&+r}Mxg zE@j^d5NBb-l<0@Y~OGm8g-8R;*i= z7Omn+vC3k*X&&H?l5BzIaVHCU@(zu>M%|`wr@L2(N_{4Q%iL`F;{GknG0WJ3cd5Q5 zS`;Ks-Nk%{&I`mTqk?lPa#3kV!G}Ug4)uXj*}8IMVD!SnFpYc@RpiMW*bE1=6h-CHg2J@X5VP zY2+2~J8Wkmv9tPxEbFQX&<=#H>{?n=ZSaE)ClZU-p>e?%>n!*#jTy@MlT2fu99Zo5 zvm*OgS}O*nq>pI42~}j6yjz2p4*E62iOzy!Iq=xFEXK+Y-=+nwJOd2{?hF}a{hjRE z_$FOk59n^9#m z*=D(XG=7URNB;)!jzwFN?I1^WphJ#IVDp79Ixg^GG|=5XfGJLna=S;J8Gpi#1QSLK zZSUYMW7B?}zgu>hN`O_nwkeGQ?DzJ&aFvzd0M+w9QpmAU#OQ8rP${QJtw@)g)C0>c z7qE|~%pS}*TD+ZTE%Ary=^yPLPHz1iW3K0d8AWJM14yIT#reESn!Kw~sp9Er1?sK` zmg$_+1|=&5V~Vx=-$fy`0^sSNvTZ3oDB44k8a{5SmHM7zd)^+C;>&U_^Gy7(oo!?` zOgLe|m&Cm7*1}WJr?Fz03XfEcsM79Kfnup}x$}3h!Z$g4$J**7(jh*n!UulF{CoQ? z2W3^8`FvIVCvAFQjsm+6k$czW*CdOkTH!$0AjqaPh&nuHJj;nUvRJ#JSgXTf0TnKY zzTa>PY<8ksxB*zwTx03Z~Iaw9{`fJ6|<&^!2DRYq;hl%NBv2EQ)pBoqq*UW zhKL~(D_=`?`=QNp=f6eT)uk@e=ms)ng}TB^?5whk-~ct(VOVG!Vk=)^*PqoY%yTVa(BScyV)|Ev?m7{r9>>Q9zVq!UgZ|mdL1HXIBkGzD%X2#LmF;SJr2y zNrF*pvEHM7&I*5uZlxls;zA=o}$W3Zqm@{gY799;uo+%a_M(;;&J#(VoAV>LX3(7xG#-79kToe8I29$l7EH9 z%)Ra=heNIzF7Znk2Ae~a2ZQ9~-Sd`+1e53LC-AhnQ;qsbv{KrS?VMk&C~^vC#|3o< z&h3B^gL&#Y${4pQRLrI3aSiTguKME~E)$OIcu@>IlvL@2Sqe&&I*x(HtVU@L+OoOK zR`u(lOU^eZeZ#I<{KV#CW*2+oGTh2!8T2UJ4VAv|8s9ojejL~gpwSSv6W^Yk!B^`IYL7ElYg)4FA@?I6R#JqwUb%rHx zTL~q($5*Z#@>q)!F0|yUaq~IxlMip%ra)k|9YV(g6EUgL%!1!y|H*r*Bto?zZ86D% zMcu?UUqwF&B%AI?;w_#byk=Oj%NmkcwXlHVbxsQ7&=hJFKK)USJHRHJ`Y|%FYsAF* zOBEe8)2!4y9I8TFGoYFvGiBQxZhymcja|2xNYSZCES5h63vc zc1dqYCNsVb#Vi;3q}37cD)CuztnsJMPPTsfg{4d(>&R+(H1IaLIe7u=+NL#P@#tmk z``?m!5exdoQ*J?gag|0cDfRp0xa%vWhjj0XJ=O{@hWbQlNqON5FTAao9`fJUH_^3s z7-mcrMb9aZW|5=*8OmF_XvOtvv~gz0%L?=#GOBgavZpr2J{nG|5$hyP>zlUp(gyzJ z%Nuq5_3^8Rbgwi{(}^Dmaf3FKSdqavqh8S35uXf{qYWU5k242Y0}Ia(%9k(w^)~$$ z5MwSD&8Y$XhLLrP7u5Em`;FmruF+esnZ4D1oZ(shrOV}`b#92t8q5>d@T>%slfq^Qr0EYecZ zmz&*p7;-y6W5?th9aR6*{mridpU4@*S!MB*jcD@@s7~=gEh(+I8Au$_bC523%~Qw zM!!W>kAraC-=|b-Kt9$y>m@^4us2?elBd2;o8S5;ipjIm42S`&ofSWE{yE7r(UN zv*ttkf$k+OYG?O!`$v=GpiKzvABR47ib=t+uVdjeKcfGBh?=pS)my7&uib6UAOz_; zal*Q5*Bb1lFX0#d(ZzM7(gq@1(P*td*#RZjd^k@-@np3N9nX6OxGxG%QziZu5@)PNOz5iJkxb{r{FZ8F3Jyj z4-<*GA(9aynhm9sG~k&IFWV&Ga}Ybq!)IZ!gX0KH%Y}C1tC;45dWsu*9G|UmCb{=vQPSd5mE9QThwiQuG1EZ z?yPU9+KgA59j=G*ky>ss6aR^V16yuq^}guQ!iemo*xhmj1#A0x@5pHt5xOoR6D{DD zd%Ki>;=`3F<65}8V*4CKQZUNXkTX$cwj)vRb3hClsB&FfkWx^!6?4JNRL!P*f_a3& zJwC={qjcd9o@CO(Xz@`2nAWDO`qks3H9}wX#ZX2PfZuEXDk)3b8P9w!k(6YVbw{Ti z=H68$!FMZJXfP&YxsM5mQ#;p%D+r(N+4XytYV^!4@W zeA`$><1O5q&2I|p8oaI(^#rmF1fjaaVk;A?ibpbRFr~eJk2@y2Pgrl>z`yH=4hb;i zi+ne&fwljw;~#Q8>?dTxP;9Wx)2D$JhjEl{(7z|&-2M3b4*5-&;7>VCthQ1W?)sQv zE39Kh&_8mZ<0ddep!Rc9oBzJVuHyRl@&CE;%_Q-U4@m$04*NJm{l7{d?|;zd6v-7(k+g(MpIs z7lLHO#2}BAXwT0n(7mVHKWBe*?&f?Ly8xOwcvJWl2)~{I$ofja`SD%}n(IBEH=f>0bXpL$F##Fj?TgMa2U$`p=+0FU;|V6HOPwhp}tB7 z<@H(cU}@)ri`Gwu`GJZ-xi;`1D8F;`WqPv9HUTZ-|gv`*?lswFOe^h-8lQy@(M9uD87&K*69MG~N5Y;YK1c z)z>*Hq#$B%s4w>m)9s0XF9ZyHo}sY0jl+^E4$AVSYWaG<9Yy5x+?RY*-N+vdqr!oK zogl~m`QL9&m|^U8KLx&9oB%A|pmj*4t6t`wX~!j<>$46Te`ktz80FG=&c_i>fk)Wy z@4febyr_j99Pr=G5gRUUJWoOIY$r!{t63v);oK)y&cDthWI@F)YAqKrh)FXarUzV` zgX*CIgNsx2L|^aLs`y{7@&=U0Sbblyfu8#hIa@(xolvi9Mlavjye+h{jp{1uM|)f|EbQ1m5EOap-7bbK2D*eqFqWCrYrDe!1xF-7yVP zEIl&qxCb#dw%;u=k|y0>vSvLCBnMG=rdRo@2wY2gpGN8LUy4J67@tA-0@DJIhu~(@ zj+@=6;H?zs4THXQ5-w}ax&U-~0r4Ey^9Ex3(&g*yll?k*;TeeP`v}T>5c{1M_-WVQ z_ti3>G4qkI^+-|U=6}GCt(bPdD1NPGfnPfx*Yk?_O`v^w4reJ{+c4ULEs^&iRkF3u zX$7$<`o`Sr{+O@tf)-I9YUhx_(@+Jm0A%iux!1sr+DR)A5jqEb1e4L=)3D#!`d&9f zs~`5!lC4aM$ZYspFCRJ|Y6ZOQO>XO?O7Y#n;wQBrVjnQit2IO!<~woU55K|U)N`L! z=*q`Cc}&~#FuAo51|De4gxYNN!xQt}CIaAyR9>dF&}@CGy4F0Lz@e3PPq1s=?g>E8 zW&*U(1a7yn-%rTyZefTML5BthmA~>nsojLe;co>o4m!S5t^CVLAk8wuA`0TMQY639aCSg zGT|?%gb!Wfvge9l2z3`8_lbSjZpiZ&xcweL38KRFH~zvT8|Y799)0Fme7Gx9&a zQhiX@8R`Q8U#A8JuF(W8r&v2HJx?xXe4B4fLwe|u|GOamYW<|~cD<(}snhc%>SUqJ zm)C7KB+5J4<07E`00-YQOz@`9e&3A1Op`4WrTT!U}VRs|%?L32YR%50w zjgDLNOe z@L;;K5RZmY3iPP;FPO&mRk^o$`}8on$nbON8&Ub*;iO+*juwF{c)kJ~Nx)+(peL(! z;>CTm0*$W^<*}5r6Utd6AcnB#`#c3Na0mVCDzIstewVQ+-mv?-_V!x{%6-%?U74<> zSV!ltOeM&aw0=Hn@0JNdS_4HI#f92K6+GU}h5dv`zSXVyw({YpdoAI0t^zGZ$K|@!X65`T+Mvaw+%XWmcYM z8#Kmq-s$dp-NBmtaNAhbzB)4`F}(DyRsocHb+36$|P%gL#`+i@M2 zr-QFm8o6;xTwEL2GBH($eog3RWM<(KYytAv^W|tzJ^;EZKb@bx@CEI?U(u!ax@%ph z(B}FsUUl9g?}j=*sx1v;aBf>(1KlGZfaO$>y`PY-wXwIy^$RppuaDe!$IcG2`eegZ ze0N#UXQh*_t!jB3&HbMbTCN+i%y(<*x)k1bp2Tk05Z*z3#DCKlJx0MdZK4k(8kq3w zPebojPMR$lJ8sPu5}Oh~jL`cijadpjOl-Vdd$JP~`#k@?ifktK??}9#aBLPA_*P)^ z5q@1Xw|fET>)npCQF$;8ea3VCJM5YaPt^1TImnVd;Ge7=&vRSwjv{Ki(-L@i7&SuI zSv&in9`<)A6 zhG?6XAZX(Q(gv5^&CRf(DuqPhG_kiGR9@HTft}@u(dz=@`}$xxyH=6^pQYJ`unE4Y z`Td>u=HeE-FH!UToW!=MjrU7^Qr45)kDH9IDX)BX=kJjdJYNs0*kAI$qeFe5#`_A; zEnz-BtE0|!Dq`PFh^6lxf%qDp#OHhdz}DLe(*XQbpmY^~`{VUKQc4QZOSQNzbV8kx z|HbcX3WLspPut@S^obL+(CT+rkDcXvCcfYki&b+PK+NZQDh|Rv|7xc4cCc_h8fo;M;JuyNwtcMZy!V6N-fTPvmpQWD-gQ3qGm19f-4S<0c{13a0=AnE ze6*L>^T-W>udTE|Xm=PF10fRq%jRRAyieVQ0>fD|)Yax}BrJ4Lpw#V!Y5{S>`q!RwDLHqRw-H08*r^ zmu0Zg{`v3EI}`!`QwzA`zvy^H`&1T9{QT?e{YH9L*dtQXISsf4AzJnFjQ3zaMO5obXO-QNMl)0P6WHkaa%zzOFy2 zcX%8@A9(bCyMx39m~Ybx9(EUW?^}yHFR#(~mY-f_9jn0t&~7yU`)7DyTGewYQ(iT< z{7qY!hx&r8kAc+-h;hPKO~d+i{R|4h*e44Z-h(7ny=+pEe+2Qr9Dw+B9;aV3r$Eo$ zJ9jbD_mhYBmcW!r?5XehlSh>A)ehhzYS)Mem6@o*zn_JIr|~>pG{32oOJeozGXMB=pnFWzWb-h1v?1ezWp!g*XhHD zu76Lxnf&tkzhupy;y>T~cX|4MMk@OMe~g)S>0BaDYxsYz#xLkU;)yO z!lNNV%$f^JzaFExw_BQZP(C??OqRd&O~wcdA-E9pb32V_%9*(u;b>}kBFiIOoLg?)`2qlY zj)<5HQ#ugEYsw}e=lvxq* zZR>h}EFbXeR76olDGEwXr3QsAOG)11lKZ2lAyQ`nTu^y^#*XEg@J4r6dsgE$X+fed z^UCWHL@`t0ART~qTOE_Jl4*|*7{SvFZP4>UW$_$BUj$%8P}FAGy?g8}F{y{%I@CsS zXCY^B-QH)@$0vg6GXny+f+T4{{%dM!zEs$aF4Rj8B1Y754c)NDwX~I&EK^9VAfeyxDkqg#$C*3TsLGx12evOJA@vC z7a%1Aa0FXjSE;Y$p336dlg(Gd*)tunP*AZKvo=iIXSAtyk^%9vN4K8A$vf< z+(q?|kYD2`E0gFhi}+oq(l*H*R@pW+D~ElE2KP=h(k1j%<6`L>Z(VRrew9fi0Mtmv zF0dHU_h&9Y6wTtI(8ZPe(94$9ms{m=ZY#%x-Nulu>F5MSW+nqmG;f7X9)`4n5Rr7y z(9&BpSi7YPpR}nWi5M!s^LiM#P|WDfsaOP@Y?|qdp5*iZjAQCWjs6~A71f!_gE4an zO(?%e8sSD%ciu3E~G>N;xF9vkVe601x=2AA0?Ue06G#6sr z8hBBddU2hQ>Gb5Kf;;nD+(9deys#U|oRE&{M*yry* zZvgBuvtA5JhB!NFVoKzZ9~bU#wh!TvDD3+>s);K#obu%ei5vnsuuRx0-=s{I80LkU z`-}^$Dle{1Ewvzh!l(FwVNY~Q3aO7B8oNp%(^(U~7W&ArKlTf3@KBaNn=#7ncuuOC ztIJnTAiv}Dt(K;)the8U)2_$8T8@guWi|qjl0wZQZFl>vZ@h9!A=Su~ZAd&j&Qtsf zVG_HXixz#@?uo%JUInwP436h_eN|DOFb#hl%rpso^_*kTstO2P1W(-9h?nZC+T7-L z&uq+tUdbX_#-{?n>5EHo9i>Yq+j&oAV`eQLdFz(`{7AXBQwA>e+_kWH(1dn5w|t!k zDaM)vVgBb+`~V3KtprDR{$^fJlS3xzf!_C~3~KE&c8s|h(*uF{@e7Fs$;~2v719FA zUEp?7Dne{E-gA1}`RpnzY+(c_@9!7n=|C);mm2G-WW<~QJ(czx z(uAnT=rS+$Dm|NBeyetY33x+(s_7PsXJh(Pgi}Xa>kyo5lVrnO75>BAQr=onX;S9_ zsVN5>W?E|i+H>T~&KhxDprl+25|_Km_j8k=)h5ci)vZSMJ{tPjsB(X8DhW}NerKs6 zk(ycqEh;Lat$4BeQTDA<7>^wR73Un$4M>{23H$|dLZ z_)n*(g!wn(6B2>mr9XznCo~N6l6T)^JQ+G zi#hu+n{+w~)>4|7Hh;xxM4E=gq5Y@5*oNt@es8r_fGIbZ^$;D%bC@`^3~3N7X65B! zK2qj5rk!GVWHf1$fmg326e%&(tasdJ7EP3%oUA{`k_w{4@LFT|bD$LRbv$(>VKy(#-&+b+ z0R_&Qxr_F>q!g9g3r_CCc}yKe5+YL&P{_3XNmq7}HV_xfEh?sXkG=pRH%#KF88Xf= zJJy=s4LO^d5~R;%%*w^QGnMH0-l)roE%~?2*I*f)_QUunzKK!X`A{(pn+mJ(Yk{6g(%&W=zf{mqbFMtRwaP9YNnN z?%15lF`Q9sWC;k@U|J!g+mNw%W)7J$89l_Ol>{F$K9e|%G_yNxGi2_#l72-4hd!>B~h*bv<%I-{SvtXgZ5gKX^CwwFk*W!-}u{J7O4YhQdO;SNgEt;^%_o5*R zsU&Y!GTvM0aj_IK{MJ6CmwrPUsf=#i+|02m{UT>RqpQWM6|--RUoDE;zGOWsp%n9L zJW=MluH~k|45d6#(>@~N!O;U`EMM(nvm7!RG?|ZfX*MU6g%d%cRQS4VsT`2MXgCrQ z&^+VqJdvOkv+B5vE=0`BO2^h$qFCuvgGHu@Q+P0cqULL3XR@6C*&@^f-0#L8Cu3w5 z;XYlS&%!(%@>E`QKYdYTZ`*84TOvYAwV+ivSfIkvK!DghSVJCC#F?b-Cni;Z*#51c z_J^E>zu1{$R7CzLp~np6>d#TK6pzx@kC6wg%h4-h4%5O8u`x8N=%E-qy94Yw5vZN* zBx+mNyGGWA&L-FSBp3+MGBQ*U72YyZDk8(Jk7>%@kdp02QAhU1Z9?4Z7*498G%knJ zc|3Vj>W0`_12T(C7V}wYiBvU`n01G1IrM8oVP*T2bzb{eCKd5=AC`v6f zSBMgDE^#xMwLCoe<;q-RqO>5OI09G1SM(I{D(vGi5J&L$@xXB4`bCC2W{Bp7b*5;v z-70S?B1H}meWYU+H9ov)k*6z%5 z<^*sF`SlesUt$i7faZqv`BEsfMdo7N7LPP}HQR@B`l-!qn)ivBY+Y})%&5)JFmFke z-sW2*CNMim4O=|neGuG6NW7JGquds@Y1P^}Lf}eri}hpAQv|Tu`z({EH|`FUT&IZS zj9W;qVV9vh<#|Yi+`iXl$;=(XnNq}coCiWQ&WokVD&bIS6O?Gl7Bqf1JeW|qb}G|T zwVo!5Zf}^SPKDo5lPi@1K^~GHv@46Z{k25jEqvXVF1Tbco-G-!96E#SZi|E4e~V}~ zvR-~%SUi3<9t=FGeQm0A3W!VpQMW@BB>3H#OH#VHf87>4T29Q<<OGfW%Dz-)5!Jq2qq{}8rSBowz@`dMF3&~L`mg)$rS2}7D+i%0%3<(U8F`zWL zL^S2D!$L-EOVsASLue7ALYFd~7mY)@$1YO!t=5-Tq9(ovdGYIxIbWyooXfq<*t%5F zH=5vVZgjOR+>ia~$(hG>TyTy*0ELLrEAY%dHI7?7e#+9!XpFIxJ(=B0*|A1$F+bf6 z*w*Wu{TxPRc{xB4Q(GRWZx%{{(yCZTcgpjkQospw8=-V@`~I1(ZZ**Kv|=}KxCnVq zU?@dzl8Xrokz(BHeE(CE?&)|{pqF&IOWrl%iE=pVLz`gjEt@pEbq~s}7SZsm;tYLs zRapvovzkgq9D0nfjW)*e(Zvd$LBbGnW`IFdg=tCs+dHM@Y7L9n9wgyc1v*2fk$z7c zZcGULf=Z%vQYe?z>>ZM;o9HMmEq89ANbn81Y?;E&KU0I!mLtEzF=<8ftT_%1k9m7; z&kCY+wxz_^RNaqR;c=P@4vIgzY3nTl)2THR<@)^>{GrAg^sUSrVyqS!4ZLAAi?TpThlpxmVq`qgRst~0AEVCX?_al$gbHdl580J9-ipJyghuL^l6oobG^r%` zNP6{O6{(aOJ*j*%+zfhzF8(Fm!$;lAiku}R36fSJrSesql4%s!aUx|Ry&m7!(U>fz zRkrzC$1%gn8*7Og6nm{oP*rS$JX-5kYW!D@XSj*Z*xW!+YOdUBH$Epyk~whhU@(iE)qw;6%omufB>2W`xgXIy@kbhipyb zGHmSYHds`*T^+euMJRze)WU}~9ViNBGes=*9xxejzs=-~PG1HDmLbsJNXN%_EUIHoI*4p!- zT8*>eWrm7MlQ}Gxm!?@=#}BR|ueD-{Niavedz6|5usc`Y15%anJ&osBg~FY7+@tC~ z_gs9SkV&`WO+XF5{b1qRT|5ki*;xpEyS^8+98as`5SM$)PA{>{Q~kI2qNUvioSUX* z20w06E4e|tF+EsuKM`QQ^QWM|QmW3M;6v81+8u!xx4N4*n5jw<&+KR*qC6jos+bq( z`%RFw<``ElRfan*9i5-{JgcRxnET*XF5+V$PQt|Zlit7eqaziMg9B~25yQOvo%Mx4sfn{l8M?wtY#OhDwBk@^{K0KO{BD^>?FGF^EXqD$-cbO z#k(7#QzPKxS~7i(9{fI@&twKH^GJ$`D-SW9=ADxcA-UGcL?BGzi5s0mET|L2!{4I< z?fnRC-FFk(D}E7@_t@c@nO;s9aTw1Q{DO>Gxjo%uome-o+~(dEP%#zm#e*hAs{DyP zA@rmyxzSqn7d=3NsTo%(8GH_N`MP{&-_VPyxS)}@#6tTl^^RDNa6(3nd*j4p^B%RW zSR4ws=5QIl=x$R-^p-0(F8JVQmAle4Zu2u^WjmQ%_eo9%#eJeasfQ1%{|l*gFfIQ?P1G-yXWNDP&-vpsPWBMO_jLC0i0R&ErOL)If9X{yI5-c64GD(nPzd^XnL^&W z!_2_dE{@w)ydonBPg$|u%(pk|{$uB*DR!iIK-mHum$s%FmE>RBiT(?*ZDZNy=HJM3 z0t(9}Tlh?zW#h8w0Drl+!5VrbDa$rspXA^`D9ts z@jF6#3R^#4X|psB=(KV?cc*&#t_`Z#MC=^(kAt;`@>8Y60x&F>ylm}%W`HPTHFXQi zd^*(A%+20{jB8cLGeKC~eFkun@!nJ*AfG#b5+Ee-k53h(Z@EVmR5(2D#VxZ91Gfz- zFT3+6V5PAq6r&U|;>aO^1A0fhA4;kdZnhJK*DKn;lBKUTr|NSsYS)!xw@u~8?KjIn zV(gZLpo78k=#s;ARb%IOz&Ml%1Z);dM8JTBCO3grWI=c?u9iEZ69(j3nJk?IH==)M za@b;~(5O+Rz0?U`<+tAV#Oaa5#08wwqiIzWfS2W7bq|9aNrTo~4)a(&ea~TvBHFPy zLCsZPn_&e{0U}%i)eX{bAN~(mcPUULxVsd0TD6`@OtD-eNwuw zH}6dwiOk{JgU8whjgj>4ouD5+d%d~m{Py%zxE+o0Qi_A>)C}J@_9|-J*RE%2y4bltjYTRhR716V% zv{2bzBnNU%JIM;n?pm#G)Y;chG2}oS$!-WvM@)Ph74uevkujSCJ4I9N?d zsIkcCjB+9UTbXA_PUdC~_lj_ycqr^tdK4N264X_&a_0H8azuVL&tIgyhPTEdUNY>_ zs{$XQU(uYvAWN?11Bl>bNmnu*&-a@-a0b`IIVJ>S?y_Afc;NK$blnV^1(elL4A+2Y z0vhDb;qxVn7qnhI;b3un%3Iu_GL!ERt*vWtmIC#M4dx|6a<$Nx+W^>2%yqRD`yfF~n(Y;jCok4p>_WRlJO=&sNM4VgNcB4}@y#csuD7>~ZPE)`L8l zqStCfqeG(!HY-Ao+Dmtxn~G-qa(4V+QmL3w-}XvdFZ1j^K#E<<(F>wr#Vk|n_qIHC z#-S3K*R%4;{aurNxYEUHT%m`m!ln#L<=H*2bb}_i`(7}DfzRpV_``J@T_=EGj@_Hd z9LQ!EnaTi&9vvPIBlbld-8K9QPH&j}Iig`IB>HJDqbj_zdVgXC#hIgJb0J+n)p!?u z{X*)OgUb714<(uJ8Iol1Eb3K0+C)i4Y1BpT9MP`6B8AL8v>o8$9X$jAr}Qa8FhkqM zxWS`Or^57#@RD|nLvKDx4xYVAOD~nm?85|#&jGEh-Nx-K+H+OF{X~YtFI~J&$;ARR zqZEp0%@M^gkK$Rxo|~TbvXP5XZrTy3K>963VzFa4(~X`4p79LTzLFWq7i+NU+u9NG zr`>9EiBJ1{30=7Hloex3NTUvTC^ku(rMIf3;-x~){qO*Djoz*5wYo4f2Z81lg*Ko1yn6YIj%dk7_c5Lsh250VjiUmkRO!M@@o32!pRPVYR^g0# zIC1GGcwny!J{Dv=VZ!Tk0r^AX!8L{Q;V$+)JEb>ZME%HEfDp+@tI%1Yvem|Cu?cCnDlq*ww1AB#xIQPHmzbPT7xob>_+YbZ6_9K

aF~o75;> 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 literal 118038 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 From 25d1cd5dc7bbe7e732df609a8805105bcee430af Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jun 2026 07:08:56 -0700 Subject: [PATCH 005/140] build(deps): Bump form-data in /tools/docs-validation (#3224) Bumps [form-data](https://github.com/form-data/form-data) from 4.0.5 to 4.0.6. - [Release notes](https://github.com/form-data/form-data/releases) - [Changelog](https://github.com/form-data/form-data/blob/master/CHANGELOG.md) - [Commits](https://github.com/form-data/form-data/compare/v4.0.5...v4.0.6) --- updated-dependencies: - dependency-name: form-data dependency-version: 4.0.6 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/docs-validation/package-lock.json | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/tools/docs-validation/package-lock.json b/tools/docs-validation/package-lock.json index dde6e6772b..28e98791a7 100644 --- a/tools/docs-validation/package-lock.json +++ b/tools/docs-validation/package-lock.json @@ -7,6 +7,7 @@ "": { "name": "@wheels/docs-validation", "version": "0.1.0", + "license": "Apache-2.0", "dependencies": { "@anthropic-ai/sdk": "^0.40.0" }, @@ -181,16 +182,16 @@ } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -301,9 +302,9 @@ } }, "node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" From 61c5c9961d6419ef2d79fb553bb39021197b36c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jun 2026 07:09:17 -0700 Subject: [PATCH 006/140] build(deps-dev): Bump js-yaml in /tools/docker/testui (#3225) Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.1.1 to 4.2.0. - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/commits) --- updated-dependencies: - dependency-name: js-yaml dependency-version: 4.2.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/docker/testui/package-lock.json | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/tools/docker/testui/package-lock.json b/tools/docker/testui/package-lock.json index 2cf0c040c7..97759dfdc2 100644 --- a/tools/docker/testui/package-lock.json +++ b/tools/docker/testui/package-lock.json @@ -1458,10 +1458,20 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" From 61c594edc4c1ea47ad456364fb238949495ac0b9 Mon Sep 17 00:00:00 2001 From: Peter Amiri Date: Fri, 19 Jun 2026 13:53:05 -0700 Subject: [PATCH 007/140] ci: add index-integrity probe to distribution install smoke (#3218 regression guard) (#3234) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ci: add index-integrity probe to distribution install smoke (#3218 regression guard) The daily install-smoke installs the CLI per channel and asserts the version, but that only samples once at 14:00 UTC. The #3218 cross-channel clobber empties the stable apt index for most of the day (a bleeding-edge snapshot wipes it minutes after each stable publish; it's only briefly populated), so a clobber can land outside the install legs' sample window and slip past them — and when they do fail, "apt install failed" doesn't name the cause. Add a fast, container-free `index-integrity` job that probes the PUBLISHED apt and yum dist indexes directly: stable must be non-empty and name the current GA (per arch for apt), and bleeding-edge must stay non-empty (the clobber was bidirectional — apt-wheels#5 scopes regen per-channel to prevent both directions). An empty/missing/stale index fails with a message that names the regression. Reliability: fetches use `curl --retry ... --retry-all-errors` so a transient blip can't false-red the guardian, and all grep checks feed from a here-string (`grep -q PAT <<<"$body"`) rather than `printf | grep -q` — under `set -o pipefail` the latter false-fails when grep -q early-exits and SIGPIPEs the upstream printf of a 100KB index. Verified: 3/3 green against the live indexes, and a negative test (bogus version) correctly fails. Refs: wheels-dev/wheels#3218, wheels-dev/apt-wheels#5 Co-Authored-By: Claude Opus 4.8 Signed-off-by: Peter Amiri * ci: probe plain (edge) URLs + hash-consistency, mirroring apt/dnf exactly Two corrections to the index-integrity job after finding the real #3218 failure mode is CDN edge-cache staleness, not just the origin clobber: 1. Drop the `?cb=` cache-buster. apt/dnf fetch the plain URLs that hit Cloudflare's edge; a cache-buster hit R2 origin instead, so the probe went green while real `apt install` failed on a stale edge-cached Packages.gz. Test the SAME plain URLs clients use. 2. Verify hash-consistency, exactly what the package managers verify: parse the SHA256 the (plain) Release records for each binary-/Packages.gz, fetch the (plain) Packages.gz, and compare — this is precisely the "File has unexpected size" check that failed in #3218. yum: verify the served primary.xml.gz matches the hash repomd references. Then gunzip and confirm the content lists the GA (catches an empty-but-internally-consistent index). Binary correctness: gzip blobs are fetched to a temp file and hashed/gunzipped from the file — never captured into a shell variable, since `$(...)` is text-only and silently corrupts binary (strips trailing newlines, drops NULs), which would compute a bogus hash. Paired with apt-wheels#6 / yum-wheels#6 (set `no-store` on metadata so the edge stops caching it). Verified against the live indexes: correctly RED on the currently-stale apt stable amd64 edge, GREEN on arm64 / bleeding-edge / yum. Refs: wheels-dev/wheels#3218, wheels-dev/apt-wheels#6, wheels-dev/yum-wheels#6 Co-Authored-By: Claude Opus 4.8 Signed-off-by: Peter Amiri --------- Signed-off-by: Peter Amiri Co-authored-by: Peter Amiri Co-authored-by: Claude Opus 4.8 --- .../workflows/distribution-install-smoke.yml | 153 +++++++++++++++++- 1 file changed, 147 insertions(+), 6 deletions(-) diff --git a/.github/workflows/distribution-install-smoke.yml b/.github/workflows/distribution-install-smoke.yml index 76b5269dfd..af89c8d685 100644 --- a/.github/workflows/distribution-install-smoke.yml +++ b/.github/workflows/distribution-install-smoke.yml @@ -9,15 +9,27 @@ name: Distribution install smoke (brew / scoop / apt / yum) # - the Homebrew formula auto-update dies when LuCLI ships a binary-less tag # (recurring; homebrew-wheels#383/#384) # - the apt stable Packages index gets clobbered to 0 bytes by a bleeding-edge -# publish (#3218 — and the arm64 stable index is empty right now) +# publish (#3218, fixed by apt-wheels#5 — now guarded by the index-integrity +# job below, which also covers the bidirectional case) # - a tap PR never merges / a dispatch token loses scope, leaving a channel # stuck on an old version # -# This workflow installs the CLI the exact documented way on each channel and -# asserts `wheels --version` reports the current GA. It runs daily (propagation -# has settled by then) and on demand. It does NOT run on `release: published` -# on purpose — right after a tag the channels lag, which would be a false red; -# the daily run is the signal. +# This workflow has two layers: +# 1. index-integrity — a fast, container-free probe of the PUBLISHED apt/yum +# dist indexes (Packages / repomd primary). It asserts each channel's index +# is non-empty and that stable names the current GA. This catches the #3218 +# clobber deterministically: the full-install legs only sample once a day, +# so a clobber that lands outside the 14:00 window (the index is populated +# only briefly right after a stable publish) can slip past them — but an +# empty/missing index always fails this probe with a message that names the +# regression. It also asserts the bleeding-edge index stays non-empty, since +# the clobber was bidirectional (a stable publish could wipe BE too). +# 2. the per-channel install legs — install the CLI the exact documented way +# on each channel and assert `wheels --version` reports the current GA. +# +# Runs daily (propagation has settled by then) and on demand. It does NOT run on +# `release: published` on purpose — right after a tag the channels lag, which +# would be a false red; the daily run is the signal. # # Java is NOT set up by hand anywhere: every package declares/bundles it # (brew `depends_on "openjdk@21"`, the .deb `Depends: openjdk-21-jre-headless`, @@ -75,6 +87,135 @@ jobs: echo "version=$VER" >> "$GITHUB_OUTPUT" echo "All channels must serve wheels $VER" + index-integrity: + needs: resolve + name: "Index integrity (apt + yum dists)" + runs-on: ubuntu-latest + timeout-minutes: 10 + # Direct probe of the PUBLISHED dist indexes — no install, no containers. + # Catches the #3218 cross-channel clobber deterministically: a regression + # that empties a Packages / repomd index always fails here with a message + # that names the regression, even outside the brief post-publish window the + # full-install legs happen to sample. Both directions are checked because + # the clobber was bidirectional (a stable publish could wipe bleeding-edge + # and vice versa) — apt-wheels#5 scopes regen per-channel to prevent both. + env: + # Validated semver from `resolve`; passed via env (never interpolated into + # the shell). The only external input the script touches. + EXPECTED: ${{ needs.resolve.outputs.version }} + # NOTE: deliberately NO cache-buster. apt/dnf fetch the plain URLs, which + # hit Cloudflare's edge cache — so this probe must fetch those SAME plain + # URLs to see what clients see. An earlier draft appended `?cb=` to dodge + # the edge cache; that hit R2 origin instead and showed green while real + # `apt install` failed on a stale edge-cached Packages.gz (#3218 follow-up: + # apt-wheels#6 sets `no-store` on metadata so the edge stops caching it). + steps: + - name: Probe apt + yum stable/bleeding-edge indexes + run: | + set -uo pipefail + fail=0 + note() { echo "::error::$*"; fail=1; } + + # Retrying fetch: a transient blip must not red a daily guardian. -f + # fails on HTTP >=400 so --retry-all-errors retries 5xx too. Prints + # body to stdout; non-zero exit (after retries) => caller sees empty. + fetch() { curl -fsSL --retry 4 --retry-delay 3 --retry-all-errors --max-time 60 "$1"; } + + # All grep checks feed from a here-string (grep PAT <<<"$body"), NOT a + # `printf | grep` pipe. `grep -q` exits on first match without draining + # stdin, so a piped printf of a 100KB index gets SIGPIPE (exit 141) and + # `set -o pipefail` then reports the whole pipeline as failed EVEN WHEN + # grep matched — a false red. A here-string has no upstream process to + # kill, so the exit status is grep's alone. + + # sha256 of a file (sha256sum on Linux runners). Takes a path, NOT + # piped data — gzip blobs are binary and `$(...)` would corrupt them + # (command substitution is text-only: strips trailing newlines, can't + # hold NUL bytes). Always fetch binary to a temp file, then hash/gunzip + # the file. + sha256f() { sha256sum "$1" | awk '{print $1}'; } + + # --- apt stable: replicate what `apt-get update` actually verifies. + # Parse the SHA256 the (plain) Release records for binary-/ + # Packages.gz, then fetch the (plain) Packages.gz and compare. This is + # the exact check apt makes — and the exact one that failed in #3218 + # when a stale edge-cached Packages.gz no longer matched a fresh + # Release ("File has unexpected size"). Then gunzip and confirm the + # content actually lists the GA (a clean clobber can be empty-but- + # internally-consistent: hash matches, content empty — caught here). + rel="$(fetch "https://apt.wheels.dev/dists/stable/Release" || true)" + if ! grep -q "^SHA256:" <<<"$rel"; then + note "apt stable Release missing or has no SHA256 section." + else + for arch in amd64 arm64; do + relpath="main/binary-${arch}/Packages.gz" + exp="$(awk -v p="$relpath" '/^SHA256:/{f=1;next} /^[A-Z]/{f=0} f && $3==p {print $1}' <<<"$rel" | head -1)" + tmp="$(mktemp)" + fetch "https://apt.wheels.dev/dists/stable/${relpath}" > "$tmp" 2>/dev/null || true + act="$(sha256f "$tmp")" + content="$(gunzip -c "$tmp" 2>/dev/null || true)" + rm -f "$tmp" + if [ -z "$exp" ]; then + note "apt stable Release does not record a SHA256 for ${relpath}." + elif [ "$exp" != "$act" ]; then + note "apt stable ${arch} Packages.gz hash != Release (stale edge cache or torn publish — the #3218 'unexpected size' failure). expected=${exp} served=${act:-}" + elif ! grep -q "Version: ${EXPECTED}" <<<"$content"; then + note "apt stable ${arch} Packages.gz is hash-consistent but does not list wheels ${EXPECTED} (empty/old index)." + else + echo "OK apt stable ${arch}: Packages.gz matches Release and lists ${EXPECTED}" + fi + done + fi + + # --- apt: bleeding-edge must stay non-empty (bidirectional guard). + # Versions float (snapshot.N), so only assert it has at least one stanza. + be_body="$(fetch "https://apt.wheels.dev/dists/bleeding-edge/main/binary-amd64/Packages.gz" 2>/dev/null | gunzip 2>/dev/null || true)" + if ! grep -q "^Package:" <<<"$be_body"; then + note "apt bleeding-edge amd64 index is EMPTY (a stable publish may be clobbering it)." + else + echo "OK apt bleeding-edge amd64: index non-empty ($(grep -c '^Package:' <<<"$be_body") entries)" + fi + + # --- yum: resolve repomd -> primary.xml.gz (plain urls), assert the GA. + # repomd records the primary's checksum; verify the served primary + # matches it, then that it lists the GA — the dnf analogue of the apt + # check above. + check_yum() { + local ch="$1" assert_ver="$2" + local repomd loc exp gz act content + repomd="$(fetch "https://yum.wheels.dev/${ch}/repodata/repomd.xml" || true)" + loc="$(grep -oE 'repodata/[a-f0-9]+-primary\.xml\.gz' <<<"$repomd" | head -1 || true)" + if [ -z "$loc" ]; then + note "yum ${ch} repomd.xml has no primary metadata (empty/missing repodata)." + return + fi + # The primary's filename IS its sha256 (createrepo_c names it that, + # and it equals the repomd for the compressed file). + exp="$(sed -E 's@.*/([a-f0-9]+)-primary\.xml\.gz@\1@' <<<"$loc")" + tmp="$(mktemp)" + fetch "https://yum.wheels.dev/${ch}/${loc}" > "$tmp" 2>/dev/null || true + act="$(sha256f "$tmp")" + content="$(gunzip -c "$tmp" 2>/dev/null || true)" + rm -f "$tmp" + if [ -n "$exp" ] && [ "$exp" != "$act" ]; then + note "yum ${ch} primary.xml.gz hash != repomd reference (stale edge cache or torn publish). expected=${exp} served=${act:-}" + elif ! grep -q ' Date: Fri, 19 Jun 2026 18:32:34 -0700 Subject: [PATCH 008/140] docs(web/blog): use local.di (not top-level var) in from-wirebox-to-wheelsdi services.cfm example (#3235) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The `config/services.cfm` snippet used a top-level `var di = injector();`. A bare top-level `var` statement compile-errors on Adobe CF (#3063) — `config/services.cfm` is an included template, not a function body, so `var` isn't valid there on Adobe. Lucee/BoxLang tolerate it, but the example as shipped breaks for Adobe readers who copy it. Switch to the cross-engine-safe `local.di` form (matching the DI guide and CLAUDE.md), and update the chained references to `local.di.*`. Signed-off-by: Peter Amiri Co-authored-by: Peter Amiri Co-authored-by: Claude Opus 4.8 --- web/content/blog/posts/from-wirebox-to-wheelsdi.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/web/content/blog/posts/from-wirebox-to-wheelsdi.md b/web/content/blog/posts/from-wirebox-to-wheelsdi.md index 8fb1c6c8c7..0dc34ba26e 100644 --- a/web/content/blog/posts/from-wirebox-to-wheelsdi.md +++ b/web/content/blog/posts/from-wirebox-to-wheelsdi.md @@ -46,10 +46,10 @@ PRs [#1883](https://github.com/wheels-dev/wheels/pull/1883) and [#1888](https:// ```cfm // config/services.cfm — in-house DI, familiar surface -var di = injector(); -di.map("emailService").to("app.lib.EmailService").asSingleton(); -di.map("currentUser").to("app.lib.CurrentUserResolver").asRequestScoped(); -di.bind("INotifier").to("app.lib.SlackNotifier").asSingleton(); +local.di = injector(); +local.di.map("emailService").to("app.lib.EmailService").asSingleton(); +local.di.map("currentUser").to("app.lib.CurrentUserResolver").asRequestScoped(); +local.di.bind("INotifier").to("app.lib.SlackNotifier").asSingleton(); ``` Scopes are explicit. Transient is the default — a fresh instance per call. Singleton lives for the application lifetime. Request-scoped lives for the duration of one HTTP request, cached on `request.$wheelsDICache`. Auto-wiring of `init()` arguments matches registered names when no explicit `initArguments` are passed, which is the common case and the reason most service definitions fit on one line. From 8f73b77b537c72bb67084750f520440fd696e8dc Mon Sep 17 00:00:00 2001 From: Peter Amiri Date: Sat, 20 Jun 2026 09:53:41 -0700 Subject: [PATCH 009/140] perf(model): cache mixin-integration plan to fix per-instance overhead (#3236) Cache the mixin-integration plan (directory scan + per-file createObject + getMetaData, plus pre-resolved public-method references and a precomputed mixin-override set) once per application instead of re-paying it on every model/controller/mapper materialization. Fixes the per-instance overhead behind #3213; semantics unchanged. Includes an engine-portable guard spec. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_0167uSbSN4vZqQqL5QZfdiQm --- ...-model-instance-mixin-cache.performance.md | 1 + vendor/wheels/Controller.cfc | 83 +++++-------- vendor/wheels/Global.cfc | 114 ++++++++++++++++++ vendor/wheels/Mapper.cfc | 52 +++++--- vendor/wheels/Model.cfc | 92 ++++++-------- vendor/wheels/events/onapplicationstart.cfc | 7 ++ .../specs/model/integrationPlanCacheSpec.cfc | 77 ++++++++++++ 7 files changed, 296 insertions(+), 130 deletions(-) create mode 100644 changelog.d/3213-model-instance-mixin-cache.performance.md create mode 100644 vendor/wheels/tests/specs/model/integrationPlanCacheSpec.cfc diff --git a/changelog.d/3213-model-instance-mixin-cache.performance.md b/changelog.d/3213-model-instance-mixin-cache.performance.md new file mode 100644 index 0000000000..7d00692d28 --- /dev/null +++ b/changelog.d/3213-model-instance-mixin-cache.performance.md @@ -0,0 +1 @@ +- Model, controller, and mapper object creation no longer re-scans the framework mixin folders (a directory listing plus a `createObject` and `getMetaData` per file) on every materialization. The mixin-integration plan is now built once per application and reused, and the per-method `$willBeOverriddenByMixin` lookup is precomputed — cutting model-instance creation roughly in half (every `new()` and every finder row was paying the full cost). This is the regression behind slow test-suite and request times reported on 4.0.x (#3213) diff --git a/vendor/wheels/Controller.cfc b/vendor/wheels/Controller.cfc index 69acf34a9a..f3fa5fd182 100644 --- a/vendor/wheels/Controller.cfc +++ b/vendor/wheels/Controller.cfc @@ -375,69 +375,46 @@ component output="false" displayName="Controller" extends="wheels.Global"{ * @path The path to get component files from */ private function $integrateComponents(required string path) { - local.basePath = arguments.path; - local.folderPath = expandPath("/#replace(local.basePath, ".", "/", "all")#"); - - // Get a list of all CFC files in the folder - local.fileList = directoryList(local.folderPath, false, "name", "*.cfc"); - for (local.fileName in local.fileList) { - // Remove the file extension to get the component name - local.componentName = replace(local.fileName, ".cfc", "", "all"); - - $integrateFunctions(createObject("component", "#local.basePath#.#local.componentName#")); + // The directory scan + per-file createObject + getMetaData, plus the + // public-method/reference resolution, are cached per path (issue #3213) — + // they are identical for every controller instance. Only the reference + // assignment below runs on each materialization. The mixin-override set is + // resolved once per call (empty in the common no-mixins case) so the old + // per-method $willBeOverriddenByMixin function call is gone from the loop. + local.plan = $componentIntegrationPlan(arguments.path); + local.overrideSet = $mixinOverrideSet("controller"); + local.iEnd = ArrayLen(local.plan); + for (local.i = 1; local.i <= local.iEnd; local.i++) { + $integrateFunctions(local.plan[local.i].publicMethods, local.overrideSet); } } /** - * Dynamically mix methods from a given component into this component + * Mix a component's pre-resolved public methods (each `{name, ref}`, see + * $componentIntegrationPlan) into this instance. Preserves the original + * semantics: a method that does not already exist (from inheritance or an + * earlier-integrated component) is added, and any method a plugin/package + * mixin will override is also aliased to `super`. `overrideSet` is the + * precomputed mixin-override name set. */ - private function $integrateFunctions(componentInstance) { - // Get all methods from the given component - local.methods = getMetaData(componentInstance).functions; - - for (local.method in local.methods) { - local.functionName = local.method.name; + private function $integrateFunctions(required array publicMethods, required struct overrideSet) { + local.iEnd = ArrayLen(arguments.publicMethods); + for (local.i = 1; local.i <= local.iEnd; local.i++) { + local.m = arguments.publicMethods[local.i]; + local.name = local.m.name; + local.ref = local.m.ref; - // Only add public, non-inherited methods - if (local.method.access eq "public") { - local.methodExists = structKeyExists(variables, local.method.name) || structKeyExists(this, local.method.name); - - if (!local.methodExists) { - variables[local.functionName] = componentInstance[local.functionName]; - this[local.functionName] = componentInstance[local.functionName]; - } - - // Only add super prefix for functions that will be overridden by plugins/mixins - if ($willBeOverriddenByMixin(local.functionName)) { - local.superMethodName = "super" & local.functionName; - variables[local.superMethodName] = componentInstance[local.functionName]; - this[local.superMethodName] = componentInstance[local.functionName]; - } - + if (!(StructKeyExists(variables, local.name) || StructKeyExists(this, local.name))) { + variables[local.name] = local.ref; + this[local.name] = local.ref; } - } - } - /** - * Check if a function will be overridden by a plugin/mixin - */ - private boolean function $willBeOverriddenByMixin(required string functionName) { - // Check if application and mixins are available - if (!IsDefined("application") || !StructKeyExists(application, "wheels") || !StructKeyExists(application.wheels, "mixins")) { - return false; - } - - // Check for both "controller" and "global" mixins - local.componentTypes = ["controller", "global"]; - - for (local.componentType in local.componentTypes) { - if (StructKeyExists(application.wheels.mixins, local.componentType) && - StructKeyExists(application.wheels.mixins[local.componentType], arguments.functionName)) { - return true; + if (StructKeyExists(arguments.overrideSet, local.name)) { + local.superName = "super" & local.name; + variables[local.superName] = local.ref; + this[local.superName] = local.ref; } } - - return false; } function onDIcomplete(){ diff --git a/vendor/wheels/Global.cfc b/vendor/wheels/Global.cfc index 5e0cca6a8c..8be7b42a6c 100644 --- a/vendor/wheels/Global.cfc +++ b/vendor/wheels/Global.cfc @@ -1058,6 +1058,120 @@ return local.$wheels; return local.rv; } + /** + * Internal. Returns a cached "integration plan" for a folder of mixin + * components (e.g. `wheels.model`, `wheels.controller`, `wheels.mapper`): an + * ordered array of `{instance, methods, fullName}` where `instance` is a + * single shared, stateless method-holder component and `methods` is its + * `getMetaData().functions` array. + * + * The directory scan, the per-file `createObject`, and the `getMetaData` + * calls are the expensive — and completely invariant — part of + * `$integrateComponents`: they produce the same result for every object of a + * given type. Before this cache they were re-paid on EVERY model, controller, + * and mapper materialization (every `new()` and every finder row goes through + * `$createInstance` -> `init()` -> `$integrateComponents`), which dominated + * test-suite and request time (issue #3213). Now they run once per path and + * the cheap per-instance work (copying function references into the target's + * `variables`/`this`) is all that remains on the hot path. + * + * The plan is cached in `application.wheels.integrationPlans`, so a reload — + * which rebuilds `application.wheels` — re-scans, the same lifetime contract + * as the schema column cache. The cached method-holder components carry no + * instance state (they are never `init()`'d) and CFML methods bind to the + * object they are invoked on, so sharing their function references across many + * target instances and across concurrent requests is safe. + */ + public array function $componentIntegrationPlan(required string path) { + // During early bootstrap (before application.wheels exists) fall back to + // an uncached build so behavior is identical to the pre-cache code path. + if (!StructKeyExists(application, "wheels")) { + return $buildComponentIntegrationPlan(arguments.path); + } + if (!StructKeyExists(application.wheels, "integrationPlans")) { + lock name="wheels.integrationPlans.#application.applicationName#" type="exclusive" timeout="10" { + if (!StructKeyExists(application.wheels, "integrationPlans")) { + application.wheels.integrationPlans = {}; + } + } + } + if (!StructKeyExists(application.wheels.integrationPlans, arguments.path)) { + local.plan = $buildComponentIntegrationPlan(arguments.path); + lock name="wheels.integrationPlans.#application.applicationName#" type="exclusive" timeout="10" { + application.wheels.integrationPlans[arguments.path] = local.plan; + } + } + return application.wheels.integrationPlans[arguments.path]; + } + + /** + * Internal. Builds (without caching) the integration plan for a path — the + * directory scan + per-file createObject + getMetaData that + * $componentIntegrationPlan memoizes. The DirectoryList call mirrors the + * original $integrateComponents exactly so file (and therefore override) + * order is unchanged. + */ + public array function $buildComponentIntegrationPlan(required string path) { + local.folderPath = ExpandPath("/#Replace(arguments.path, ".", "/", "all")#"); + local.fileList = DirectoryList(local.folderPath, false, "name", "*.cfc"); + local.rv = []; + for (local.fileName in local.fileList) { + local.componentName = Replace(local.fileName, ".cfc", "", "all"); + local.instance = CreateObject("component", "#arguments.path#.#local.componentName#"); + local.meta = GetMetaData(local.instance); + local.fns = StructKeyExists(local.meta, "functions") ? local.meta.functions : []; + // Pre-resolve the PUBLIC method references once. On the hot path + // (every materialized object) this removes both the per-method + // `.access` filtering and the `instance[name]` scope lookup; only the + // reference assignment into the target remains (issue #3213). Function + // references are late-bound to the object they are invoked on, so the + // shared, cached reference works correctly on every target instance. + local.publicMethods = []; + local.fEnd = ArrayLen(local.fns); + for (local.f = 1; local.f <= local.fEnd; local.f++) { + if (local.fns[local.f].access == "public") { + ArrayAppend(local.publicMethods, { + name = local.fns[local.f].name, + ref = local.instance[local.fns[local.f].name] + }); + } + } + ArrayAppend(local.rv, { + instance = local.instance, + methods = local.fns, + publicMethods = local.publicMethods, + fullName = StructKeyExists(local.meta, "fullName") ? local.meta.fullName : "#arguments.path#.#local.componentName#" + }); + } + return local.rv; + } + + /** + * Internal. Returns a struct whose KEYS are the function names that a + * registered plugin/package mixin will override for the given component type + * (plus the always-checked "global" type). Empty — the common case, no mixins + * registered — when there are none. Computed from the app-scoped, reload-stable + * application.wheels.mixins so the per-method $willBeOverriddenByMixin function + * call can be replaced by an O(1) struct-membership test on the hot path (#3213). + */ + public struct function $mixinOverrideSet(required string primaryType) { + local.rv = {}; + if ( + !StructKeyExists(application, "wheels") + || !StructKeyExists(application.wheels, "mixins") + || StructIsEmpty(application.wheels.mixins) + ) { + return local.rv; + } + local.types = [arguments.primaryType, "global"]; + for (local.t in local.types) { + if (StructKeyExists(application.wheels.mixins, local.t) && IsStruct(application.wheels.mixins[local.t])) { + StructAppend(local.rv, application.wheels.mixins[local.t], false); + } + } + return local.rv; + } + /** * Internal function. */ diff --git a/vendor/wheels/Mapper.cfc b/vendor/wheels/Mapper.cfc index 52e420513e..bc3a6ff081 100644 --- a/vendor/wheels/Mapper.cfc +++ b/vendor/wheels/Mapper.cfc @@ -379,38 +379,50 @@ component output="false" { * @path The path to get component files from */ private function $integrateComponents(required string path) { - local.basePath = arguments.path; - local.folderPath = expandPath("/#replace(local.basePath, ".", "/", "all")#"); - - // Get a list of all CFC files in the folder - local.fileList = directoryList(local.folderPath, false, "name", "*.cfc"); - for (local.fileName in local.fileList) { - // Remove the file extension to get the component name - local.componentName = replace(local.fileName, ".cfc", "", "all"); - - $integrateFunctions(createObject("component", "#local.basePath#.#local.componentName#")); - } + // The directory scan + per-file createObject + getMetaData, plus the + // public-method/reference resolution, are cached per path (issue #3213). + // The `get`/`controller` exclude-list only applies to NON-wheels.mapper + // sources, so for the wheels.mapper.* components scanned here every public + // method is integrated — exactly what the precomputed publicMethods hold. + local.plan = $componentIntegrationPlan(arguments.path); + local.iEnd = ArrayLen(local.plan); + for (local.i = 1; local.i <= local.iEnd; local.i++) { + $integrateFunctions(local.plan[local.i].instance, local.plan[local.i].publicMethods); + } } /** - * Dynamically mix methods from a given component into this component. - * Only public, non-inherited methods are added. + * Mix a component's methods into this component. The cached path passes the + * pre-resolved public methods (each `{name, ref}`, see + * $componentIntegrationPlan) and assigns them directly. The fallback path — + * used by init() integrating wheels.Global with no cached list — keeps the + * original metadata scan plus the `get`/`controller` exclude-list (#3213). * * @param componentInstance The component instance to integrate methods from. */ - private function $integrateFunctions(required any componentInstance) { - // Get metadata for the component - local.methods = getMetaData(componentInstance).functions; - local.componentName = getMetaData(componentInstance).FULLNAME; + private function $integrateFunctions(required any componentInstance, array publicMethods = []) { + // Cached path: pre-resolved public method references. + if (ArrayLen(arguments.publicMethods)) { + local.iEnd = ArrayLen(arguments.publicMethods); + for (local.i = 1; local.i <= local.iEnd; local.i++) { + local.m = arguments.publicMethods[local.i]; + variables[local.m.name] = local.m.ref; + this[local.m.name] = local.m.ref; + } + return; + } - // Iterate over the functions in the component + // Fallback (e.g. init() integrating wheels.Global): scan metadata and + // apply the exclude-list against the source's full name. + local.meta = getMetaData(arguments.componentInstance); + local.methods = StructKeyExists(local.meta, "functions") ? local.meta.functions : []; + local.componentName = StructKeyExists(local.meta, "fullName") ? local.meta.fullName : ""; for (local.method in local.methods) { local.functionName = local.method.name; local.excludeList = "get,controller"; - // Add only public, non-inherited methods excluding specific ones + // Add only public methods, excluding specific ones unless the source is a mapper component. if (local.method.access == "public" && (!listFindNoCase(local.excludeList, local.functionName) || findNoCase("wheels.mapper", local.componentName))) { - // Assign methods to `variables` and `this` variables[local.functionName] = componentInstance[local.functionName]; this[local.functionName] = componentInstance[local.functionName]; } diff --git a/vendor/wheels/Model.cfc b/vendor/wheels/Model.cfc index 6e0973979e..d745bc2dfb 100644 --- a/vendor/wheels/Model.cfc +++ b/vendor/wheels/Model.cfc @@ -573,72 +573,50 @@ component output="false" displayName="Model" extends="wheels.Global"{ * @path The path to get component files from */ private function $integrateComponents(required string path) { - local.basePath = arguments.path; - local.folderPath = expandPath("/#replace(local.basePath, ".", "/", "all")#"); - - // Get a list of all CFC files in the folder - local.fileList = directoryList(local.folderPath, false, "name", "*.cfc"); - for (local.fileName in local.fileList) { - // Remove the file extension to get the component name - local.componentName = replace(local.fileName, ".cfc", "", "all"); - - $integrateFunctions(createObject("component", "#local.basePath#.#local.componentName#")); + // The directory scan + per-file createObject + getMetaData, plus the + // public-method/reference resolution, are cached per path (issue #3213) — + // they are identical for every model instance. Only the reference + // assignment below runs on each materialization. The mixin-override set is + // resolved once per call (empty in the common no-mixins case) so the old + // per-method $willBeOverriddenByMixin function call is gone from the loop. + local.plan = $componentIntegrationPlan(arguments.path); + local.overrideSet = $mixinOverrideSet("model"); + local.iEnd = ArrayLen(local.plan); + for (local.i = 1; local.i <= local.iEnd; local.i++) { + $integrateFunctions(local.plan[local.i].publicMethods, local.overrideSet); } } /** - * Dynamically mix methods from a given component into this component + * Mix a component's pre-resolved public methods (each `{name, ref}`, see + * $componentIntegrationPlan) into this instance. Preserves the original + * semantics: a method that already exists (from inheritance or an + * earlier-integrated component) is also exposed as `super`, and any + * method a plugin/package mixin will override is likewise aliased to + * `super`. `overrideSet` is the precomputed mixin-override name set. */ - private function $integrateFunctions(componentInstance) { - // Get all methods from the given component - local.methods = getMetaData(componentInstance).functions; - - for (local.method in local.methods) { - local.functionName = local.method.name; - - // Only add public, non-inherited methods - if (local.method.access eq "public") { - local.methodExists = structKeyExists(variables, local.method.name) || structKeyExists(this, local.method.name); - - if (!local.methodExists) { - variables[local.functionName] = componentInstance[local.functionName]; - this[local.functionName] = componentInstance[local.functionName]; - } else { - local.superMethodName = "super" & local.functionName; - variables[local.superMethodName] = componentInstance[local.functionName]; - this[local.superMethodName] = componentInstance[local.functionName]; - } - - // Only add super prefix for functions that will be overridden by plugins/mixins - if ($willBeOverriddenByMixin(local.functionName)) { - local.superMethodName = "super" & local.functionName; - variables[local.superMethodName] = componentInstance[local.functionName]; - this[local.superMethodName] = componentInstance[local.functionName]; - } + private function $integrateFunctions(required array publicMethods, required struct overrideSet) { + local.iEnd = ArrayLen(arguments.publicMethods); + for (local.i = 1; local.i <= local.iEnd; local.i++) { + local.m = arguments.publicMethods[local.i]; + local.name = local.m.name; + local.ref = local.m.ref; + + if (!(StructKeyExists(variables, local.name) || StructKeyExists(this, local.name))) { + variables[local.name] = local.ref; + this[local.name] = local.ref; + } else { + local.superName = "super" & local.name; + variables[local.superName] = local.ref; + this[local.superName] = local.ref; } - } - } - /** - * Check if a function will be overridden by a plugin/mixin - */ - private boolean function $willBeOverriddenByMixin(required string functionName) { - // Check if application and mixins are available - if (!IsDefined("application") || !StructKeyExists(application, "wheels") || !StructKeyExists(application.wheels, "mixins")) { - return false; - } - - // Check for both "model" and "global" mixins - local.componentTypes = ["model", "global"]; - - for (local.componentType in local.componentTypes) { - if (StructKeyExists(application.wheels.mixins, local.componentType) && - StructKeyExists(application.wheels.mixins[local.componentType], arguments.functionName)) { - return true; + if (StructKeyExists(arguments.overrideSet, local.name)) { + local.superName = "super" & local.name; + variables[local.superName] = local.ref; + this[local.superName] = local.ref; } } - - return false; } /** diff --git a/vendor/wheels/events/onapplicationstart.cfc b/vendor/wheels/events/onapplicationstart.cfc index 30195be304..e17e5c51bf 100644 --- a/vendor/wheels/events/onapplicationstart.cfc +++ b/vendor/wheels/events/onapplicationstart.cfc @@ -116,6 +116,13 @@ component { // machinery ($addToCache / $cacheCount) walks and dereferences `.expiresAt` // on. Putting schema queries under `cache.*` makes the cull throw. application.$wheels.schemaColumnCache = {}; + // Per-app mixin-integration plans (see Global.cfc $componentIntegrationPlan). + // Caches the directory scan + per-file createObject + getMetaData that + // $integrateComponents performs for wheels.model / wheels.controller / + // wheels.mapper, so that work runs once per app instead of on every model, + // controller, and mapper object materialization (issue #3213). Like the + // schema cache, it lives for the application lifetime and is rebuilt on reload. + application.$wheels.integrationPlans = {}; application.$wheels.helperFileCache = {}; application.$wheels.layoutFileCache = {}; application.$wheels.existingObjectFiles = {}; diff --git a/vendor/wheels/tests/specs/model/integrationPlanCacheSpec.cfc b/vendor/wheels/tests/specs/model/integrationPlanCacheSpec.cfc new file mode 100644 index 0000000000..019ce59cb7 --- /dev/null +++ b/vendor/wheels/tests/specs/model/integrationPlanCacheSpec.cfc @@ -0,0 +1,77 @@ +/** + * Guard for the mixin-integration cache (issue #3213). + * + * Model objects are materialized constantly — every `new()` and every finder + * row goes through $createInstance -> init() -> $integrateComponents. That used + * to re-scan vendor/wheels/model/, re-createObject every sub-component, and + * re-getMetaData on each, on EVERY instance. The plan is now built once per app + * (Global.cfc::$componentIntegrationPlan, cached in + * application.wheels.integrationPlans) and replayed cheaply. + * + * These specs pin the behavior the optimization must preserve: the cache is + * populated and reused, and every materialized instance still carries the full, + * working set of mixed-in model methods. + */ +component extends="wheels.WheelsTest" { + + function run() { + describe("mixin-integration plan cache (##3213)", () => { + + it("populates the per-app integration-plan cache for wheels.model", () => { + // Materializing any model triggers $integrateComponents("wheels.model"). + model("author").new(); + expect(StructKeyExists(application.wheels, "integrationPlans")).toBeTrue(); + expect(StructKeyExists(application.wheels.integrationPlans, "wheels.model")).toBeTrue(); + + var plan = application.wheels.integrationPlans["wheels.model"]; + expect(IsArray(plan)).toBeTrue(); + expect(ArrayLen(plan)).toBeGT(0); + // Each entry carries the pre-resolved public methods used on the hot path. + expect(StructKeyExists(plan[1], "publicMethods")).toBeTrue(); + expect(IsArray(plan[1].publicMethods)).toBeTrue(); + }); + + it("reuses the same cached plan across instances rather than rebuilding it", () => { + model("author").new(); + // Tag the cached plan entry in place. The write goes through the full + // application-scope path (no intermediate local var), so it mutates the + // cached array element directly — reference-safe on Adobe CF too, which + // copies an array assigned to a local. Uses only core struct functions, + // so it behaves identically on Lucee/Adobe/BoxLang (avoids the array + // `.equals()` idiom, whose BoxLang behavior is unverified). + application.wheels.integrationPlans["wheels.model"][1]["cacheReuseSentinel"] = true; + // A second materialization must reuse the cached plan, not rebuild it + // (a rebuild would replace the entry with a fresh struct lacking the tag). + model("author").new(); + expect( + StructKeyExists(application.wheels.integrationPlans["wheels.model"][1], "cacheReuseSentinel") + ).toBeTrue(); + }); + + it("materializes instances that carry the full mixed-in model method surface", () => { + var a = model("author").new(); + // A representative spread across the model sub-components + // (create/read/update/delete/validations/errors/properties). + for (var fn in ["save", "update", "delete", "valid", "hasErrors", "isNew", "reload", "key", "properties"]) { + expect(StructKeyExists(a, fn)).toBeTrue(); + expect(IsCustomFunction(a[fn])).toBeTrue(); + } + }); + + it("keeps mixed-in methods functional and instances independent", () => { + // Default value comes from config()/properties — proves the instance + // is wired up, not just method-shaped. + var a1 = model("author").new(); + expect(a1.firstName).toBe("Dave"); + expect(a1.valid()).toBeBoolean(); + + var a2 = model("author").new(firstName = "Grace"); + expect(a2.firstName).toBe("Grace"); + // Mutating one instance must not leak into another. + expect(a1.firstName).toBe("Dave"); + }); + + }); + } + +} From 53e6778c3da0b4793f79ce1197ca69d768cea56b Mon Sep 17 00:00:00 2001 From: Peter Amiri Date: Sat, 20 Jun 2026 12:45:38 -0700 Subject: [PATCH 010/140] docs: add Wheels 5 roadmap recommendations --- .../wheels-5-roadmap-recommendations.md | 2688 +++++++++++++++++ 1 file changed, 2688 insertions(+) create mode 100644 docs/releases/wheels-5-roadmap-recommendations.md diff --git a/docs/releases/wheels-5-roadmap-recommendations.md b/docs/releases/wheels-5-roadmap-recommendations.md new file mode 100644 index 0000000000..322e51ab22 --- /dev/null +++ b/docs/releases/wheels-5-roadmap-recommendations.md @@ -0,0 +1,2688 @@ +# Wheels 5 Roadmap Recommendations + +**Status:** Draft recommendation document +**Date:** 2026-06-20 +**Scope:** Strategic and architectural recommendations for the next major version of Wheels after the 4.0 line. + +This document consolidates a set of framework reviews and comparative analyses: + +- Current Wheels 4 source and documentation. +- Rails, Laravel, and Django capability comparison. +- Framework One architectural review. +- ColdBox and BoxLang strategic review. +- Wheels testing and CI/CD review. +- Rails `params` evolution and its implications for Wheels. +- LuCLI and RustCFML collaboration implications. + +The goal is not to clone any competing framework. The goal is to define a coherent Wheels 5 direction that protects what makes Wheels valuable, removes old drag, and gives the project a sharper story for the next decade of CFML and CFML-adjacent development. + +--- + +## 1. Executive Summary + +Wheels 4 is already a major modernization release. It adds a modern ORM surface, a query builder, jobs, middleware, rate limiting, packages, DI, browser testing, LuCLI-based CLI distribution, deploy tooling, MCP integration, and expanded engine/database support. Wheels 5 should not try to be another ColdBox. It should be a consolidation and clarity release. + +The recommended strategic position for Wheels 5 is: + +> Wheels is the elegant, convention-first, Rails-inspired full-stack framework for CFML applications, with first-class engine neutrality, a modern CLI, and open runtime/tooling partnerships. + +That sentence matters. It gives the roadmap a filter: + +- Prefer productivity over enterprise ceremony. +- Prefer explicit contracts under the hood, but keep the developer-facing API approachable. +- Support BoxLang, but do not become BoxLang-first. +- Adopt good ideas from ColdBox and Framework One only when they strengthen the Wheels identity. +- Keep `params`, but make it safer and give developers an explicit request context path. +- Keep the monorepo, because the framework, CLI, templates, packages, tests, and distribution are now tightly coupled. +- Make automated testing a first-class product feature of the framework, not merely a maintainer concern. +- Use strong relationships with LuCLI and RustCFML maintainers to turn Wheels into a reference framework for open CFML runtime and tooling conformance. + +The highest-impact Wheels 5 themes are: + +1. **Framework contraction:** remove deprecated legacy surfaces and reduce ambiguous runtime magic. +2. **Request context and safer params:** introduce `rc`, preserve `params`, and add Rails-like strong parameter APIs. +3. **First-class modules:** add bounded application modules inspired by FW/1 subsystems and ColdBox HMVC, but keep the API small. +4. **Response and route contracts:** add response builders, route metadata, route inspection, and generated API/MCP/OpenAPI context. +5. **Testing platform:** formalize a multi-tier test matrix across engines, databases, CLI, generated apps, browser tests, and distribution packages. +6. **Engine neutrality:** make ACF/Lucee/BoxLang compatibility an explicit release promise backed by CI. +7. **CLI as the contract:** use the LuCLI-based `wheels` binary as the unified local, CI, package, and release harness. +8. **Runtime and tooling partnerships:** make LuCLI and RustCFML collaboration first-class roadmap tracks, not side-channel conveniences. + +--- + +## 2. Source Grounding + +This document is grounded in the following local Wheels source areas: + +- Core dispatch and request parameter handling: + - [`vendor/wheels/Dispatch.cfc`](../../vendor/wheels/Dispatch.cfc) + - [`vendor/wheels/Controller.cfc`](../../vendor/wheels/Controller.cfc) + - [`vendor/wheels/controller/processing.cfc`](../../vendor/wheels/controller/processing.cfc) + - [`vendor/wheels/Global.cfc`](../../vendor/wheels/Global.cfc) +- Current package/plugin architecture: + - [`vendor/wheels/PackageLoader.cfc`](../../vendor/wheels/PackageLoader.cfc) + - [`vendor/wheels/Plugins.cfc`](../../vendor/wheels/Plugins.cfc) +- DI, jobs, middleware, and query builder: + - [`vendor/wheels/Injector.cfc`](../../vendor/wheels/Injector.cfc) + - [`vendor/wheels/JobWorker.cfc`](../../vendor/wheels/JobWorker.cfc) + - [`vendor/wheels/middleware/Pipeline.cfc`](../../vendor/wheels/middleware/Pipeline.cfc) + - [`vendor/wheels/middleware/RateLimiter.cfc`](../../vendor/wheels/middleware/RateLimiter.cfc) + - [`vendor/wheels/model/query/QueryBuilder.cfc`](../../vendor/wheels/model/query/QueryBuilder.cfc) +- CLI and distribution: + - [`cli/CLAUDE.md`](../../cli/CLAUDE.md) + - [`cli/lucli/ARCHITECTURE.md`](../../cli/lucli/ARCHITECTURE.md) + - [`cli/lucli/Module.cfc`](../../cli/lucli/Module.cfc) + - [`tools/distribution-drafts`](../../tools/distribution-drafts) +- Current test and CI infrastructure: + - [`tests/README.md`](../../tests/README.md) + - [`vendor/wheels/tests`](../../vendor/wheels/tests) + - [`cli/lucli/tests`](../../cli/lucli/tests) + - [`e2e`](../../e2e) + - [`.github/workflows/pr.yml`](../../.github/workflows/pr.yml) + - [`.github/workflows/compat-matrix.yml`](../../.github/workflows/compat-matrix.yml) + - [`.github/actions/setup-wheels-test-env/action.yml`](../../.github/actions/setup-wheels-test-env/action.yml) + +External framework references: + +- Rails: + - [Action Controller Overview](https://guides.rubyonrails.org/action_controller_overview.html) + - [ActionController::Parameters API](https://api.rubyonrails.org/classes/ActionController/Parameters.html) + - [Rails 4.0 release notes](https://guides.rubyonrails.org/4_0_release_notes.html) + - [Rails 8.1 release notes](https://guides.rubyonrails.org/8_1_release_notes.html) +- Laravel: + - [Laravel documentation](https://laravel.com/docs) +- Django: + - [Django documentation](https://docs.djangoproject.com/) +- Framework One: + - [FW/1 documentation](https://framework-one.github.io/documentation/) + - [FW/1 developing applications](https://framework-one.github.io/documentation/4.2/developing-applications/) + - [FW/1 subsystems](https://framework-one.github.io/documentation/4.2/using-subsystems/) + - [DI/1 documentation](https://framework-one.github.io/documentation/4.2/using-di-one/) +- ColdBox and BoxLang: + - [ColdBox site](https://www.coldbox.org/) + - [ColdBox documentation](https://coldbox.ortusbooks.com/) + - [BoxLang site](https://www.boxlang.io/) +- Runtime and tooling ecosystem: + - [LuCLI GitHub repository](https://github.com/cybersonic/LuCLI) + - RustCFML collaboration with Alex Skinner, treated here as an experimental engine/conformance partnership. No public project URL is assumed by this document. + +--- + +## 3. Strategic Positioning + +### 3.1 What Wheels Should Be + +Wheels should remain the Rails-like framework in the CFML ecosystem: + +- Convention-first. +- CRUD-friendly. +- ORM-centered. +- Controller/view helper friendly. +- Fast to start. +- Easy to explain. +- Small enough that a developer can hold the mental model in their head. + +Wheels 4 has expanded the framework's capability surface substantially. The risk for Wheels 5 is that the framework starts to feel like a pile of features rather than a coherent system. The roadmap should counter that risk by making the framework more explicit internally while keeping the default developer experience simple. + +The desired outcome: + +> A new developer can build a useful CRUD app quickly, while an experienced maintainer can reason about routing, request context, params, services, packages, jobs, middleware, and tests through stable contracts. + +### 3.2 What Wheels Should Not Be + +Wheels should not chase ColdBox feature-for-feature. + +ColdBox is a larger platform with HMVC modules, WireBox, CacheBox, LogBox, interceptors, scheduled tasks, async APIs, REST handlers, and a growing BoxLang-first optimization story. That is a legitimate strategy for Ortus, but it is not the best strategy for Wheels. + +Wheels should also not try to match Laravel's ecosystem breadth, Django's built-in admin depth, or Rails' RubyGems ecosystem. Those are ecosystem-level advantages, not single-release feature gaps. + +Instead, Wheels should compete on: + +- CFML-native productivity. +- Engine neutrality. +- Simpler conventions. +- Built-in ORM ergonomics. +- Modern CLI and distribution. +- Strong automated compatibility testing. +- A smaller, clearer framework surface. + +### 3.3 The ColdBox / BoxLang Lesson + +ColdBox has become a vertically integrated platform play. ColdBox 8 runs on BoxLang, Lucee, and Adobe CF, but the direction is clearly optimized around BoxLang because Ortus controls both the language/runtime and framework. + +That gives ColdBox real advantages: + +- Runtime/framework co-design. +- Faster platform-level innovation. +- One organization controlling docs, CLI, runtime, modules, support, and release cadence. +- Stronger professional support loop. + +It also creates a strategic opening for Wheels: + +- Wheels can be the neutral CFML framework. +- Wheels can support BoxLang without being BoxLang-first. +- Wheels can make ACF/Lucee/BoxLang parity a brand promise. +- Wheels can appeal to teams that want modernization without moving into the full Ortus platform. +- Wheels can answer vertical integration with open ecosystem integration: LuCLI for tooling/runtime workflow, RustCFML for future engine pressure-testing, and a public conformance suite for all engines. + +Recommendation: + +> Treat BoxLang as a first-class supported engine, not the primary optimization target. + +This should be backed by documentation and CI: + +- Every major release should publish an engine compatibility table. +- The public test matrix should show ACF, Lucee, and BoxLang status. +- Engine-specific behavior should be isolated behind adapters, not scattered through core code. +- Experimental engines such as RustCFML should be used to expose assumptions and codify framework/runtime contracts before they are treated as production targets. + +--- + +## 4. Current Wheels 4 Assessment + +### 4.1 Strengths To Preserve + +Wheels 4 has several important strengths that should remain central in Wheels 5. + +#### Full-Stack Productivity + +Wheels has the classic full-stack pieces: + +- Routing. +- Controllers. +- Views and layouts. +- ORM. +- Migrations. +- Form helpers. +- URL helpers. +- Flash/session helpers. +- Tests. +- CLI generators. + +The value is not only that these exist. The value is that they are integrated and convention-driven. + +#### ORM Ergonomics + +The Wheels ORM remains a major differentiator inside CFML: + +- Active Record style. +- Associations. +- Validations. +- Callbacks. +- Scopes. +- Query builder. +- Enums. +- Bulk operations. +- Polymorphic associations. +- Multi-database support. + +Wheels should continue to lead with the ORM story. + +#### Multi-Engine and Multi-Database Support + +Wheels supports a broad engine/database surface. That is expensive, but it is strategically important. The competition with ColdBox makes this more important, not less. + +The framework should continue to support: + +- Lucee. +- Adobe ColdFusion. +- BoxLang. +- SQLite. +- PostgreSQL. +- MySQL/MariaDB. +- SQL Server. +- Oracle. +- CockroachDB. +- H2 where practical for Lucee. + +Not all combinations need to be equally important, but the supported combinations should be explicit. + +#### LuCLI-Based CLI and Distribution + +The move to LuCLI and distribution through Homebrew, Scoop, apt, and yum/dnf is a major shift. It means Wheels can now offer a clean install story without requiring developers to understand CommandBox first. + +This is not just a CLI detail. It changes the testing and release strategy: + +- The public `wheels` binary can become the canonical test harness. +- Generated app smoke tests can run from the same CLI users install. +- Package install tests can validate real distribution channels. +- CI and local development can use the same commands. + +Because there is an active working relationship with Mark Drew, the creator of LuCLI, Wheels can do more than consume LuCLI. Wheels can help shape LuCLI capabilities upstream in ways that benefit both projects: + +- Stable module APIs. +- Reliable server lifecycle primitives. +- Machine-readable output. +- Cross-platform wrapper behavior. +- Engine profile handling. +- CI/test primitives. +- Module install and update hooks. + +This changes the Wheels 5 roadmap. CLI needs should not be implemented as Wheels-only hacks when they can become reusable LuCLI capabilities. + +#### RustCFML As A Conformance Partner + +RustCFML should not be treated as a primary production engine target for Wheels 5. It should be treated as an experimental conformance partner. + +That is still strategically valuable. A newer engine implementation can reveal hidden assumptions in Wheels that Lucee, Adobe CF, and BoxLang may tolerate through legacy behavior. RustCFML can become a strict pressure test for: + +- CFScript parsing. +- CFC construction. +- Method invocation. +- `argumentCollection`. +- Scope lookup. +- Struct/array/query behavior. +- Include semantics. +- JSON serialization. +- Request simulation. +- Controller dispatch. +- Eventually ORM and query behavior. + +The relationship with Alex Skinner can help Wheels define clearer runtime contracts while giving RustCFML real framework-driven compatibility targets. + +#### Built-In Testing Infrastructure + +Wheels already has: + +- Core WheelsTest specs. +- CLI module specs. +- Browser testing support. +- Playwright artifacts. +- HTTP test clients. +- Parallel test runner work. +- GitHub workflows for fast PR tests and broader compatibility matrix tests. + +This is enough foundation to turn testing into a core framework advantage. + +### 4.2 Weaknesses To Address + +#### Too Much Runtime Magic + +Wheels has historically leaned on component variables, included mixins, unscoped lookup, and dynamic invocation. That helped create a terse developer experience, but it makes the framework harder to reason about as it grows. + +Examples: + +- Controller actions currently access `params` through unscoped lookup from `variables.params`. +- Controller methods are invoked dynamically through `$invoke()`. +- Mixins are integrated into controller, view, model, and global scopes. +- Legacy plugins can still inject behavior dynamically. + +Wheels 5 should not remove all magic. It should make the magic observable and optional. + +#### Legacy Drag + +Wheels 4 already marks some legacy surfaces as deprecated. Wheels 5 is the right time to remove or isolate them. + +Candidates: + +- Legacy `plugins/` behavior in favor of the modern package system. +- RocketUnit compatibility paths, after a clear migration window. +- Old TestBox naming aliases if retained only for 4.x compatibility. +- CommandBox-era CLI documentation and command references. +- Old asset pipeline paths if Vite and modern asset handling are the preferred direction. +- Deprecated MCP HTTP endpoints if stdio MCP is the supported path. + +The goal is not to break apps for sport. The goal is to make Wheels 5 internally smaller and easier to test. + +#### Documentation Drift + +The codebase has moved faster than the docs. This showed up during the review in CLI notes, testing roadmap notes, and framework capability docs that still describe older directions. + +Wheels 5 should not ship with a docs backlog. Documentation should be part of the release gate. + +#### Compatibility Ambiguity + +The README, version checks, CI matrix, and release docs should all agree on supported engines and versions. + +During review, there were signs of drift in engine minimum checks and current support claims. Wheels 5 should make compatibility declarations executable: + +- Configured in one place. +- Tested in CI. +- Rendered into docs. +- Used by CLI `wheels doctor`. + +--- + +## 5. Roadmap Principles + +These principles should guide Wheels 5 decisions. + +### 5.1 Keep The Friendly API, Add Explicit Internals + +Rails kept `params`. It did not force controller actions to accept request arguments. But Rails changed what `params` is: a safer parameter object with strong parameter behavior. + +Wheels should follow that pattern. + +Keep this: + +```cfml +function show() { + post = model("Post").findByKey(params.key); +} +``` + +Enable this: + +```cfml +function show(required struct params, required any rc) { + post = model("Post").findByKey(params.key); +} +``` + +And eventually encourage this for more explicit code: + +```cfml +function show(required any rc) { + post = model("Post").findByKey(rc.params.key); +} +``` + +The user-facing progression should be gentle: + +1. Old code works unchanged. +2. New generators use the clearer style. +3. `wheels doctor` detects risky patterns. +4. Strict mode allows teams to opt out of legacy globals. + +### 5.2 Prefer Contracts Over Conventions Where The Framework Boundary Is Crossed + +Conventions are good inside an app. Contracts are better at framework boundaries. + +Wheels 5 should define contracts for: + +- Request context. +- Response object. +- Route metadata. +- Middleware. +- Package lifecycle. +- Service providers. +- Job handlers. +- Scheduler tasks. +- Test harness output. +- Engine adapters. +- Database adapters. + +This does not mean every app developer must write more code. It means framework internals and extension points become predictable. + +### 5.3 Treat Testing As Product Infrastructure + +For a multi-engine, multi-database framework, testing is not a backend concern. It is part of the product. + +Wheels should be able to say: + +> Every release is tested against a published engine/database matrix, generated apps, CLI distribution packages, browser tests, and upgrade paths. + +That claim would be a real differentiator in the CFML ecosystem. + +### 5.4 Make Engine Neutrality Visible + +Engine neutrality should not be merely aspirational. + +Wheels 5 should publish: + +- Supported engine versions. +- Supported database combinations. +- Known soft-fail combinations. +- Last successful matrix run. +- Engine-specific caveats. +- Upgrade guidance by engine. + +The CLI should expose the same: + +```bash +wheels doctor compatibility +wheels doctor matrix +``` + +### 5.5 Turn Partnerships Into Product Architecture + +The relationships with Mark Drew and Alex Skinner should change how Wheels plans major versions. + +Without those relationships, Wheels would mostly react to tooling and runtime behavior after it appears. With those relationships, Wheels can help shape upstream capabilities before they harden: + +- LuCLI can gain generic features that Wheels needs, instead of Wheels carrying custom wrappers forever. +- RustCFML can use Wheels as a realistic compatibility target, instead of only testing isolated language features. +- Wheels can define conformance contracts that make every engine integration less ambiguous. +- The broader CFML ecosystem gets shared infrastructure instead of another framework-specific island. + +This means the Wheels 5 roadmap should be structured around contracts first: + +```text +define runtime/tooling contract +build conformance suite +implement framework feature against the contract +upstream missing LuCLI/RustCFML capability where possible +verify across supported engines and distributions +``` + +The key inversion: + +```text +Old model: build v5 features, then test them across engines. +New model: define contracts, prove them in conformance tests, then build v5 features against those contracts. +``` + +This is the strongest open alternative to the ColdBox/BoxLang vertical integration story. + +--- + +## 6. Runtime And Tooling Partnerships + +### 6.1 Partnership Strategy + +Wheels 5 should formally recognize LuCLI and RustCFML as strategic ecosystem partners. + +This does not mean Wheels becomes dependent on either project in a fragile way. It means the roadmap should deliberately identify work that belongs upstream, work that belongs in Wheels, and work that should be captured as shared conformance tests. + +Recommended partnership posture: + +- **LuCLI:** official platform layer for the installed `wheels` developer experience. +- **RustCFML:** experimental runtime/conformance partner. +- **Lucee, Adobe CF, BoxLang:** supported runtime targets with release-gate visibility. +- **Wheels:** reference framework and conformance driver. + +This gives Wheels a credible strategic answer to vertically integrated stacks: + +- ColdBox/BoxLang: one vendor optimizes the whole stack. +- Wheels/LuCLI/RustCFML/Lucee/Adobe/BoxLang: open ecosystem compatibility driven by public contracts and tests. + +The Wheels 5 roadmap should therefore be tracked in four parallel workstreams: + +1. **Framework Core:** RequestContext, params, response objects, modules, packages, routing, configuration, DI, jobs, and deprecations. +2. **Platform / LuCLI:** CLI command contracts, server lifecycle, generated app workflows, distribution install paths, machine-readable output, and `wheels ci run`. +3. **Engine Compatibility / Conformance:** Lucee, Adobe CF, BoxLang, RustCFML experimental support, engine adapters, and shared conformance tests. +4. **Release Infrastructure:** GitHub Actions, Proxmox/self-hosted runners, nightly matrix, RC gates, package canaries, dashboards, and docs gates. + +Each Wheels 5 feature should declare which workstream owns it and which other workstreams it depends on. For example, RequestContext is Framework Core, but it depends on Engine Compatibility because action argument injection must behave consistently across engines. + +### 6.2 LuCLI As The Wheels Platform Layer + +LuCLI should be treated as the official substrate for the `wheels` CLI, local dev server, generated app workflows, and CI entry points. + +Wheels should continue to own: + +- User-facing `wheels` command design. +- Framework generators. +- Project templates. +- Wheels-specific test commands. +- Wheels-specific deploy commands. +- Release packaging. +- Documentation. + +LuCLI should own or grow generic capabilities: + +- Module discovery and execution. +- Server lifecycle APIs. +- Stable process and exit-code behavior. +- Engine profile selection. +- URL rewriting support. +- Machine-readable command output. +- Cross-platform binary behavior. +- Module installation/update primitives. +- Script execution and embedded runtime behavior. + +Wheels should contribute upstream where the capability is generic. Examples: + +```text +Need: reliable server start/stop/status for Wheels CI. +Best home: LuCLI server lifecycle API. + +Need: JSON output for command automation. +Best home: LuCLI output mode conventions plus Wheels command implementations. + +Need: stable module install/update hooks. +Best home: LuCLI module system. + +Need: cross-platform wrapper parity. +Best home: LuCLI and Wheels distribution scripts together. +``` + +This reduces long-term Wheels-specific glue and makes LuCLI stronger for other CFML projects. + +### 6.3 RustCFML As A Strict Experimental Engine + +RustCFML should be treated as an experimental engine target for Wheels 5, not as a production support promise. + +Its value is different: + +- It can expose hidden assumptions in Wheels. +- It can reveal places where Wheels depends on Lucee/ACF quirks. +- It can help define minimal CFML semantics needed by modern framework code. +- It can become a fast future runtime or tooling target if it matures. + +Initial RustCFML goals should be modest and explicit: + +1. Parse the CFScript style used in Wheels core. +2. Construct CFCs used by simple controllers/models/services. +3. Support method invocation and `argumentCollection`. +4. Support struct/array operations used by dispatch and params handling. +5. Support includes enough for generated app templates. +6. Support JSON serialization/deserialization. +7. Run a small no-database controller/request conformance suite. +8. Later, run selected ORM/query conformance tests. + +RustCFML should appear in the compatibility matrix as: + +```yaml +rustcfml: + support: experimental + purpose: conformance + releaseBlocking: false +``` + +That status should stay honest. Experimental means useful signal, not a promise to users. + +### 6.4 Wheels Conformance Suite + +The most important partnership artifact should be a Wheels conformance suite. + +This should be separate from the full application test suite. The conformance suite defines minimum framework/runtime/tooling contracts. + +Proposed layout: + +```text +tests/conformance/ + language/ + cfscript-basics/ + closures/ + scopes/ + structs-arrays/ + json/ + cfc/ + construction/ + inheritance/ + mixins/ + invoke/ + argument-collection/ + on-missing-method/ + request/ + params-merge/ + request-context/ + headers/ + cookies/ + method-override/ + controller/ + action-invocation/ + filters/ + render-response/ + redirects/ + routing/ + matching/ + constraints/ + route-model-binding/ + orm/ + query-generation/ + basic-crud/ + associations/ + cli/ + exit-codes/ + json-output/ + server-lifecycle/ + generated-app/ + scaffold-smoke/ + migration-smoke/ +``` + +The conformance suite should answer questions like: + +- What CFML behavior does Wheels require? +- What method invocation semantics must an engine support? +- How does Wheels expect `argumentCollection` to behave? +- What request/CGI/session/cookie scopes must exist? +- What params merging behavior is required? +- What CLI exit codes and JSON shapes does automation rely on? + +### 6.5 Contract Artifacts + +Every major Wheels 5 architectural feature should produce a contract artifact: + +- `RequestContext` contract. +- Params object contract. +- Response object contract. +- Module lifecycle contract. +- Package lifecycle contract. +- CLI command output contract. +- Engine adapter contract. +- Database adapter contract. +- Test result JSON/JUnit contract. + +These contracts can live under: + +```text +docs/contracts/ +``` + +Suggested files: + +```text +docs/contracts/request-context.md +docs/contracts/params.md +docs/contracts/response.md +docs/contracts/modules.md +docs/contracts/packages.md +docs/contracts/cli-output.md +docs/contracts/engine-adapters.md +docs/contracts/test-results.md +``` + +This is where Wheels can become valuable beyond its own codebase. LuCLI, RustCFML, and other tooling can implement against these contracts. + +### 6.6 Upstream-First Policy + +Adopt an upstream-first policy for generic tooling/runtime needs. + +When a missing capability is found: + +1. Decide whether it is Wheels-specific or generally useful. +2. If generally useful, open/design it upstream in LuCLI or RustCFML. +3. Add a conformance test in Wheels. +4. Consume the upstream capability once available. +5. Keep temporary Wheels shims small and documented. + +Examples: + +- Server lifecycle reliability belongs in LuCLI. +- Binary wrapper behavior may span LuCLI and distribution scripts. +- RequestContext is Wheels-specific. +- `argumentCollection` semantics belong in engine conformance. +- Strong params belongs in Wheels. +- CLI JSON output shape spans LuCLI conventions and Wheels command output. + +### 6.7 Governance And Coordination + +Keep governance lightweight but explicit. + +Recommended mechanisms: + +- Add `upstream-lucli`, `upstream-rustcfml`, and `engine-contract` labels. +- Track cross-repo work through GitHub issues and milestones. +- Use short RFCs for shared contracts. +- Link upstream PRs from Wheels issues. +- Add a quarterly compatibility review before major release milestones. + +Suggested RFC path: + +```text +docs/rfcs/ + 0001-request-context.md + 0002-cli-json-output.md + 0003-engine-conformance-suite.md +``` + +The process should stay practical. The goal is not bureaucracy. The goal is to prevent critical upstream assumptions from living only in chat threads or maintainer memory. + +--- + +## 7. Major Recommendations + +## 7.1 Introduce RequestContext While Preserving `params` + +### Problem + +Wheels currently exposes request data through a plain-ish `params` struct stored on the controller instance. This is ergonomic, but it conflates several concepts: + +- Query string params. +- Form params. +- JSON body params. +- Route params. +- Framework routing metadata. +- Potentially resolved route model bindings. + +It also relies on unscoped CFML variable resolution. That makes code pleasant to write, but harder to reason about and test. + +### Rails Lesson + +Rails started with a merged `params` hash. In Rails 2.3 it was documented as `HashWithIndifferentAccess`, merging query string, POST data, and route params. Modern Rails still exposes `params`, but it is now `ActionController::Parameters`, not a plain hash. Rails 4 introduced Strong Parameters so raw params cannot be mass-assigned into models without explicit permission. + +Rails did not remove `params`. It made `params` safer. + +### Recommendation + +Add a first-class `RequestContext` object or struct-like component. It should be created during dispatch and attached to the request and controller. + +Initial shape: + +```cfml +rc = { + params = params, + route = routeInfo, + controller = params.controller, + action = params.action, + method = request.cgi.request_method, + format = params.format ?: "html", + requestId = "...", + headers = requestHeaders, + cookies = cookie, + session = session, + flash = flashScope, + env = environmentInfo +} +``` + +Controller initialization should set: + +```cfml +variables.rc = requestContext; +variables.params = variables.rc.params; +request.wheels.rc = requestContext; +request.wheels.params = variables.rc.params; +``` + +Action invocation should support compatibility injection: + +```cfml +$invoke( + method = arguments.action, + invokeArgs = { + rc = variables.rc, + params = variables.rc.params + } +); +``` + +Important rule: + +> `params`, `rc.params`, `variables.params`, and `request.wheels.params` should initially reference the same underlying object. + +Do not copy the params struct in normal request flow. Copies create synchronization bugs. + +### Engine Caveat + +Before implementation, verify behavior across Lucee, Adobe CF, and BoxLang: + +- Does each engine ignore extra named arguments passed to a method that declares no arguments? +- Does each engine allow an action declaring `params` and/or `rc` to receive those values consistently? +- Does `onMissingMethod` receive these arguments safely? + +If any supported engine rejects undeclared named args, use metadata introspection: + +- Pass `params` only when the action declares `params`. +- Pass `rc` only when the action declares `rc`. +- Keep `variables.params` and `variables.rc` always available. + +### Developer Experience + +Existing code remains valid: + +```cfml +function update() { + user = model("User").findByKey(params.key); + user.update(params.user); +} +``` + +New generated code can use explicit args: + +```cfml +function update(required struct params, required any rc) { + user = model("User").findByKey(params.key); + user.update(userParams(params)); +} +``` + +Or: + +```cfml +function update(required any rc) { + user = model("User").findByKey(rc.params.key); + user.update(userParams(rc.params)); +} +``` + +### Why This Matters + +This gives Wheels a bridge: + +- Old apps stay easy. +- New apps become clearer. +- Tests can construct request contexts directly. +- Middleware can work against a stable request object. +- Packages can inspect request metadata without depending on global scopes. +- Future strict mode becomes realistic. + +--- + +## 7.2 Add Strong Params / Parameter Contracts + +### Problem + +Wheels has model-level mass assignment protections through accessible/protected properties, but controller-level parameter intent is not as strong or expressive as modern Rails Strong Parameters. + +The risky pattern is: + +```cfml +user.update(params.user); +``` + +That is convenient, but the controller does not explicitly declare which submitted keys are expected. + +### Recommendation + +Create a Wheels parameter object with safe filtering and shape validation. + +The object should remain easy to use like a struct where practical, but it should offer explicit APIs: + +```cfml +params.require("user"); +params.permit("name,email,timezone"); +params.expect(user = ["name", "email", "timezone"]); +params.toStruct(); +``` + +Recommended APIs: + +```cfml +params.require("user") +``` + +Requires a top-level key. Raises a 400-style exception when missing. + +```cfml +params.permit("name,email,timezone") +``` + +Returns only permitted scalar keys from the current params object. + +```cfml +params.expect(user = ["name", "email", "timezone"]) +``` + +Requires `user`, ensures it has the expected shape, and returns permitted values. + +```cfml +params.expectArray("ids") +``` + +Requires an array-like param and normalizes it. + +```cfml +params.unpermittedKeys() +``` + +Returns submitted keys that were not permitted. + +```cfml +params.permitted() +``` + +Returns true when this parameter object has passed through a permit/expect call. + +```cfml +params.toStruct() +``` + +Returns a plain struct only when permitted, unless strict mode is disabled. + +### Suggested Controller Pattern + +```cfml +function create(required struct params) { + user = model("User").create(userParams(params)); + + if (user.hasErrors()) { + renderView(action = "new"); + return; + } + + redirectTo(route = "user", key = user.id); +} + +private struct function userParams(required any params) { + return params.expect(user = ["name", "email", "timezone"]); +} +``` + +### Compatibility + +Do not break direct struct access in Wheels 5. + +The transition should be: + +1. Wheels 5 introduces parameter contracts. +2. Generators use parameter contracts. +3. `wheels doctor` warns on direct mass assignment from raw `params`. +4. Strict mode can reject raw params passed to model mutation methods. +5. A later major version can consider stricter defaults. + +### Why This Matters + +This is the most Rails-aligned improvement Wheels can make to `params`. It preserves the friendly controller API while moving security and intent to the boundary where user input enters the application. + +--- + +## 7.3 Add First-Class Application Modules + +### Problem + +Wheels has plugins and packages, but it does not yet have a first-class concept for bounded application modules. A plugin/package is a reusable extension mechanism. A module is an application boundary. + +Examples: + +- Admin. +- Billing. +- API. +- Reporting. +- Tenant management. +- Support portal. + +These parts often need local routes, controllers, views, services, jobs, tests, and assets. + +### Lessons From FW/1 and ColdBox + +FW/1 has subsystems. They allow a larger app to be split into smaller convention-based mini-apps with their own controllers, views, layouts, and model/service conventions. + +ColdBox has HMVC modules. Its module system is much broader and more enterprise-oriented. Wheels should not copy the entire ColdBox model, but the idea of a bounded app module is valuable. + +### Recommendation + +Add first-class Wheels modules with a small convention: + +```text +app/modules/admin/ + Module.cfc + config/routes.cfm + controllers/ + models/ + services/ + views/ + jobs/ + tests/ +``` + +The top-level app remains the main app. Modules are mounted into it. + +Example route: + +```cfml +mapper() + .module("admin", path = "/admin") + .module("api", path = "/api"); +``` + +Or: + +```cfml +mapper().scope(path = "/admin", module = "admin", function() { + resources("users"); +}); +``` + +### Module Lifecycle + +Each module should support a minimal lifecycle: + +```cfml +component { + function register() {} + function routes(mapper) {} + function boot() {} +} +``` + +Where: + +- `register()` registers services, settings, jobs, middleware. +- `routes(mapper)` contributes routes. +- `boot()` runs after the app and module graph are loaded. + +### What Modules Should Not Do + +Avoid building a full ColdBox HMVC clone. + +For Wheels 5, modules do not need: + +- Independent request lifecycles. +- Complex parent/child event bubbling. +- Broad AOP features. +- Deep per-module interceptors. +- Separate dependency injection containers by default. + +Keep modules as a simple app organization boundary first. + +### CLI Support + +```bash +wheels generate module admin +wheels generate module api --api +wheels routes --module=admin +wheels test run --module=admin +``` + +### Why This Matters + +Modules give larger Wheels apps a growth path without abandoning the framework's simplicity. They also create a natural place for future package extraction: + +- Start as app module. +- Stabilize API. +- Extract into package if reusable. + +--- + +## 7.4 Consolidate Packages And Remove Legacy Plugin Drag + +### Problem + +Wheels currently has a modern package system and legacy plugin compatibility. The legacy path is useful for migration, but it increases startup complexity, loader complexity, documentation complexity, and test surface. + +### Recommendation + +Make Wheels 5 the removal point for legacy plugin behavior, with a compatibility package if needed. + +Recommended path: + +1. Wheels 4.x continues to warn when legacy plugins load. +2. Wheels 4.x ships `wheels plugin migrate` or `wheels package migrate`. +3. Wheels 5 removes automatic legacy plugin loading from core. +4. Wheels 5 optionally provides `wheels-legacy-plugin-adapter` as a package. + +### Package System Direction + +The modern package system should become the only extension story: + +- `package.json` manifest. +- Declared mixin targets. +- Service providers. +- Dependencies. +- Replaces/suggests. +- Lazy loading. +- Version compatibility. +- Explicit lifecycle. + +### Needed Improvements + +Add stronger validation: + +```bash +wheels package validate +wheels package doctor +wheels package graph +``` + +Add better docs: + +- How to build a package. +- How package lifecycle works. +- How package mixins are resolved. +- How conflicts are handled. +- How packages differ from app modules. + +### Module vs Package Rule + +Document this clearly: + +- A **module** is part of one app. +- A **package** is reusable across apps. +- A package can provide a module. +- An app module can later be extracted into a package. + +--- + +## 7.5 Add A Fluent Response Object + +### Problem + +Wheels has many rendering and redirection helpers, but controller response intent can be scattered: + +- `renderText`. +- `renderWith`. +- `renderView`. +- `redirectTo`. +- `sendFile`. +- Status/header manipulation. + +For APIs, jobs dashboards, MCP, and generated JSON endpoints, a unified response builder would clarify intent. + +### Lessons From FW/1 and Modern Frameworks + +FW/1 has `renderData().data(...).type(...).statusCode(...).header(...)`. Laravel has response helpers. Rails has `render` and `redirect_to` with structured options. + +Wheels can add a fluent API without removing existing helpers. + +### Recommendation + +Add: + +```cfml +response() + .status(201) + .json(user) + .header("Location", urlFor(route = "user", key = user.id)); +``` + +Examples: + +```cfml +return response().json({ok = true}); +``` + +```cfml +return response() + .status(422) + .json({ + errors = user.allErrors() + }); +``` + +```cfml +return response() + .redirectTo(route = "posts") + .flash("success", "Post created"); +``` + +```cfml +return response() + .file(path = local.path, disposition = "attachment"); +``` + +### Compatibility + +Existing helpers should remain: + +```cfml +renderWith(user); +redirectTo(route = "posts"); +``` + +The response object should be additive in Wheels 5. + +### Why This Matters + +A response object helps: + +- API generators. +- Tests. +- Middleware. +- Route docs. +- MCP tools. +- Strict controller contracts. +- Future async or streaming responses. + +--- + +## 7.6 Add Route Metadata, Route Inspection, And API Documentation Hooks + +### Problem + +Routes are executable configuration, but not enough of their intent is machine-readable. + +For modern tooling, routes should expose: + +- Description. +- Tags. +- Auth requirements. +- Rate limits. +- Request schema. +- Response type. +- Deprecation state. +- Feature/module ownership. + +### Recommendation + +Extend route declarations with optional metadata: + +```cfml +post( + name = "apiUsersCreate", + pattern = "/api/users", + to = "api.users##create", + description = "Create a user", + tags = "api,users", + auth = "admin", + rateLimit = "apiWrite", + request = "CreateUserRequest", + response = "UserResponse" +); +``` + +For resources: + +```cfml +resources( + "users", + module = "admin", + auth = "admin", + tags = "admin,users" +); +``` + +### Tooling + +Add: + +```bash +wheels routes +wheels routes --json +wheels routes --openapi +wheels routes --module=admin +wheels routes --deprecated +wheels doctor routes +``` + +### Debug Panel + +Add a route trace view: + +- Matched route. +- Params extracted. +- Middleware applied. +- Controller/action. +- Format negotiation. +- Route model binding result. +- Auth/rate-limit metadata. + +### Why This Matters + +Route metadata becomes a foundation for: + +- API docs. +- MCP context. +- Test generation. +- Security review. +- Dead route detection. +- Route-level deprecation. +- Better developer debugging. + +--- + +## 7.7 Make Lifecycle Hooks Explicit And Traceable + +### Problem + +Wheels has a request lifecycle, but it is not exposed as clearly as it could be. As the framework gains middleware, modules, packages, DI, route model binding, and response objects, developers need to understand what ran and in what order. + +### FW/1 Lesson + +FW/1 is good at lifecycle clarity: + +- App setup. +- Controller before. +- Action. +- Controller after. +- View setup. +- Response setup. + +Wheels should not copy FW/1 directly, but it should expose a clear lifecycle trace. + +### Recommendation + +Document and instrument the lifecycle: + +```text +request start + parse params + build request context + match route + route model binding + middleware before + controller init + service injection + verification + before filters + action + render/response + after filters + middleware after +request end +``` + +Add debug tooling: + +```bash +wheels trace /posts/1 +wheels routes match GET /posts/1 +``` + +And in the debug panel: + +- Timeline. +- Hooks. +- Filters. +- Middleware. +- SQL queries. +- DI resolutions. +- Package/module contributions. + +### Why This Matters + +This gives developers confidence in a framework that still uses conventions. It also makes AI coding tools more effective because they can inspect the framework's actual behavior. + +--- + +## 7.8 Strengthen DI Without Making It The Center Of The Framework + +### Problem + +Wheels now has a real DI container. That is valuable, but Rails-style frameworks should not make DI ceremony mandatory for basic work. + +### Laravel Lesson + +Laravel's service container is a major strength, but it is also part of Laravel's larger platform complexity. Wheels should adopt the useful parts without making every controller feel enterprise-heavy. + +### FW/1 DI/1 Lesson + +DI/1's convention-based service discovery is approachable: + +- `model/services` as services. +- `model/beans` as transient beans. +- Property injection by convention. + +Wheels can use a similar optional discovery model. + +### Recommendation + +Keep explicit DI registration: + +```cfml +map("mailer").to("app.services.Mailer").asSingleton(); +bind("PaymentGateway").to("StripeGateway"); +``` + +Add optional service discovery: + +```text +app/services/ +app/repositories/ +app/policies/ +app/actions/ +``` + +With conventions: + +- Services default to singleton unless marked otherwise. +- Actions default to transient. +- Repositories default to singleton/request-scoped depending on datasource use. +- Policies default to singleton. + +Add CLI inspection: + +```bash +wheels services +wheels services graph +wheels services doctor +``` + +### Controller Usage + +Keep simple helper access: + +```cfml +mailer = service("mailer"); +``` + +Allow declarative injection: + +```cfml +function config() { + inject("userService"); +} +``` + +Avoid requiring constructor injection for standard controller actions in Wheels 5. + +--- + +## 7.9 Add Scheduler And Lightweight Async On Top Of Jobs + +### Problem + +Wheels 4 has database-backed jobs. That is a strong zero-dependency foundation. But modern frameworks also expose scheduled tasks and async execution patterns. + +ColdBox has scheduled tasks and async/futures. Laravel has scheduler and queues. Rails has Active Job and now richer job continuation support. + +### Recommendation + +Build on Wheels jobs rather than adding a separate system. + +Add scheduler definitions: + +```cfml +// config/schedule.cfm +schedule() + .job("SendDailyDigest") + .dailyAt("08:00"); + +schedule() + .task("cleanupTmp") + .everyMinutes(30); +``` + +Add CLI: + +```bash +wheels schedule list +wheels schedule run +wheels schedule work +wheels jobs work +``` + +Add minimal async: + +```cfml +future = async(function() { + return expensiveOperation(); +}); + +result = future.await(timeout = 30); +``` + +Keep this small. Do not clone the full ColdBox async surface. + +### Priority + +This is a second-wave Wheels 5 feature, not a prerequisite for the first alpha. + +--- + +## 7.10 Make Configuration Schema-Driven + +### Problem + +As Wheels adds more settings, config drift becomes harder to debug. Settings should be discoverable, typed, validated, and explainable. + +### Recommendation + +Add a configuration schema: + +```cfml +setting( + name = "routeModelBinding", + type = "boolean", + default = false, + environment = "all", + description = "Enables automatic route model binding" +); +``` + +Then expose: + +```bash +wheels config list +wheels config get routeModelBinding +wheels config doctor +wheels config explain routeModelBinding +``` + +### Environment Layering + +Adopt explicit layering: + +```text +framework defaults +app defaults +environment config +host/tenant overrides +runtime env vars +``` + +Show final resolved config: + +```bash +wheels config effective --environment=production +``` + +### FW/1 Lesson + +FW/1's `variables.framework` config and environment override model is simple and understandable. Wheels can take the clarity without adopting the same API. + +--- + +## 7.11 Treat CLI And Distribution As Release-Critical + +### Problem + +The LuCLI-based CLI is now the public face of Wheels. It is how many developers will first experience the framework. It is also how CI, generated apps, and distribution can be tested. + +### Recommendation + +Make this rule explicit: + +> If a user can install Wheels through Homebrew, Scoop, apt, or yum/dnf, the release is not done until that install path has been tested on a clean system. + +### Required Canaries + +For every release candidate and final release: + +```bash +wheels --version +wheels new smokeapp +cd smokeapp +wheels start +wheels generate scaffold Post title:string body:text +wheels dbmigrate latest +wheels test run +wheels routes +wheels doctor +``` + +Run these through: + +- Homebrew on macOS. +- Scoop on Windows. +- apt on Ubuntu/Debian. +- yum/dnf on Rocky/RHEL. + +### Why This Matters + +The CLI is not just tooling. It is part of the framework's trust story. A clean public install path is worth more than another advanced feature. + +--- + +## 7.12 Keep The Monorepo + +### Recommendation + +Keep the monorepo for Wheels 5. + +### Rationale + +The repo now contains tightly coupled components: + +- Framework core. +- CLI module. +- Generated app templates. +- Test runner. +- Browser testing infrastructure. +- Build scripts. +- Package definitions. +- Distribution drafts. +- Release workflows. +- Compatibility matrix. + +Splitting these into separate repos would create version skew: + +- CLI expects a framework template version. +- Framework tests expect CLI endpoints. +- Generated apps depend on template and core alignment. +- Distribution packages need framework and CLI artifacts together. +- Release canaries must test the combined product. + +### What Can Stay Separate + +Separate repos still make sense for: + +- Homebrew tap. +- Scoop bucket. +- apt repository metadata. +- yum/dnf repository metadata. +- Public docs site deployment, if operationally cleaner. +- Truly independent packages once their APIs stabilize. + +### Monorepo Improvements + +Use path filters and clear ownership areas: + +```text +vendor/wheels/ framework core +cli/lucli/ CLI module +tests/ generated app testing +vendor/wheels/tests/ framework core tests +cli/lucli/tests/ CLI tests +tools/ci/ CI harness +tools/build/ build/release +tools/distribution-drafts/ +docs/ +``` + +Add a top-level `CONTRIBUTING` section for which tests to run based on touched paths. + +--- + +## 8. Automated Testing Strategy + +Testing needs a full design, because Wheels has a broader compatibility target than most frameworks. + +### 8.1 Test Tiers + +Use tiers with clear purpose. + +#### Tier 0: Static And Metadata Checks + +Runs on every PR. + +Includes: + +- Commit/PR title lint. +- JSON/YAML validation. +- Manifest validation. +- API docs generation validation. +- Route/config metadata validation if added. +- Basic formatting or syntax checks where available. + +Goal: under 2 minutes. + +#### Tier 1: Fast PR Gate + +Runs on every PR and blocks merge. + +Current seed exists in [`.github/workflows/pr.yml`](../../.github/workflows/pr.yml): Lucee 7 + SQLite through LuCLI. + +Recommended contents: + +- Lucee latest + SQLite. +- Core WheelsTest. +- CLI module tests. +- Generated app smoke. +- Minimal browser smoke. +- `wheels doctor`. + +Target: 5 to 10 minutes. + +Example: + +```bash +wheels ci run --engine=lucee7 --db=sqlite --suite=core,cli,generated,browser-smoke +``` + +#### Tier 2: Conditional PR Matrix + +Runs based on changed paths or labels. + +Examples: + +- ORM/query/migration changes: + - PostgreSQL. + - MySQL. + - SQLite. +- SQL Server adapter changes: + - SQL Server lane. +- Oracle adapter changes: + - Oracle lane. +- Engine adapter changes: + - Lucee + Adobe + BoxLang SQLite smoke. +- CLI/distribution changes: + - Linux package smoke. + - macOS Homebrew smoke if available. + - Windows Scoop smoke if available. +- Browser testing changes: + - Full browser specs. + +This keeps PR feedback relevant without running the entire universe every time. + +#### Tier 3: Nightly Compatibility Matrix + +Runs on schedule and manual dispatch. + +Current seed exists in [`.github/workflows/compat-matrix.yml`](../../.github/workflows/compat-matrix.yml). + +Recommended matrix: + +Engines: + +- Lucee 6. +- Lucee 7. +- Adobe 2023. +- Adobe 2025. +- BoxLang. + +Databases: + +- SQLite. +- PostgreSQL. +- MySQL/MariaDB. +- SQL Server. +- CockroachDB. +- Oracle. +- H2 where relevant. + +Nightly should: + +- Run all combinations that are supported. +- Publish a dashboard summary. +- Upload JUnit and JSON artifacts. +- Create or update GitHub issues for persistent failures. +- Avoid noisy Slack unless a previously green lane turns red. + +#### Tier 4: Release Candidate Gate + +Runs on RC branches and blocks release. + +Includes: + +- Full engine/database matrix. +- Generated app lifecycle tests. +- Upgrade tests from previous supported version. +- Package install tests using built artifacts. +- Browser tests. +- CLI smoke tests. +- Distribution canaries. +- Docs validation. + +RC should not tolerate hidden soft failures. If a lane is soft-fail, it must be named, documented, and linked to an issue. + +#### Tier 5: Post-Release Canaries + +Runs after release assets and package repositories publish. + +Tests public install paths: + +- Homebrew. +- Scoop. +- apt. +- yum/dnf. + +This catches the failure class that normal CI cannot catch: real users installing real artifacts through public channels. + +### 8.2 One Test Command Contract + +Add a first-class CI command: + +```bash +wheels ci run +``` + +Example options: + +```bash +wheels ci run --engine=lucee7 --db=sqlite --suite=core +wheels ci run --engine=adobe2025 --db=postgres --suite=core +wheels ci run --suite=cli,generated,browser +wheels ci run --matrix=nightly +wheels ci run --matrix=release +``` + +This command should be the shared contract for: + +- GitHub Actions. +- Local maintainers. +- Proxmox runners. +- Release workflows. +- Future dashboards. + +### 8.3 Matrix Manifest + +Create one source of truth: + +```text +tools/ci/matrix.yml +``` + +Example: + +```yaml +engines: + lucee7: + version: "7" + port: 60007 + support: primary + adobe2025: + version: "2025" + port: 62025 + support: primary + boxlang: + version: "1" + port: 60001 + support: compatibility + rustcfml: + version: "experimental" + support: experimental + purpose: conformance + releaseBlocking: false + +databases: + sqlite: + support: primary + postgres: + support: primary + mysql: + support: primary + sqlserver: + support: primary + oracle: + support: supported + cockroachdb: + support: supported + +lanes: + pr-fast: + - engine: lucee7 + db: sqlite + suites: [core, cli, generated, browser-smoke] + nightly: + include: all-supported + release: + include: all-supported + blocking: true +``` + +Use this manifest to generate: + +- GitHub Actions matrix. +- Local `wheels ci run --matrix`. +- Docs compatibility table. +- `wheels doctor compatibility`. +- Experimental conformance lanes for RustCFML and future engines. + +### 8.4 GitHub Actions vs Proxmox + +Use both. + +GitHub-hosted runners are best for: + +- Fast PR checks. +- Linux Lucee/SQLite. +- Docs validation. +- Basic packaging checks. +- Public OSS transparency. + +Proxmox/self-hosted runners are best for: + +- Heavy Adobe CF lanes. +- Oracle and SQL Server. +- Long-running browser suites. +- Fresh OS package canaries. +- Release candidate full gates. +- Ephemeral VM clean-room testing. + +Recommended progression: + +1. Start with a small static self-hosted runner pool. +2. Stabilize heavy lanes. +3. Move to ephemeral clone-per-job VMs for release canaries. +4. Publish results back to GitHub checks. + +### 8.5 Generated App Testing + +Every major feature should be tested in a generated app, not only in framework internals. + +Generated app smoke: + +```bash +wheels new smokeapp +cd smokeapp +wheels generate scaffold Post title:string body:text +wheels dbmigrate latest +wheels test run +wheels start +curl /posts +``` + +Why this matters: + +- Catches template drift. +- Catches CLI/framework version skew. +- Catches distribution issues. +- Catches docs examples that no longer work. + +### 8.6 Upgrade Testing + +Wheels 5 should test upgrades from: + +- Latest Wheels 4 stable. +- Last supported Wheels 3 version if a migration path remains. + +Upgrade test flow: + +```bash +wheels new app --version=4.x +apply fixture app changes +wheels upgrade --to=5 +wheels dbmigrate latest +wheels test run +``` + +Include fixtures for: + +- Legacy plugins. +- Packages. +- Route model binding. +- Raw `params` usage. +- Generated scaffold. +- Migrations. +- Jobs. +- Middleware. + +### 8.7 Conformance Testing + +Conformance testing should become a separate tier from full framework testing. + +Full framework tests answer: + +> Does Wheels work? + +Conformance tests answer: + +> Does this engine/tool/runtime satisfy the contracts Wheels requires? + +This distinction is important for RustCFML, LuCLI, and future engine/tooling integrations. A new runtime should not need to pass the full Wheels application suite before it can produce useful signal. It should be able to start with focused conformance lanes. + +Recommended conformance tiers: + +- **Language conformance:** syntax, scopes, structs, arrays, closures, JSON. +- **CFC conformance:** construction, inheritance, mixins, dynamic invocation, `argumentCollection`, `onMissingMethod`. +- **Request conformance:** CGI/request/session/cookie scope simulation, method override, headers, params merge. +- **Controller conformance:** action invocation, filters, rendering, redirecting, response object. +- **CLI conformance:** exit codes, JSON output, server lifecycle, module dispatch. +- **Generated app conformance:** minimal scaffold lifecycle. + +RustCFML should start with language/CFC/request/controller conformance. LuCLI should focus on CLI/server/module conformance. Lucee, Adobe CF, and BoxLang should run both conformance and full framework tests. + +The release dashboard should distinguish: + +```text +Engine Conformance Full Suite Support +Lucee 7 pass pass primary +Adobe 2025 pass pass primary +BoxLang pass partial/pass supported +RustCFML partial not-applicable experimental +``` + +--- + +## 9. Compatibility And Deprecation Plan + +### 9.1 Compatibility Defaults + +Wheels 5 should be conservative at runtime: + +- Existing controllers using unscoped `params` should work. +- Existing views should work. +- Existing model APIs should work unless explicitly deprecated. +- Existing migrations should work. +- Existing packages should work if they use the modern package system. + +But Wheels 5 should be stricter at tooling time: + +- `wheels doctor` should warn about deprecated APIs. +- Generators should use new idioms. +- Docs should stop teaching legacy patterns. +- CI should enforce new package/test/docs contracts. + +### 9.2 Candidate Removals + +Remove from core in Wheels 5: + +- Legacy `plugins/` automatic loading, or move to a compatibility package. +- RocketUnit as a first-class test style. +- Old `wheels.Test` alias if the deprecation period is complete. +- CommandBox-era CLI documentation and commands. +- Deprecated package/plugin formats. +- Deprecated HTTP MCP endpoint if stdio MCP is the supported path. +- Any legacy asset helpers superseded by the modern asset/Vite story. + +### 9.3 Candidate Strict Modes + +Add opt-in strict modes: + +```cfml +set(strictParams = true); +set(strictControllers = true); +set(strictRoutes = true); +set(strictPackages = true); +set(strictConfig = true); +``` + +Behavior examples: + +- `strictParams`: model mass assignment from raw params errors unless permitted. +- `strictControllers`: action names must not collide with framework methods; undeclared globals warn/error. +- `strictRoutes`: route metadata and constraints required for API routes. +- `strictPackages`: invalid package manifests fail startup. +- `strictConfig`: unknown settings fail startup. + +Default these carefully. Strict mode should be easy to adopt but not forced on legacy apps immediately. + +--- + +## 10. Framework Comparison Implications + +### 10.1 Rails + +Rails remains the closest philosophical comparison. + +Key Rails lessons: + +- Keep conventions simple. +- Keep controller actions simple. +- Keep `params`. +- Make `params` safer. +- Put mass-assignment safety at the controller boundary. +- Use generators to teach preferred style. +- Let the framework stay pleasant for common CRUD. + +Wheels should follow Rails here. + +Do: + +- Keep `params`. +- Add strong params. +- Add request context as optional explicit API. +- Improve route/controller introspection. + +Do not: + +- Force every action into explicit argument style immediately. +- Turn controller code into dependency-heavy ceremony. + +### 10.2 Laravel + +Laravel is the strongest DX competitor among modern frameworks. + +Useful lessons: + +- CLI polish matters. +- Service container matters. +- Queues and scheduler matter. +- Middleware and route groups matter. +- First-party docs and examples matter. + +What Wheels should adopt: + +- CLI-centered workflows. +- Route groups/modules. +- Scheduler. +- Stronger DI tooling. +- Better generated app experience. + +What Wheels should avoid: + +- Too much magic behind facades. +- Large platform surface without enough docs/testing. + +### 10.3 Django + +Django's main strengths are stability, admin, forms, security defaults, and documentation. + +Useful lessons: + +- Mature docs are a feature. +- Admin/productivity tooling can define a framework. +- Security defaults should be boring and consistent. +- Backward compatibility policy matters. + +What Wheels should adopt: + +- Strong docs gate for releases. +- Better admin generator. +- Clear security defaults. +- Compatibility policy. + +What Wheels probably should not chase immediately: + +- A full Django-style admin app. +- A full Django forms system. + +Those could be packages later. + +### 10.4 FW/1 + +FW/1's value is simplicity and clarity. + +Best ideas to adopt: + +- Subsystems as simple app modules. +- Explicit request context. +- Clear lifecycle hooks. +- Convention service discovery. +- Environment config layering. +- Response builder style. + +Ideas not to adopt: + +- `?action=section.item` as primary routing. +- Single-file framework architecture. +- Broad AOP as a headline feature. +- Direct view access to too much framework API. + +### 10.5 ColdBox + +ColdBox is stronger as an enterprise platform. Wheels should not chase it feature-for-feature. + +Best ideas to selectively adopt: + +- First-class modules. +- Explicit request context. +- Route visualizer. +- REST response object. +- Scheduler. +- Interceptor-like lifecycle events only where needed. + +Ideas to avoid: + +- Turning Wheels into a large platform with many named subsystems. +- Making BoxLang the primary optimization target. +- Requiring enterprise ceremony for normal CRUD apps. + +--- + +## 11. Proposed Wheels 5 Feature Groups + +### Group A: Required For Wheels 5 Alpha + +These should be in the first Wheels 5 alpha because they define the architecture. + +1. Runtime/tooling partnership track created. +2. Initial contract documents for RequestContext, params, response, CLI output, and engine adapter behavior. +3. Initial conformance suite skeleton. +4. LuCLI upstream capability list for Wheels 5. +5. RustCFML experimental conformance lane defined. +6. RequestContext internal object. +7. Compatibility action injection for `params` and `rc`. +8. Strong params initial API. +9. Response object initial API. +10. Module skeleton and route mounting. +11. Config schema foundation. +12. CI matrix manifest. +13. `wheels ci run` initial implementation. +14. Deprecation warnings for removals. +15. Docs explaining the new architecture. + +### Group B: Required For Wheels 5 Beta + +1. Route metadata. +2. Route inspection and route matching CLI. +3. Module tests and generators. +4. Package validation and migration tooling. +5. Generated app smoke tests. +6. Upgrade tests from Wheels 4. +7. Strict mode previews. +8. Compatibility dashboard. +9. Conformance dashboard. +10. LuCLI server lifecycle and JSON output contracts implemented or shimmed. +11. RustCFML can run at least language/CFC/request conformance tiers. + +### Group C: Required For Wheels 5 Final + +1. Full release candidate matrix. +2. Public distribution canaries. +3. Final deprecation/removal list. +4. Complete upgrade guide. +5. Docs examples updated to Wheels 5 idioms. +6. `wheels doctor` coverage for compatibility, config, routes, packages, and params. +7. Known incompatibilities documented. +8. Runtime/tooling contract docs published. +9. Experimental RustCFML status documented honestly. +10. LuCLI upstream dependencies either released or covered by documented temporary shims. + +### Group D: Post-5.0 Candidates + +These are valuable but should not block 5.0: + +1. Scheduler. +2. Lightweight async/futures. +3. Full OpenAPI generator. +4. Advanced admin package. +5. Forms/request validation package. +6. Package registry UI. +7. Full module extraction tooling. +8. RustCFML full framework suite attempts. +9. Additional engine adapters driven by the conformance suite. + +--- + +## 12. Proposed Implementation Slices + +### Slice 0: Runtime And Tooling Contracts + +Deliverables: + +- Create `docs/contracts/`. +- Draft RequestContext, params, response, CLI output, engine adapter, and test result contracts. +- Create initial `tests/conformance/` layout. +- Define support labels for Lucee, Adobe CF, BoxLang, and RustCFML. +- Create LuCLI upstream issue list for Wheels 5 needs. +- Create RustCFML experimental conformance target list. + +Success criteria: + +- Every major Wheels 5 feature has a contract home. +- The CI matrix can distinguish conformance, full framework, and distribution lanes. +- LuCLI/RustCFML-dependent work is tracked as first-class roadmap work. +- Experimental support cannot be confused with production support. + +### Slice 1: RequestContext Foundation + +Deliverables: + +- Add request context construction in dispatch. +- Attach `request.wheels.rc`. +- Attach `variables.rc`. +- Keep `variables.params`. +- Add action injection where engine-safe. +- Add tests across Lucee, Adobe, BoxLang. + +Success criteria: + +- Existing controller tests pass unchanged. +- New tests can declare `function show(params, rc)`. +- `params` and `rc.params` point to the same data. + +### Slice 2: Strong Params + +Deliverables: + +- Parameter object/wrapper. +- `require`. +- `permit`. +- `expect`. +- Safe `toStruct`. +- Exceptions mapped to 400 responses. +- Generator examples. + +Success criteria: + +- Raw existing params access still works. +- Generated CRUD uses parameter contracts. +- Mass assignment from unpermitted params can warn in doctor/strict mode. + +### Slice 3: Response Object + +Deliverables: + +- `response().json()`. +- `response().status()`. +- `response().header()`. +- `response().redirectTo()`. +- `response().file()`. +- Compatibility with existing render/redirect helpers. + +Success criteria: + +- API controllers can return a response object. +- Existing controllers still work. +- Tests can inspect response status/body/headers consistently. + +### Slice 4: Modules + +Deliverables: + +- `app/modules/` convention. +- `Module.cfc` lifecycle. +- Route mounting. +- Module service registration. +- Module tests. +- Generator. + +Success criteria: + +- `wheels generate module admin` creates a working module. +- Routes can be listed by module. +- Tests can run by module. +- Module views/layouts resolve predictably. + +### Slice 5: LuCLI Platform Integration + +Deliverables: + +- Define `wheels ci run` command behavior. +- Define machine-readable output conventions for CI-oriented commands. +- Stabilize server lifecycle calls used by Wheels tests. +- Track upstream LuCLI PRs/issues for generic capabilities. +- Keep temporary Wheels shims documented and small. + +Success criteria: + +- Local, GitHub Actions, and Proxmox lanes can call the same `wheels ci run` contract. +- CLI commands used by automation have stable exit codes. +- JSON output can be consumed by dashboards and release workflows. +- Wheels-specific hacks are either removed or explicitly temporary. + +### Slice 6: RustCFML Experimental Lane + +Deliverables: + +- Add RustCFML to the matrix manifest as experimental. +- Add language/CFC/request conformance suites that can run without a full database-backed app. +- Document unsupported features clearly. +- Track RustCFML upstream issues/PRs tied to conformance failures. + +Success criteria: + +- RustCFML produces useful pass/fail signal without being release-blocking. +- Wheels assumptions about CFML semantics are captured as tests. +- No user-facing documentation implies RustCFML production support. + +### Slice 7: CI Harness + +Deliverables: + +- `tools/ci/matrix.yml`. +- `wheels ci run`. +- PR fast lane using the command. +- Nightly matrix using the manifest. +- Release matrix definition. +- Conformance matrix definition. + +Success criteria: + +- GitHub Actions no longer encode the matrix in only YAML. +- Maintainers can run the same lanes locally. +- Compatibility docs can be generated from the manifest. +- Conformance docs can be generated from the same result data. + +### Slice 8: Cleanup And Removals + +Deliverables: + +- Remove or isolate legacy plugin loader. +- Remove old test aliases where appropriate. +- Remove old CLI docs/paths. +- Add compatibility package if needed. +- Upgrade guide. + +Success criteria: + +- Wheels 5 startup path is simpler. +- Legacy users get clear migration errors or adapter path. +- Docs no longer teach removed APIs. + +--- + +## 13. Documentation Plan + +Wheels 5 needs documentation written with the same care as code. + +### Required Guides + +1. What's New In Wheels 5. +2. Upgrading From Wheels 4. +3. Request Context And Params. +4. Strong Params. +5. Response Objects. +6. Application Modules. +7. Packages vs Modules. +8. Testing Wheels Applications. +9. CI And Compatibility Matrix. +10. Engine Compatibility. +11. Building APIs. +12. Strict Mode. +13. Runtime And Tooling Partnerships. +14. Wheels Conformance Suite. +15. LuCLI Platform Integration. +16. RustCFML Experimental Support. + +### Generator-Driven Docs + +Every generator should point to docs that match its output. + +If `wheels generate scaffold` creates `userParams(params)`, the docs should explain that exact pattern. + +### Docs Gate + +For Wheels 5 final: + +- No known stale CLI references. +- No CommandBox-era install instructions unless explicitly historical. +- Every new major feature has a guide. +- Every deprecation has an upgrade note. +- Compatibility matrix is published. +- Conformance status is published separately from full framework support. +- Experimental engine status is clearly labeled. + +--- + +## 14. Risks And Tradeoffs + +### Risk: Too Much Change In One Major + +Mitigation: + +- Keep runtime compatibility high. +- Make new patterns additive. +- Use strict mode opt-in. +- Split implementation into slices. + +### Risk: RequestContext Becomes A Second API Competing With `params` + +Mitigation: + +- Document clear roles. +- `params` remains the friendly input API. +- `rc` is the full request context. +- Generators can include both initially, then settle on the best idiom after feedback. + +### Risk: Modules Become Too Heavy + +Mitigation: + +- Start with simple mounted app modules. +- Avoid HMVC complexity in 5.0. +- No separate module DI container by default. +- No broad AOP/interceptor system as part of module v1. + +### Risk: Strong Params Frustrates Existing Developers + +Mitigation: + +- Do not force it in compatibility mode. +- Teach through generators. +- Warn through doctor. +- Enforce only in strict mode at first. + +### Risk: CI Matrix Is Too Expensive + +Mitigation: + +- Keep PR gate small. +- Use conditional lanes. +- Run full matrix nightly and on RC. +- Move heavy lanes to Proxmox/self-hosted. +- Publish status without blocking every PR. + +### Risk: Engine Neutrality Slows Innovation + +Mitigation: + +- Use engine adapters. +- Define primary vs compatibility support levels. +- Allow experimental features behind capability checks. +- Make unsupported engine behavior explicit. + +### Risk: Partnership Work Becomes Informal And Untrackable + +Mitigation: + +- Use labels for upstream LuCLI, upstream RustCFML, and engine contracts. +- Keep contract docs in the Wheels repo. +- Link upstream PRs/issues from Wheels roadmap issues. +- Treat temporary shims as technical debt with owners. + +### Risk: RustCFML Experimental Support Is Misread As Production Support + +Mitigation: + +- Label RustCFML as experimental everywhere. +- Keep it non-release-blocking until explicitly promoted. +- Publish conformance status separately from full framework status. +- Avoid marketing language that implies production readiness. + +### Risk: LuCLI Coupling Creates A Bottleneck + +Mitigation: + +- Keep Wheels-specific behavior in Wheels. +- Push generic behavior upstream. +- Maintain small documented shims when upstream timing does not match Wheels release timing. +- Version LuCLI expectations in the matrix manifest and `wheels doctor`. + +--- + +## 15. Recommended Release Policy + +### Support Levels + +Define support levels for engine/database combinations: + +- **Primary:** must pass PR or RC gates; failures block release. +- **Supported:** tested nightly and RC; failures block release unless documented. +- **Compatibility:** expected to work; tested regularly; failures may be non-blocking for a limited time. +- **Experimental:** no release guarantee. + +Experimental targets such as RustCFML should be useful to maintainers without creating user confusion. Their purpose is conformance signal, not production support. + +### Deprecation Policy + +Recommended: + +- Deprecate in one minor line. +- Warn at runtime or doctor time. +- Document migration. +- Remove in next major. + +For 5.0, anything deprecated throughout 4.x can be removed if: + +- There is a migration path. +- There is an upgrade guide. +- There are tests for the new path. + +### Release Gate + +Wheels 5 final should require: + +- Fast PR lane green. +- Full RC matrix green or documented. +- Distribution canaries green. +- Upgrade tests green. +- Docs gate green. +- No unresolved P0/P1 issues. + +--- + +## 16. Recommended Decision Log + +These are proposed decisions to ratify. + +### Decision 1: Do Not Chase ColdBox + +Wheels 5 should not attempt to match ColdBox's full enterprise platform surface. + +Adopt selectively: + +- Modules. +- Request context. +- Route inspection. +- Response object. +- Scheduler later. + +Reject for now: + +- Full HMVC complexity. +- Broad interceptors/AOP. +- BoxLang-first optimization. +- Large subsystem taxonomy. + +### Decision 2: Keep `params` + +`params` remains part of the Wheels controller API. + +Wheels should add: + +- `rc.params`. +- Action argument injection. +- Strong params. +- Strict mode. + +But old `params.key` code should continue to work in Wheels 5. + +### Decision 3: Keep The Monorepo + +Keep core, CLI, templates, tests, build, and docs together. + +Use separate repos only for distribution metadata and truly independent packages. + +### Decision 4: Make CLI The Test Contract + +Prefer: + +```bash +wheels ci run ... +``` + +over workflow-specific shell scripts as the long-term contract. + +GitHub Actions, Proxmox runners, and local maintainers should all run the same command. + +### Decision 5: Engine Neutrality Is A Feature + +Wheels 5 should support BoxLang, but remain neutral across Lucee, Adobe CF, and BoxLang. + +This should be visible in: + +- CI. +- Docs. +- CLI doctor. +- Release notes. + +### Decision 6: LuCLI Is A Strategic Platform Partner + +The Wheels CLI should continue to be built on LuCLI, and generic CLI/runtime capabilities should be contributed upstream where practical. + +Wheels owns: + +- User-facing command design. +- Framework-specific generators. +- Framework-specific CI commands. +- Distribution and release packaging. + +LuCLI should own or grow: + +- Generic server lifecycle. +- Module execution. +- Cross-platform binary behavior. +- Engine profile behavior. +- Machine-readable output conventions where they are not Wheels-specific. + +### Decision 7: RustCFML Is An Experimental Conformance Partner + +RustCFML should be added to the roadmap as an experimental conformance target, not a production support promise. + +Its value is to: + +- Expose hidden engine assumptions. +- Clarify CFML semantics Wheels needs. +- Provide a future runtime/tooling path if it matures. +- Give RustCFML real framework-driven compatibility targets. + +### Decision 8: Contracts Come Before Major New Architecture + +For Wheels 5 architectural features, write or update the contract first: + +- RequestContext. +- Params. +- Response. +- Modules. +- Packages. +- CLI output. +- Engine adapters. +- Test results. + +Then implement against the contract and add conformance coverage. + +--- + +## 17. Open Questions + +These need maintainer decisions before implementation plans are written. + +1. Should Wheels 5 support Adobe ColdFusion 2018 and 2021, or require Adobe 2023+? +2. Should Lucee 5 remain supported, or should Wheels 5 require Lucee 6+? +3. Should BoxLang be primary support, supported, compatibility, or experimental for 5.0? +4. Should Oracle be a release-blocking database for 5.0? +5. Should legacy `plugins/` be removed from core or moved behind a compatibility package? +6. Should RocketUnit compatibility be fully removed or left as an external adapter? +7. Should generated controllers use `function action(params, rc)` or `function action(rc)`? +8. Should strong params be warning-only by default in 5.0? +9. Should modules ship in 5.0 final or as a 5.1 feature after RequestContext lands? +10. Should Proxmox ephemeral runners be part of the first 5.0 release gate or added after static self-hosted runners stabilize? +11. Which LuCLI capabilities must be upstreamed before Wheels 5 beta? +12. What minimum conformance tier should RustCFML target before Wheels 5 final? +13. Should `tests/conformance/` live in the main Wheels repo or become a separate shared repo later? +14. Should contract docs be treated as release-blocking for architectural features? +15. Who owns the compatibility dashboard and cross-repo milestone hygiene? + +--- + +## 18. Bottom Line + +The best Wheels 5 is not a bigger Wheels 4. It is a clearer Wheels. + +Wheels 5 should preserve the framework's most valuable quality: a developer can understand it quickly and build useful applications without ceremony. The work is to make that simplicity more durable: + +- Friendly `params`, backed by safer parameter contracts. +- Simple controllers, backed by explicit request context. +- Convention-based apps, backed by modules and package contracts. +- Easy local development, backed by the LuCLI CLI. +- Broad compatibility, backed by a real automated matrix. +- Open runtime/tooling partnerships, backed by conformance contracts. +- Modern features, backed by stronger docs and stricter release gates. + +That is a strong lane. It is different from ColdBox, still recognizable to Rails-minded developers, and valuable for the CFML community. From 0d25337d9af60a1cacbf1d3d93d14160af545f2b Mon Sep 17 00:00:00 2001 From: Peter Amiri Date: Sat, 20 Jun 2026 13:44:25 -0700 Subject: [PATCH 011/140] docs: consolidate Wheels 5 roadmap into a single decided document (#3237) --- .../wheels-5-roadmap-recommendations.md | 2688 ----------------- docs/releases/wheels-5-roadmap.md | 268 ++ 2 files changed, 268 insertions(+), 2688 deletions(-) delete mode 100644 docs/releases/wheels-5-roadmap-recommendations.md create mode 100644 docs/releases/wheels-5-roadmap.md diff --git a/docs/releases/wheels-5-roadmap-recommendations.md b/docs/releases/wheels-5-roadmap-recommendations.md deleted file mode 100644 index 322e51ab22..0000000000 --- a/docs/releases/wheels-5-roadmap-recommendations.md +++ /dev/null @@ -1,2688 +0,0 @@ -# Wheels 5 Roadmap Recommendations - -**Status:** Draft recommendation document -**Date:** 2026-06-20 -**Scope:** Strategic and architectural recommendations for the next major version of Wheels after the 4.0 line. - -This document consolidates a set of framework reviews and comparative analyses: - -- Current Wheels 4 source and documentation. -- Rails, Laravel, and Django capability comparison. -- Framework One architectural review. -- ColdBox and BoxLang strategic review. -- Wheels testing and CI/CD review. -- Rails `params` evolution and its implications for Wheels. -- LuCLI and RustCFML collaboration implications. - -The goal is not to clone any competing framework. The goal is to define a coherent Wheels 5 direction that protects what makes Wheels valuable, removes old drag, and gives the project a sharper story for the next decade of CFML and CFML-adjacent development. - ---- - -## 1. Executive Summary - -Wheels 4 is already a major modernization release. It adds a modern ORM surface, a query builder, jobs, middleware, rate limiting, packages, DI, browser testing, LuCLI-based CLI distribution, deploy tooling, MCP integration, and expanded engine/database support. Wheels 5 should not try to be another ColdBox. It should be a consolidation and clarity release. - -The recommended strategic position for Wheels 5 is: - -> Wheels is the elegant, convention-first, Rails-inspired full-stack framework for CFML applications, with first-class engine neutrality, a modern CLI, and open runtime/tooling partnerships. - -That sentence matters. It gives the roadmap a filter: - -- Prefer productivity over enterprise ceremony. -- Prefer explicit contracts under the hood, but keep the developer-facing API approachable. -- Support BoxLang, but do not become BoxLang-first. -- Adopt good ideas from ColdBox and Framework One only when they strengthen the Wheels identity. -- Keep `params`, but make it safer and give developers an explicit request context path. -- Keep the monorepo, because the framework, CLI, templates, packages, tests, and distribution are now tightly coupled. -- Make automated testing a first-class product feature of the framework, not merely a maintainer concern. -- Use strong relationships with LuCLI and RustCFML maintainers to turn Wheels into a reference framework for open CFML runtime and tooling conformance. - -The highest-impact Wheels 5 themes are: - -1. **Framework contraction:** remove deprecated legacy surfaces and reduce ambiguous runtime magic. -2. **Request context and safer params:** introduce `rc`, preserve `params`, and add Rails-like strong parameter APIs. -3. **First-class modules:** add bounded application modules inspired by FW/1 subsystems and ColdBox HMVC, but keep the API small. -4. **Response and route contracts:** add response builders, route metadata, route inspection, and generated API/MCP/OpenAPI context. -5. **Testing platform:** formalize a multi-tier test matrix across engines, databases, CLI, generated apps, browser tests, and distribution packages. -6. **Engine neutrality:** make ACF/Lucee/BoxLang compatibility an explicit release promise backed by CI. -7. **CLI as the contract:** use the LuCLI-based `wheels` binary as the unified local, CI, package, and release harness. -8. **Runtime and tooling partnerships:** make LuCLI and RustCFML collaboration first-class roadmap tracks, not side-channel conveniences. - ---- - -## 2. Source Grounding - -This document is grounded in the following local Wheels source areas: - -- Core dispatch and request parameter handling: - - [`vendor/wheels/Dispatch.cfc`](../../vendor/wheels/Dispatch.cfc) - - [`vendor/wheels/Controller.cfc`](../../vendor/wheels/Controller.cfc) - - [`vendor/wheels/controller/processing.cfc`](../../vendor/wheels/controller/processing.cfc) - - [`vendor/wheels/Global.cfc`](../../vendor/wheels/Global.cfc) -- Current package/plugin architecture: - - [`vendor/wheels/PackageLoader.cfc`](../../vendor/wheels/PackageLoader.cfc) - - [`vendor/wheels/Plugins.cfc`](../../vendor/wheels/Plugins.cfc) -- DI, jobs, middleware, and query builder: - - [`vendor/wheels/Injector.cfc`](../../vendor/wheels/Injector.cfc) - - [`vendor/wheels/JobWorker.cfc`](../../vendor/wheels/JobWorker.cfc) - - [`vendor/wheels/middleware/Pipeline.cfc`](../../vendor/wheels/middleware/Pipeline.cfc) - - [`vendor/wheels/middleware/RateLimiter.cfc`](../../vendor/wheels/middleware/RateLimiter.cfc) - - [`vendor/wheels/model/query/QueryBuilder.cfc`](../../vendor/wheels/model/query/QueryBuilder.cfc) -- CLI and distribution: - - [`cli/CLAUDE.md`](../../cli/CLAUDE.md) - - [`cli/lucli/ARCHITECTURE.md`](../../cli/lucli/ARCHITECTURE.md) - - [`cli/lucli/Module.cfc`](../../cli/lucli/Module.cfc) - - [`tools/distribution-drafts`](../../tools/distribution-drafts) -- Current test and CI infrastructure: - - [`tests/README.md`](../../tests/README.md) - - [`vendor/wheels/tests`](../../vendor/wheels/tests) - - [`cli/lucli/tests`](../../cli/lucli/tests) - - [`e2e`](../../e2e) - - [`.github/workflows/pr.yml`](../../.github/workflows/pr.yml) - - [`.github/workflows/compat-matrix.yml`](../../.github/workflows/compat-matrix.yml) - - [`.github/actions/setup-wheels-test-env/action.yml`](../../.github/actions/setup-wheels-test-env/action.yml) - -External framework references: - -- Rails: - - [Action Controller Overview](https://guides.rubyonrails.org/action_controller_overview.html) - - [ActionController::Parameters API](https://api.rubyonrails.org/classes/ActionController/Parameters.html) - - [Rails 4.0 release notes](https://guides.rubyonrails.org/4_0_release_notes.html) - - [Rails 8.1 release notes](https://guides.rubyonrails.org/8_1_release_notes.html) -- Laravel: - - [Laravel documentation](https://laravel.com/docs) -- Django: - - [Django documentation](https://docs.djangoproject.com/) -- Framework One: - - [FW/1 documentation](https://framework-one.github.io/documentation/) - - [FW/1 developing applications](https://framework-one.github.io/documentation/4.2/developing-applications/) - - [FW/1 subsystems](https://framework-one.github.io/documentation/4.2/using-subsystems/) - - [DI/1 documentation](https://framework-one.github.io/documentation/4.2/using-di-one/) -- ColdBox and BoxLang: - - [ColdBox site](https://www.coldbox.org/) - - [ColdBox documentation](https://coldbox.ortusbooks.com/) - - [BoxLang site](https://www.boxlang.io/) -- Runtime and tooling ecosystem: - - [LuCLI GitHub repository](https://github.com/cybersonic/LuCLI) - - RustCFML collaboration with Alex Skinner, treated here as an experimental engine/conformance partnership. No public project URL is assumed by this document. - ---- - -## 3. Strategic Positioning - -### 3.1 What Wheels Should Be - -Wheels should remain the Rails-like framework in the CFML ecosystem: - -- Convention-first. -- CRUD-friendly. -- ORM-centered. -- Controller/view helper friendly. -- Fast to start. -- Easy to explain. -- Small enough that a developer can hold the mental model in their head. - -Wheels 4 has expanded the framework's capability surface substantially. The risk for Wheels 5 is that the framework starts to feel like a pile of features rather than a coherent system. The roadmap should counter that risk by making the framework more explicit internally while keeping the default developer experience simple. - -The desired outcome: - -> A new developer can build a useful CRUD app quickly, while an experienced maintainer can reason about routing, request context, params, services, packages, jobs, middleware, and tests through stable contracts. - -### 3.2 What Wheels Should Not Be - -Wheels should not chase ColdBox feature-for-feature. - -ColdBox is a larger platform with HMVC modules, WireBox, CacheBox, LogBox, interceptors, scheduled tasks, async APIs, REST handlers, and a growing BoxLang-first optimization story. That is a legitimate strategy for Ortus, but it is not the best strategy for Wheels. - -Wheels should also not try to match Laravel's ecosystem breadth, Django's built-in admin depth, or Rails' RubyGems ecosystem. Those are ecosystem-level advantages, not single-release feature gaps. - -Instead, Wheels should compete on: - -- CFML-native productivity. -- Engine neutrality. -- Simpler conventions. -- Built-in ORM ergonomics. -- Modern CLI and distribution. -- Strong automated compatibility testing. -- A smaller, clearer framework surface. - -### 3.3 The ColdBox / BoxLang Lesson - -ColdBox has become a vertically integrated platform play. ColdBox 8 runs on BoxLang, Lucee, and Adobe CF, but the direction is clearly optimized around BoxLang because Ortus controls both the language/runtime and framework. - -That gives ColdBox real advantages: - -- Runtime/framework co-design. -- Faster platform-level innovation. -- One organization controlling docs, CLI, runtime, modules, support, and release cadence. -- Stronger professional support loop. - -It also creates a strategic opening for Wheels: - -- Wheels can be the neutral CFML framework. -- Wheels can support BoxLang without being BoxLang-first. -- Wheels can make ACF/Lucee/BoxLang parity a brand promise. -- Wheels can appeal to teams that want modernization without moving into the full Ortus platform. -- Wheels can answer vertical integration with open ecosystem integration: LuCLI for tooling/runtime workflow, RustCFML for future engine pressure-testing, and a public conformance suite for all engines. - -Recommendation: - -> Treat BoxLang as a first-class supported engine, not the primary optimization target. - -This should be backed by documentation and CI: - -- Every major release should publish an engine compatibility table. -- The public test matrix should show ACF, Lucee, and BoxLang status. -- Engine-specific behavior should be isolated behind adapters, not scattered through core code. -- Experimental engines such as RustCFML should be used to expose assumptions and codify framework/runtime contracts before they are treated as production targets. - ---- - -## 4. Current Wheels 4 Assessment - -### 4.1 Strengths To Preserve - -Wheels 4 has several important strengths that should remain central in Wheels 5. - -#### Full-Stack Productivity - -Wheels has the classic full-stack pieces: - -- Routing. -- Controllers. -- Views and layouts. -- ORM. -- Migrations. -- Form helpers. -- URL helpers. -- Flash/session helpers. -- Tests. -- CLI generators. - -The value is not only that these exist. The value is that they are integrated and convention-driven. - -#### ORM Ergonomics - -The Wheels ORM remains a major differentiator inside CFML: - -- Active Record style. -- Associations. -- Validations. -- Callbacks. -- Scopes. -- Query builder. -- Enums. -- Bulk operations. -- Polymorphic associations. -- Multi-database support. - -Wheels should continue to lead with the ORM story. - -#### Multi-Engine and Multi-Database Support - -Wheels supports a broad engine/database surface. That is expensive, but it is strategically important. The competition with ColdBox makes this more important, not less. - -The framework should continue to support: - -- Lucee. -- Adobe ColdFusion. -- BoxLang. -- SQLite. -- PostgreSQL. -- MySQL/MariaDB. -- SQL Server. -- Oracle. -- CockroachDB. -- H2 where practical for Lucee. - -Not all combinations need to be equally important, but the supported combinations should be explicit. - -#### LuCLI-Based CLI and Distribution - -The move to LuCLI and distribution through Homebrew, Scoop, apt, and yum/dnf is a major shift. It means Wheels can now offer a clean install story without requiring developers to understand CommandBox first. - -This is not just a CLI detail. It changes the testing and release strategy: - -- The public `wheels` binary can become the canonical test harness. -- Generated app smoke tests can run from the same CLI users install. -- Package install tests can validate real distribution channels. -- CI and local development can use the same commands. - -Because there is an active working relationship with Mark Drew, the creator of LuCLI, Wheels can do more than consume LuCLI. Wheels can help shape LuCLI capabilities upstream in ways that benefit both projects: - -- Stable module APIs. -- Reliable server lifecycle primitives. -- Machine-readable output. -- Cross-platform wrapper behavior. -- Engine profile handling. -- CI/test primitives. -- Module install and update hooks. - -This changes the Wheels 5 roadmap. CLI needs should not be implemented as Wheels-only hacks when they can become reusable LuCLI capabilities. - -#### RustCFML As A Conformance Partner - -RustCFML should not be treated as a primary production engine target for Wheels 5. It should be treated as an experimental conformance partner. - -That is still strategically valuable. A newer engine implementation can reveal hidden assumptions in Wheels that Lucee, Adobe CF, and BoxLang may tolerate through legacy behavior. RustCFML can become a strict pressure test for: - -- CFScript parsing. -- CFC construction. -- Method invocation. -- `argumentCollection`. -- Scope lookup. -- Struct/array/query behavior. -- Include semantics. -- JSON serialization. -- Request simulation. -- Controller dispatch. -- Eventually ORM and query behavior. - -The relationship with Alex Skinner can help Wheels define clearer runtime contracts while giving RustCFML real framework-driven compatibility targets. - -#### Built-In Testing Infrastructure - -Wheels already has: - -- Core WheelsTest specs. -- CLI module specs. -- Browser testing support. -- Playwright artifacts. -- HTTP test clients. -- Parallel test runner work. -- GitHub workflows for fast PR tests and broader compatibility matrix tests. - -This is enough foundation to turn testing into a core framework advantage. - -### 4.2 Weaknesses To Address - -#### Too Much Runtime Magic - -Wheels has historically leaned on component variables, included mixins, unscoped lookup, and dynamic invocation. That helped create a terse developer experience, but it makes the framework harder to reason about as it grows. - -Examples: - -- Controller actions currently access `params` through unscoped lookup from `variables.params`. -- Controller methods are invoked dynamically through `$invoke()`. -- Mixins are integrated into controller, view, model, and global scopes. -- Legacy plugins can still inject behavior dynamically. - -Wheels 5 should not remove all magic. It should make the magic observable and optional. - -#### Legacy Drag - -Wheels 4 already marks some legacy surfaces as deprecated. Wheels 5 is the right time to remove or isolate them. - -Candidates: - -- Legacy `plugins/` behavior in favor of the modern package system. -- RocketUnit compatibility paths, after a clear migration window. -- Old TestBox naming aliases if retained only for 4.x compatibility. -- CommandBox-era CLI documentation and command references. -- Old asset pipeline paths if Vite and modern asset handling are the preferred direction. -- Deprecated MCP HTTP endpoints if stdio MCP is the supported path. - -The goal is not to break apps for sport. The goal is to make Wheels 5 internally smaller and easier to test. - -#### Documentation Drift - -The codebase has moved faster than the docs. This showed up during the review in CLI notes, testing roadmap notes, and framework capability docs that still describe older directions. - -Wheels 5 should not ship with a docs backlog. Documentation should be part of the release gate. - -#### Compatibility Ambiguity - -The README, version checks, CI matrix, and release docs should all agree on supported engines and versions. - -During review, there were signs of drift in engine minimum checks and current support claims. Wheels 5 should make compatibility declarations executable: - -- Configured in one place. -- Tested in CI. -- Rendered into docs. -- Used by CLI `wheels doctor`. - ---- - -## 5. Roadmap Principles - -These principles should guide Wheels 5 decisions. - -### 5.1 Keep The Friendly API, Add Explicit Internals - -Rails kept `params`. It did not force controller actions to accept request arguments. But Rails changed what `params` is: a safer parameter object with strong parameter behavior. - -Wheels should follow that pattern. - -Keep this: - -```cfml -function show() { - post = model("Post").findByKey(params.key); -} -``` - -Enable this: - -```cfml -function show(required struct params, required any rc) { - post = model("Post").findByKey(params.key); -} -``` - -And eventually encourage this for more explicit code: - -```cfml -function show(required any rc) { - post = model("Post").findByKey(rc.params.key); -} -``` - -The user-facing progression should be gentle: - -1. Old code works unchanged. -2. New generators use the clearer style. -3. `wheels doctor` detects risky patterns. -4. Strict mode allows teams to opt out of legacy globals. - -### 5.2 Prefer Contracts Over Conventions Where The Framework Boundary Is Crossed - -Conventions are good inside an app. Contracts are better at framework boundaries. - -Wheels 5 should define contracts for: - -- Request context. -- Response object. -- Route metadata. -- Middleware. -- Package lifecycle. -- Service providers. -- Job handlers. -- Scheduler tasks. -- Test harness output. -- Engine adapters. -- Database adapters. - -This does not mean every app developer must write more code. It means framework internals and extension points become predictable. - -### 5.3 Treat Testing As Product Infrastructure - -For a multi-engine, multi-database framework, testing is not a backend concern. It is part of the product. - -Wheels should be able to say: - -> Every release is tested against a published engine/database matrix, generated apps, CLI distribution packages, browser tests, and upgrade paths. - -That claim would be a real differentiator in the CFML ecosystem. - -### 5.4 Make Engine Neutrality Visible - -Engine neutrality should not be merely aspirational. - -Wheels 5 should publish: - -- Supported engine versions. -- Supported database combinations. -- Known soft-fail combinations. -- Last successful matrix run. -- Engine-specific caveats. -- Upgrade guidance by engine. - -The CLI should expose the same: - -```bash -wheels doctor compatibility -wheels doctor matrix -``` - -### 5.5 Turn Partnerships Into Product Architecture - -The relationships with Mark Drew and Alex Skinner should change how Wheels plans major versions. - -Without those relationships, Wheels would mostly react to tooling and runtime behavior after it appears. With those relationships, Wheels can help shape upstream capabilities before they harden: - -- LuCLI can gain generic features that Wheels needs, instead of Wheels carrying custom wrappers forever. -- RustCFML can use Wheels as a realistic compatibility target, instead of only testing isolated language features. -- Wheels can define conformance contracts that make every engine integration less ambiguous. -- The broader CFML ecosystem gets shared infrastructure instead of another framework-specific island. - -This means the Wheels 5 roadmap should be structured around contracts first: - -```text -define runtime/tooling contract -build conformance suite -implement framework feature against the contract -upstream missing LuCLI/RustCFML capability where possible -verify across supported engines and distributions -``` - -The key inversion: - -```text -Old model: build v5 features, then test them across engines. -New model: define contracts, prove them in conformance tests, then build v5 features against those contracts. -``` - -This is the strongest open alternative to the ColdBox/BoxLang vertical integration story. - ---- - -## 6. Runtime And Tooling Partnerships - -### 6.1 Partnership Strategy - -Wheels 5 should formally recognize LuCLI and RustCFML as strategic ecosystem partners. - -This does not mean Wheels becomes dependent on either project in a fragile way. It means the roadmap should deliberately identify work that belongs upstream, work that belongs in Wheels, and work that should be captured as shared conformance tests. - -Recommended partnership posture: - -- **LuCLI:** official platform layer for the installed `wheels` developer experience. -- **RustCFML:** experimental runtime/conformance partner. -- **Lucee, Adobe CF, BoxLang:** supported runtime targets with release-gate visibility. -- **Wheels:** reference framework and conformance driver. - -This gives Wheels a credible strategic answer to vertically integrated stacks: - -- ColdBox/BoxLang: one vendor optimizes the whole stack. -- Wheels/LuCLI/RustCFML/Lucee/Adobe/BoxLang: open ecosystem compatibility driven by public contracts and tests. - -The Wheels 5 roadmap should therefore be tracked in four parallel workstreams: - -1. **Framework Core:** RequestContext, params, response objects, modules, packages, routing, configuration, DI, jobs, and deprecations. -2. **Platform / LuCLI:** CLI command contracts, server lifecycle, generated app workflows, distribution install paths, machine-readable output, and `wheels ci run`. -3. **Engine Compatibility / Conformance:** Lucee, Adobe CF, BoxLang, RustCFML experimental support, engine adapters, and shared conformance tests. -4. **Release Infrastructure:** GitHub Actions, Proxmox/self-hosted runners, nightly matrix, RC gates, package canaries, dashboards, and docs gates. - -Each Wheels 5 feature should declare which workstream owns it and which other workstreams it depends on. For example, RequestContext is Framework Core, but it depends on Engine Compatibility because action argument injection must behave consistently across engines. - -### 6.2 LuCLI As The Wheels Platform Layer - -LuCLI should be treated as the official substrate for the `wheels` CLI, local dev server, generated app workflows, and CI entry points. - -Wheels should continue to own: - -- User-facing `wheels` command design. -- Framework generators. -- Project templates. -- Wheels-specific test commands. -- Wheels-specific deploy commands. -- Release packaging. -- Documentation. - -LuCLI should own or grow generic capabilities: - -- Module discovery and execution. -- Server lifecycle APIs. -- Stable process and exit-code behavior. -- Engine profile selection. -- URL rewriting support. -- Machine-readable command output. -- Cross-platform binary behavior. -- Module installation/update primitives. -- Script execution and embedded runtime behavior. - -Wheels should contribute upstream where the capability is generic. Examples: - -```text -Need: reliable server start/stop/status for Wheels CI. -Best home: LuCLI server lifecycle API. - -Need: JSON output for command automation. -Best home: LuCLI output mode conventions plus Wheels command implementations. - -Need: stable module install/update hooks. -Best home: LuCLI module system. - -Need: cross-platform wrapper parity. -Best home: LuCLI and Wheels distribution scripts together. -``` - -This reduces long-term Wheels-specific glue and makes LuCLI stronger for other CFML projects. - -### 6.3 RustCFML As A Strict Experimental Engine - -RustCFML should be treated as an experimental engine target for Wheels 5, not as a production support promise. - -Its value is different: - -- It can expose hidden assumptions in Wheels. -- It can reveal places where Wheels depends on Lucee/ACF quirks. -- It can help define minimal CFML semantics needed by modern framework code. -- It can become a fast future runtime or tooling target if it matures. - -Initial RustCFML goals should be modest and explicit: - -1. Parse the CFScript style used in Wheels core. -2. Construct CFCs used by simple controllers/models/services. -3. Support method invocation and `argumentCollection`. -4. Support struct/array operations used by dispatch and params handling. -5. Support includes enough for generated app templates. -6. Support JSON serialization/deserialization. -7. Run a small no-database controller/request conformance suite. -8. Later, run selected ORM/query conformance tests. - -RustCFML should appear in the compatibility matrix as: - -```yaml -rustcfml: - support: experimental - purpose: conformance - releaseBlocking: false -``` - -That status should stay honest. Experimental means useful signal, not a promise to users. - -### 6.4 Wheels Conformance Suite - -The most important partnership artifact should be a Wheels conformance suite. - -This should be separate from the full application test suite. The conformance suite defines minimum framework/runtime/tooling contracts. - -Proposed layout: - -```text -tests/conformance/ - language/ - cfscript-basics/ - closures/ - scopes/ - structs-arrays/ - json/ - cfc/ - construction/ - inheritance/ - mixins/ - invoke/ - argument-collection/ - on-missing-method/ - request/ - params-merge/ - request-context/ - headers/ - cookies/ - method-override/ - controller/ - action-invocation/ - filters/ - render-response/ - redirects/ - routing/ - matching/ - constraints/ - route-model-binding/ - orm/ - query-generation/ - basic-crud/ - associations/ - cli/ - exit-codes/ - json-output/ - server-lifecycle/ - generated-app/ - scaffold-smoke/ - migration-smoke/ -``` - -The conformance suite should answer questions like: - -- What CFML behavior does Wheels require? -- What method invocation semantics must an engine support? -- How does Wheels expect `argumentCollection` to behave? -- What request/CGI/session/cookie scopes must exist? -- What params merging behavior is required? -- What CLI exit codes and JSON shapes does automation rely on? - -### 6.5 Contract Artifacts - -Every major Wheels 5 architectural feature should produce a contract artifact: - -- `RequestContext` contract. -- Params object contract. -- Response object contract. -- Module lifecycle contract. -- Package lifecycle contract. -- CLI command output contract. -- Engine adapter contract. -- Database adapter contract. -- Test result JSON/JUnit contract. - -These contracts can live under: - -```text -docs/contracts/ -``` - -Suggested files: - -```text -docs/contracts/request-context.md -docs/contracts/params.md -docs/contracts/response.md -docs/contracts/modules.md -docs/contracts/packages.md -docs/contracts/cli-output.md -docs/contracts/engine-adapters.md -docs/contracts/test-results.md -``` - -This is where Wheels can become valuable beyond its own codebase. LuCLI, RustCFML, and other tooling can implement against these contracts. - -### 6.6 Upstream-First Policy - -Adopt an upstream-first policy for generic tooling/runtime needs. - -When a missing capability is found: - -1. Decide whether it is Wheels-specific or generally useful. -2. If generally useful, open/design it upstream in LuCLI or RustCFML. -3. Add a conformance test in Wheels. -4. Consume the upstream capability once available. -5. Keep temporary Wheels shims small and documented. - -Examples: - -- Server lifecycle reliability belongs in LuCLI. -- Binary wrapper behavior may span LuCLI and distribution scripts. -- RequestContext is Wheels-specific. -- `argumentCollection` semantics belong in engine conformance. -- Strong params belongs in Wheels. -- CLI JSON output shape spans LuCLI conventions and Wheels command output. - -### 6.7 Governance And Coordination - -Keep governance lightweight but explicit. - -Recommended mechanisms: - -- Add `upstream-lucli`, `upstream-rustcfml`, and `engine-contract` labels. -- Track cross-repo work through GitHub issues and milestones. -- Use short RFCs for shared contracts. -- Link upstream PRs from Wheels issues. -- Add a quarterly compatibility review before major release milestones. - -Suggested RFC path: - -```text -docs/rfcs/ - 0001-request-context.md - 0002-cli-json-output.md - 0003-engine-conformance-suite.md -``` - -The process should stay practical. The goal is not bureaucracy. The goal is to prevent critical upstream assumptions from living only in chat threads or maintainer memory. - ---- - -## 7. Major Recommendations - -## 7.1 Introduce RequestContext While Preserving `params` - -### Problem - -Wheels currently exposes request data through a plain-ish `params` struct stored on the controller instance. This is ergonomic, but it conflates several concepts: - -- Query string params. -- Form params. -- JSON body params. -- Route params. -- Framework routing metadata. -- Potentially resolved route model bindings. - -It also relies on unscoped CFML variable resolution. That makes code pleasant to write, but harder to reason about and test. - -### Rails Lesson - -Rails started with a merged `params` hash. In Rails 2.3 it was documented as `HashWithIndifferentAccess`, merging query string, POST data, and route params. Modern Rails still exposes `params`, but it is now `ActionController::Parameters`, not a plain hash. Rails 4 introduced Strong Parameters so raw params cannot be mass-assigned into models without explicit permission. - -Rails did not remove `params`. It made `params` safer. - -### Recommendation - -Add a first-class `RequestContext` object or struct-like component. It should be created during dispatch and attached to the request and controller. - -Initial shape: - -```cfml -rc = { - params = params, - route = routeInfo, - controller = params.controller, - action = params.action, - method = request.cgi.request_method, - format = params.format ?: "html", - requestId = "...", - headers = requestHeaders, - cookies = cookie, - session = session, - flash = flashScope, - env = environmentInfo -} -``` - -Controller initialization should set: - -```cfml -variables.rc = requestContext; -variables.params = variables.rc.params; -request.wheels.rc = requestContext; -request.wheels.params = variables.rc.params; -``` - -Action invocation should support compatibility injection: - -```cfml -$invoke( - method = arguments.action, - invokeArgs = { - rc = variables.rc, - params = variables.rc.params - } -); -``` - -Important rule: - -> `params`, `rc.params`, `variables.params`, and `request.wheels.params` should initially reference the same underlying object. - -Do not copy the params struct in normal request flow. Copies create synchronization bugs. - -### Engine Caveat - -Before implementation, verify behavior across Lucee, Adobe CF, and BoxLang: - -- Does each engine ignore extra named arguments passed to a method that declares no arguments? -- Does each engine allow an action declaring `params` and/or `rc` to receive those values consistently? -- Does `onMissingMethod` receive these arguments safely? - -If any supported engine rejects undeclared named args, use metadata introspection: - -- Pass `params` only when the action declares `params`. -- Pass `rc` only when the action declares `rc`. -- Keep `variables.params` and `variables.rc` always available. - -### Developer Experience - -Existing code remains valid: - -```cfml -function update() { - user = model("User").findByKey(params.key); - user.update(params.user); -} -``` - -New generated code can use explicit args: - -```cfml -function update(required struct params, required any rc) { - user = model("User").findByKey(params.key); - user.update(userParams(params)); -} -``` - -Or: - -```cfml -function update(required any rc) { - user = model("User").findByKey(rc.params.key); - user.update(userParams(rc.params)); -} -``` - -### Why This Matters - -This gives Wheels a bridge: - -- Old apps stay easy. -- New apps become clearer. -- Tests can construct request contexts directly. -- Middleware can work against a stable request object. -- Packages can inspect request metadata without depending on global scopes. -- Future strict mode becomes realistic. - ---- - -## 7.2 Add Strong Params / Parameter Contracts - -### Problem - -Wheels has model-level mass assignment protections through accessible/protected properties, but controller-level parameter intent is not as strong or expressive as modern Rails Strong Parameters. - -The risky pattern is: - -```cfml -user.update(params.user); -``` - -That is convenient, but the controller does not explicitly declare which submitted keys are expected. - -### Recommendation - -Create a Wheels parameter object with safe filtering and shape validation. - -The object should remain easy to use like a struct where practical, but it should offer explicit APIs: - -```cfml -params.require("user"); -params.permit("name,email,timezone"); -params.expect(user = ["name", "email", "timezone"]); -params.toStruct(); -``` - -Recommended APIs: - -```cfml -params.require("user") -``` - -Requires a top-level key. Raises a 400-style exception when missing. - -```cfml -params.permit("name,email,timezone") -``` - -Returns only permitted scalar keys from the current params object. - -```cfml -params.expect(user = ["name", "email", "timezone"]) -``` - -Requires `user`, ensures it has the expected shape, and returns permitted values. - -```cfml -params.expectArray("ids") -``` - -Requires an array-like param and normalizes it. - -```cfml -params.unpermittedKeys() -``` - -Returns submitted keys that were not permitted. - -```cfml -params.permitted() -``` - -Returns true when this parameter object has passed through a permit/expect call. - -```cfml -params.toStruct() -``` - -Returns a plain struct only when permitted, unless strict mode is disabled. - -### Suggested Controller Pattern - -```cfml -function create(required struct params) { - user = model("User").create(userParams(params)); - - if (user.hasErrors()) { - renderView(action = "new"); - return; - } - - redirectTo(route = "user", key = user.id); -} - -private struct function userParams(required any params) { - return params.expect(user = ["name", "email", "timezone"]); -} -``` - -### Compatibility - -Do not break direct struct access in Wheels 5. - -The transition should be: - -1. Wheels 5 introduces parameter contracts. -2. Generators use parameter contracts. -3. `wheels doctor` warns on direct mass assignment from raw `params`. -4. Strict mode can reject raw params passed to model mutation methods. -5. A later major version can consider stricter defaults. - -### Why This Matters - -This is the most Rails-aligned improvement Wheels can make to `params`. It preserves the friendly controller API while moving security and intent to the boundary where user input enters the application. - ---- - -## 7.3 Add First-Class Application Modules - -### Problem - -Wheels has plugins and packages, but it does not yet have a first-class concept for bounded application modules. A plugin/package is a reusable extension mechanism. A module is an application boundary. - -Examples: - -- Admin. -- Billing. -- API. -- Reporting. -- Tenant management. -- Support portal. - -These parts often need local routes, controllers, views, services, jobs, tests, and assets. - -### Lessons From FW/1 and ColdBox - -FW/1 has subsystems. They allow a larger app to be split into smaller convention-based mini-apps with their own controllers, views, layouts, and model/service conventions. - -ColdBox has HMVC modules. Its module system is much broader and more enterprise-oriented. Wheels should not copy the entire ColdBox model, but the idea of a bounded app module is valuable. - -### Recommendation - -Add first-class Wheels modules with a small convention: - -```text -app/modules/admin/ - Module.cfc - config/routes.cfm - controllers/ - models/ - services/ - views/ - jobs/ - tests/ -``` - -The top-level app remains the main app. Modules are mounted into it. - -Example route: - -```cfml -mapper() - .module("admin", path = "/admin") - .module("api", path = "/api"); -``` - -Or: - -```cfml -mapper().scope(path = "/admin", module = "admin", function() { - resources("users"); -}); -``` - -### Module Lifecycle - -Each module should support a minimal lifecycle: - -```cfml -component { - function register() {} - function routes(mapper) {} - function boot() {} -} -``` - -Where: - -- `register()` registers services, settings, jobs, middleware. -- `routes(mapper)` contributes routes. -- `boot()` runs after the app and module graph are loaded. - -### What Modules Should Not Do - -Avoid building a full ColdBox HMVC clone. - -For Wheels 5, modules do not need: - -- Independent request lifecycles. -- Complex parent/child event bubbling. -- Broad AOP features. -- Deep per-module interceptors. -- Separate dependency injection containers by default. - -Keep modules as a simple app organization boundary first. - -### CLI Support - -```bash -wheels generate module admin -wheels generate module api --api -wheels routes --module=admin -wheels test run --module=admin -``` - -### Why This Matters - -Modules give larger Wheels apps a growth path without abandoning the framework's simplicity. They also create a natural place for future package extraction: - -- Start as app module. -- Stabilize API. -- Extract into package if reusable. - ---- - -## 7.4 Consolidate Packages And Remove Legacy Plugin Drag - -### Problem - -Wheels currently has a modern package system and legacy plugin compatibility. The legacy path is useful for migration, but it increases startup complexity, loader complexity, documentation complexity, and test surface. - -### Recommendation - -Make Wheels 5 the removal point for legacy plugin behavior, with a compatibility package if needed. - -Recommended path: - -1. Wheels 4.x continues to warn when legacy plugins load. -2. Wheels 4.x ships `wheels plugin migrate` or `wheels package migrate`. -3. Wheels 5 removes automatic legacy plugin loading from core. -4. Wheels 5 optionally provides `wheels-legacy-plugin-adapter` as a package. - -### Package System Direction - -The modern package system should become the only extension story: - -- `package.json` manifest. -- Declared mixin targets. -- Service providers. -- Dependencies. -- Replaces/suggests. -- Lazy loading. -- Version compatibility. -- Explicit lifecycle. - -### Needed Improvements - -Add stronger validation: - -```bash -wheels package validate -wheels package doctor -wheels package graph -``` - -Add better docs: - -- How to build a package. -- How package lifecycle works. -- How package mixins are resolved. -- How conflicts are handled. -- How packages differ from app modules. - -### Module vs Package Rule - -Document this clearly: - -- A **module** is part of one app. -- A **package** is reusable across apps. -- A package can provide a module. -- An app module can later be extracted into a package. - ---- - -## 7.5 Add A Fluent Response Object - -### Problem - -Wheels has many rendering and redirection helpers, but controller response intent can be scattered: - -- `renderText`. -- `renderWith`. -- `renderView`. -- `redirectTo`. -- `sendFile`. -- Status/header manipulation. - -For APIs, jobs dashboards, MCP, and generated JSON endpoints, a unified response builder would clarify intent. - -### Lessons From FW/1 and Modern Frameworks - -FW/1 has `renderData().data(...).type(...).statusCode(...).header(...)`. Laravel has response helpers. Rails has `render` and `redirect_to` with structured options. - -Wheels can add a fluent API without removing existing helpers. - -### Recommendation - -Add: - -```cfml -response() - .status(201) - .json(user) - .header("Location", urlFor(route = "user", key = user.id)); -``` - -Examples: - -```cfml -return response().json({ok = true}); -``` - -```cfml -return response() - .status(422) - .json({ - errors = user.allErrors() - }); -``` - -```cfml -return response() - .redirectTo(route = "posts") - .flash("success", "Post created"); -``` - -```cfml -return response() - .file(path = local.path, disposition = "attachment"); -``` - -### Compatibility - -Existing helpers should remain: - -```cfml -renderWith(user); -redirectTo(route = "posts"); -``` - -The response object should be additive in Wheels 5. - -### Why This Matters - -A response object helps: - -- API generators. -- Tests. -- Middleware. -- Route docs. -- MCP tools. -- Strict controller contracts. -- Future async or streaming responses. - ---- - -## 7.6 Add Route Metadata, Route Inspection, And API Documentation Hooks - -### Problem - -Routes are executable configuration, but not enough of their intent is machine-readable. - -For modern tooling, routes should expose: - -- Description. -- Tags. -- Auth requirements. -- Rate limits. -- Request schema. -- Response type. -- Deprecation state. -- Feature/module ownership. - -### Recommendation - -Extend route declarations with optional metadata: - -```cfml -post( - name = "apiUsersCreate", - pattern = "/api/users", - to = "api.users##create", - description = "Create a user", - tags = "api,users", - auth = "admin", - rateLimit = "apiWrite", - request = "CreateUserRequest", - response = "UserResponse" -); -``` - -For resources: - -```cfml -resources( - "users", - module = "admin", - auth = "admin", - tags = "admin,users" -); -``` - -### Tooling - -Add: - -```bash -wheels routes -wheels routes --json -wheels routes --openapi -wheels routes --module=admin -wheels routes --deprecated -wheels doctor routes -``` - -### Debug Panel - -Add a route trace view: - -- Matched route. -- Params extracted. -- Middleware applied. -- Controller/action. -- Format negotiation. -- Route model binding result. -- Auth/rate-limit metadata. - -### Why This Matters - -Route metadata becomes a foundation for: - -- API docs. -- MCP context. -- Test generation. -- Security review. -- Dead route detection. -- Route-level deprecation. -- Better developer debugging. - ---- - -## 7.7 Make Lifecycle Hooks Explicit And Traceable - -### Problem - -Wheels has a request lifecycle, but it is not exposed as clearly as it could be. As the framework gains middleware, modules, packages, DI, route model binding, and response objects, developers need to understand what ran and in what order. - -### FW/1 Lesson - -FW/1 is good at lifecycle clarity: - -- App setup. -- Controller before. -- Action. -- Controller after. -- View setup. -- Response setup. - -Wheels should not copy FW/1 directly, but it should expose a clear lifecycle trace. - -### Recommendation - -Document and instrument the lifecycle: - -```text -request start - parse params - build request context - match route - route model binding - middleware before - controller init - service injection - verification - before filters - action - render/response - after filters - middleware after -request end -``` - -Add debug tooling: - -```bash -wheels trace /posts/1 -wheels routes match GET /posts/1 -``` - -And in the debug panel: - -- Timeline. -- Hooks. -- Filters. -- Middleware. -- SQL queries. -- DI resolutions. -- Package/module contributions. - -### Why This Matters - -This gives developers confidence in a framework that still uses conventions. It also makes AI coding tools more effective because they can inspect the framework's actual behavior. - ---- - -## 7.8 Strengthen DI Without Making It The Center Of The Framework - -### Problem - -Wheels now has a real DI container. That is valuable, but Rails-style frameworks should not make DI ceremony mandatory for basic work. - -### Laravel Lesson - -Laravel's service container is a major strength, but it is also part of Laravel's larger platform complexity. Wheels should adopt the useful parts without making every controller feel enterprise-heavy. - -### FW/1 DI/1 Lesson - -DI/1's convention-based service discovery is approachable: - -- `model/services` as services. -- `model/beans` as transient beans. -- Property injection by convention. - -Wheels can use a similar optional discovery model. - -### Recommendation - -Keep explicit DI registration: - -```cfml -map("mailer").to("app.services.Mailer").asSingleton(); -bind("PaymentGateway").to("StripeGateway"); -``` - -Add optional service discovery: - -```text -app/services/ -app/repositories/ -app/policies/ -app/actions/ -``` - -With conventions: - -- Services default to singleton unless marked otherwise. -- Actions default to transient. -- Repositories default to singleton/request-scoped depending on datasource use. -- Policies default to singleton. - -Add CLI inspection: - -```bash -wheels services -wheels services graph -wheels services doctor -``` - -### Controller Usage - -Keep simple helper access: - -```cfml -mailer = service("mailer"); -``` - -Allow declarative injection: - -```cfml -function config() { - inject("userService"); -} -``` - -Avoid requiring constructor injection for standard controller actions in Wheels 5. - ---- - -## 7.9 Add Scheduler And Lightweight Async On Top Of Jobs - -### Problem - -Wheels 4 has database-backed jobs. That is a strong zero-dependency foundation. But modern frameworks also expose scheduled tasks and async execution patterns. - -ColdBox has scheduled tasks and async/futures. Laravel has scheduler and queues. Rails has Active Job and now richer job continuation support. - -### Recommendation - -Build on Wheels jobs rather than adding a separate system. - -Add scheduler definitions: - -```cfml -// config/schedule.cfm -schedule() - .job("SendDailyDigest") - .dailyAt("08:00"); - -schedule() - .task("cleanupTmp") - .everyMinutes(30); -``` - -Add CLI: - -```bash -wheels schedule list -wheels schedule run -wheels schedule work -wheels jobs work -``` - -Add minimal async: - -```cfml -future = async(function() { - return expensiveOperation(); -}); - -result = future.await(timeout = 30); -``` - -Keep this small. Do not clone the full ColdBox async surface. - -### Priority - -This is a second-wave Wheels 5 feature, not a prerequisite for the first alpha. - ---- - -## 7.10 Make Configuration Schema-Driven - -### Problem - -As Wheels adds more settings, config drift becomes harder to debug. Settings should be discoverable, typed, validated, and explainable. - -### Recommendation - -Add a configuration schema: - -```cfml -setting( - name = "routeModelBinding", - type = "boolean", - default = false, - environment = "all", - description = "Enables automatic route model binding" -); -``` - -Then expose: - -```bash -wheels config list -wheels config get routeModelBinding -wheels config doctor -wheels config explain routeModelBinding -``` - -### Environment Layering - -Adopt explicit layering: - -```text -framework defaults -app defaults -environment config -host/tenant overrides -runtime env vars -``` - -Show final resolved config: - -```bash -wheels config effective --environment=production -``` - -### FW/1 Lesson - -FW/1's `variables.framework` config and environment override model is simple and understandable. Wheels can take the clarity without adopting the same API. - ---- - -## 7.11 Treat CLI And Distribution As Release-Critical - -### Problem - -The LuCLI-based CLI is now the public face of Wheels. It is how many developers will first experience the framework. It is also how CI, generated apps, and distribution can be tested. - -### Recommendation - -Make this rule explicit: - -> If a user can install Wheels through Homebrew, Scoop, apt, or yum/dnf, the release is not done until that install path has been tested on a clean system. - -### Required Canaries - -For every release candidate and final release: - -```bash -wheels --version -wheels new smokeapp -cd smokeapp -wheels start -wheels generate scaffold Post title:string body:text -wheels dbmigrate latest -wheels test run -wheels routes -wheels doctor -``` - -Run these through: - -- Homebrew on macOS. -- Scoop on Windows. -- apt on Ubuntu/Debian. -- yum/dnf on Rocky/RHEL. - -### Why This Matters - -The CLI is not just tooling. It is part of the framework's trust story. A clean public install path is worth more than another advanced feature. - ---- - -## 7.12 Keep The Monorepo - -### Recommendation - -Keep the monorepo for Wheels 5. - -### Rationale - -The repo now contains tightly coupled components: - -- Framework core. -- CLI module. -- Generated app templates. -- Test runner. -- Browser testing infrastructure. -- Build scripts. -- Package definitions. -- Distribution drafts. -- Release workflows. -- Compatibility matrix. - -Splitting these into separate repos would create version skew: - -- CLI expects a framework template version. -- Framework tests expect CLI endpoints. -- Generated apps depend on template and core alignment. -- Distribution packages need framework and CLI artifacts together. -- Release canaries must test the combined product. - -### What Can Stay Separate - -Separate repos still make sense for: - -- Homebrew tap. -- Scoop bucket. -- apt repository metadata. -- yum/dnf repository metadata. -- Public docs site deployment, if operationally cleaner. -- Truly independent packages once their APIs stabilize. - -### Monorepo Improvements - -Use path filters and clear ownership areas: - -```text -vendor/wheels/ framework core -cli/lucli/ CLI module -tests/ generated app testing -vendor/wheels/tests/ framework core tests -cli/lucli/tests/ CLI tests -tools/ci/ CI harness -tools/build/ build/release -tools/distribution-drafts/ -docs/ -``` - -Add a top-level `CONTRIBUTING` section for which tests to run based on touched paths. - ---- - -## 8. Automated Testing Strategy - -Testing needs a full design, because Wheels has a broader compatibility target than most frameworks. - -### 8.1 Test Tiers - -Use tiers with clear purpose. - -#### Tier 0: Static And Metadata Checks - -Runs on every PR. - -Includes: - -- Commit/PR title lint. -- JSON/YAML validation. -- Manifest validation. -- API docs generation validation. -- Route/config metadata validation if added. -- Basic formatting or syntax checks where available. - -Goal: under 2 minutes. - -#### Tier 1: Fast PR Gate - -Runs on every PR and blocks merge. - -Current seed exists in [`.github/workflows/pr.yml`](../../.github/workflows/pr.yml): Lucee 7 + SQLite through LuCLI. - -Recommended contents: - -- Lucee latest + SQLite. -- Core WheelsTest. -- CLI module tests. -- Generated app smoke. -- Minimal browser smoke. -- `wheels doctor`. - -Target: 5 to 10 minutes. - -Example: - -```bash -wheels ci run --engine=lucee7 --db=sqlite --suite=core,cli,generated,browser-smoke -``` - -#### Tier 2: Conditional PR Matrix - -Runs based on changed paths or labels. - -Examples: - -- ORM/query/migration changes: - - PostgreSQL. - - MySQL. - - SQLite. -- SQL Server adapter changes: - - SQL Server lane. -- Oracle adapter changes: - - Oracle lane. -- Engine adapter changes: - - Lucee + Adobe + BoxLang SQLite smoke. -- CLI/distribution changes: - - Linux package smoke. - - macOS Homebrew smoke if available. - - Windows Scoop smoke if available. -- Browser testing changes: - - Full browser specs. - -This keeps PR feedback relevant without running the entire universe every time. - -#### Tier 3: Nightly Compatibility Matrix - -Runs on schedule and manual dispatch. - -Current seed exists in [`.github/workflows/compat-matrix.yml`](../../.github/workflows/compat-matrix.yml). - -Recommended matrix: - -Engines: - -- Lucee 6. -- Lucee 7. -- Adobe 2023. -- Adobe 2025. -- BoxLang. - -Databases: - -- SQLite. -- PostgreSQL. -- MySQL/MariaDB. -- SQL Server. -- CockroachDB. -- Oracle. -- H2 where relevant. - -Nightly should: - -- Run all combinations that are supported. -- Publish a dashboard summary. -- Upload JUnit and JSON artifacts. -- Create or update GitHub issues for persistent failures. -- Avoid noisy Slack unless a previously green lane turns red. - -#### Tier 4: Release Candidate Gate - -Runs on RC branches and blocks release. - -Includes: - -- Full engine/database matrix. -- Generated app lifecycle tests. -- Upgrade tests from previous supported version. -- Package install tests using built artifacts. -- Browser tests. -- CLI smoke tests. -- Distribution canaries. -- Docs validation. - -RC should not tolerate hidden soft failures. If a lane is soft-fail, it must be named, documented, and linked to an issue. - -#### Tier 5: Post-Release Canaries - -Runs after release assets and package repositories publish. - -Tests public install paths: - -- Homebrew. -- Scoop. -- apt. -- yum/dnf. - -This catches the failure class that normal CI cannot catch: real users installing real artifacts through public channels. - -### 8.2 One Test Command Contract - -Add a first-class CI command: - -```bash -wheels ci run -``` - -Example options: - -```bash -wheels ci run --engine=lucee7 --db=sqlite --suite=core -wheels ci run --engine=adobe2025 --db=postgres --suite=core -wheels ci run --suite=cli,generated,browser -wheels ci run --matrix=nightly -wheels ci run --matrix=release -``` - -This command should be the shared contract for: - -- GitHub Actions. -- Local maintainers. -- Proxmox runners. -- Release workflows. -- Future dashboards. - -### 8.3 Matrix Manifest - -Create one source of truth: - -```text -tools/ci/matrix.yml -``` - -Example: - -```yaml -engines: - lucee7: - version: "7" - port: 60007 - support: primary - adobe2025: - version: "2025" - port: 62025 - support: primary - boxlang: - version: "1" - port: 60001 - support: compatibility - rustcfml: - version: "experimental" - support: experimental - purpose: conformance - releaseBlocking: false - -databases: - sqlite: - support: primary - postgres: - support: primary - mysql: - support: primary - sqlserver: - support: primary - oracle: - support: supported - cockroachdb: - support: supported - -lanes: - pr-fast: - - engine: lucee7 - db: sqlite - suites: [core, cli, generated, browser-smoke] - nightly: - include: all-supported - release: - include: all-supported - blocking: true -``` - -Use this manifest to generate: - -- GitHub Actions matrix. -- Local `wheels ci run --matrix`. -- Docs compatibility table. -- `wheels doctor compatibility`. -- Experimental conformance lanes for RustCFML and future engines. - -### 8.4 GitHub Actions vs Proxmox - -Use both. - -GitHub-hosted runners are best for: - -- Fast PR checks. -- Linux Lucee/SQLite. -- Docs validation. -- Basic packaging checks. -- Public OSS transparency. - -Proxmox/self-hosted runners are best for: - -- Heavy Adobe CF lanes. -- Oracle and SQL Server. -- Long-running browser suites. -- Fresh OS package canaries. -- Release candidate full gates. -- Ephemeral VM clean-room testing. - -Recommended progression: - -1. Start with a small static self-hosted runner pool. -2. Stabilize heavy lanes. -3. Move to ephemeral clone-per-job VMs for release canaries. -4. Publish results back to GitHub checks. - -### 8.5 Generated App Testing - -Every major feature should be tested in a generated app, not only in framework internals. - -Generated app smoke: - -```bash -wheels new smokeapp -cd smokeapp -wheels generate scaffold Post title:string body:text -wheels dbmigrate latest -wheels test run -wheels start -curl /posts -``` - -Why this matters: - -- Catches template drift. -- Catches CLI/framework version skew. -- Catches distribution issues. -- Catches docs examples that no longer work. - -### 8.6 Upgrade Testing - -Wheels 5 should test upgrades from: - -- Latest Wheels 4 stable. -- Last supported Wheels 3 version if a migration path remains. - -Upgrade test flow: - -```bash -wheels new app --version=4.x -apply fixture app changes -wheels upgrade --to=5 -wheels dbmigrate latest -wheels test run -``` - -Include fixtures for: - -- Legacy plugins. -- Packages. -- Route model binding. -- Raw `params` usage. -- Generated scaffold. -- Migrations. -- Jobs. -- Middleware. - -### 8.7 Conformance Testing - -Conformance testing should become a separate tier from full framework testing. - -Full framework tests answer: - -> Does Wheels work? - -Conformance tests answer: - -> Does this engine/tool/runtime satisfy the contracts Wheels requires? - -This distinction is important for RustCFML, LuCLI, and future engine/tooling integrations. A new runtime should not need to pass the full Wheels application suite before it can produce useful signal. It should be able to start with focused conformance lanes. - -Recommended conformance tiers: - -- **Language conformance:** syntax, scopes, structs, arrays, closures, JSON. -- **CFC conformance:** construction, inheritance, mixins, dynamic invocation, `argumentCollection`, `onMissingMethod`. -- **Request conformance:** CGI/request/session/cookie scope simulation, method override, headers, params merge. -- **Controller conformance:** action invocation, filters, rendering, redirecting, response object. -- **CLI conformance:** exit codes, JSON output, server lifecycle, module dispatch. -- **Generated app conformance:** minimal scaffold lifecycle. - -RustCFML should start with language/CFC/request/controller conformance. LuCLI should focus on CLI/server/module conformance. Lucee, Adobe CF, and BoxLang should run both conformance and full framework tests. - -The release dashboard should distinguish: - -```text -Engine Conformance Full Suite Support -Lucee 7 pass pass primary -Adobe 2025 pass pass primary -BoxLang pass partial/pass supported -RustCFML partial not-applicable experimental -``` - ---- - -## 9. Compatibility And Deprecation Plan - -### 9.1 Compatibility Defaults - -Wheels 5 should be conservative at runtime: - -- Existing controllers using unscoped `params` should work. -- Existing views should work. -- Existing model APIs should work unless explicitly deprecated. -- Existing migrations should work. -- Existing packages should work if they use the modern package system. - -But Wheels 5 should be stricter at tooling time: - -- `wheels doctor` should warn about deprecated APIs. -- Generators should use new idioms. -- Docs should stop teaching legacy patterns. -- CI should enforce new package/test/docs contracts. - -### 9.2 Candidate Removals - -Remove from core in Wheels 5: - -- Legacy `plugins/` automatic loading, or move to a compatibility package. -- RocketUnit as a first-class test style. -- Old `wheels.Test` alias if the deprecation period is complete. -- CommandBox-era CLI documentation and commands. -- Deprecated package/plugin formats. -- Deprecated HTTP MCP endpoint if stdio MCP is the supported path. -- Any legacy asset helpers superseded by the modern asset/Vite story. - -### 9.3 Candidate Strict Modes - -Add opt-in strict modes: - -```cfml -set(strictParams = true); -set(strictControllers = true); -set(strictRoutes = true); -set(strictPackages = true); -set(strictConfig = true); -``` - -Behavior examples: - -- `strictParams`: model mass assignment from raw params errors unless permitted. -- `strictControllers`: action names must not collide with framework methods; undeclared globals warn/error. -- `strictRoutes`: route metadata and constraints required for API routes. -- `strictPackages`: invalid package manifests fail startup. -- `strictConfig`: unknown settings fail startup. - -Default these carefully. Strict mode should be easy to adopt but not forced on legacy apps immediately. - ---- - -## 10. Framework Comparison Implications - -### 10.1 Rails - -Rails remains the closest philosophical comparison. - -Key Rails lessons: - -- Keep conventions simple. -- Keep controller actions simple. -- Keep `params`. -- Make `params` safer. -- Put mass-assignment safety at the controller boundary. -- Use generators to teach preferred style. -- Let the framework stay pleasant for common CRUD. - -Wheels should follow Rails here. - -Do: - -- Keep `params`. -- Add strong params. -- Add request context as optional explicit API. -- Improve route/controller introspection. - -Do not: - -- Force every action into explicit argument style immediately. -- Turn controller code into dependency-heavy ceremony. - -### 10.2 Laravel - -Laravel is the strongest DX competitor among modern frameworks. - -Useful lessons: - -- CLI polish matters. -- Service container matters. -- Queues and scheduler matter. -- Middleware and route groups matter. -- First-party docs and examples matter. - -What Wheels should adopt: - -- CLI-centered workflows. -- Route groups/modules. -- Scheduler. -- Stronger DI tooling. -- Better generated app experience. - -What Wheels should avoid: - -- Too much magic behind facades. -- Large platform surface without enough docs/testing. - -### 10.3 Django - -Django's main strengths are stability, admin, forms, security defaults, and documentation. - -Useful lessons: - -- Mature docs are a feature. -- Admin/productivity tooling can define a framework. -- Security defaults should be boring and consistent. -- Backward compatibility policy matters. - -What Wheels should adopt: - -- Strong docs gate for releases. -- Better admin generator. -- Clear security defaults. -- Compatibility policy. - -What Wheels probably should not chase immediately: - -- A full Django-style admin app. -- A full Django forms system. - -Those could be packages later. - -### 10.4 FW/1 - -FW/1's value is simplicity and clarity. - -Best ideas to adopt: - -- Subsystems as simple app modules. -- Explicit request context. -- Clear lifecycle hooks. -- Convention service discovery. -- Environment config layering. -- Response builder style. - -Ideas not to adopt: - -- `?action=section.item` as primary routing. -- Single-file framework architecture. -- Broad AOP as a headline feature. -- Direct view access to too much framework API. - -### 10.5 ColdBox - -ColdBox is stronger as an enterprise platform. Wheels should not chase it feature-for-feature. - -Best ideas to selectively adopt: - -- First-class modules. -- Explicit request context. -- Route visualizer. -- REST response object. -- Scheduler. -- Interceptor-like lifecycle events only where needed. - -Ideas to avoid: - -- Turning Wheels into a large platform with many named subsystems. -- Making BoxLang the primary optimization target. -- Requiring enterprise ceremony for normal CRUD apps. - ---- - -## 11. Proposed Wheels 5 Feature Groups - -### Group A: Required For Wheels 5 Alpha - -These should be in the first Wheels 5 alpha because they define the architecture. - -1. Runtime/tooling partnership track created. -2. Initial contract documents for RequestContext, params, response, CLI output, and engine adapter behavior. -3. Initial conformance suite skeleton. -4. LuCLI upstream capability list for Wheels 5. -5. RustCFML experimental conformance lane defined. -6. RequestContext internal object. -7. Compatibility action injection for `params` and `rc`. -8. Strong params initial API. -9. Response object initial API. -10. Module skeleton and route mounting. -11. Config schema foundation. -12. CI matrix manifest. -13. `wheels ci run` initial implementation. -14. Deprecation warnings for removals. -15. Docs explaining the new architecture. - -### Group B: Required For Wheels 5 Beta - -1. Route metadata. -2. Route inspection and route matching CLI. -3. Module tests and generators. -4. Package validation and migration tooling. -5. Generated app smoke tests. -6. Upgrade tests from Wheels 4. -7. Strict mode previews. -8. Compatibility dashboard. -9. Conformance dashboard. -10. LuCLI server lifecycle and JSON output contracts implemented or shimmed. -11. RustCFML can run at least language/CFC/request conformance tiers. - -### Group C: Required For Wheels 5 Final - -1. Full release candidate matrix. -2. Public distribution canaries. -3. Final deprecation/removal list. -4. Complete upgrade guide. -5. Docs examples updated to Wheels 5 idioms. -6. `wheels doctor` coverage for compatibility, config, routes, packages, and params. -7. Known incompatibilities documented. -8. Runtime/tooling contract docs published. -9. Experimental RustCFML status documented honestly. -10. LuCLI upstream dependencies either released or covered by documented temporary shims. - -### Group D: Post-5.0 Candidates - -These are valuable but should not block 5.0: - -1. Scheduler. -2. Lightweight async/futures. -3. Full OpenAPI generator. -4. Advanced admin package. -5. Forms/request validation package. -6. Package registry UI. -7. Full module extraction tooling. -8. RustCFML full framework suite attempts. -9. Additional engine adapters driven by the conformance suite. - ---- - -## 12. Proposed Implementation Slices - -### Slice 0: Runtime And Tooling Contracts - -Deliverables: - -- Create `docs/contracts/`. -- Draft RequestContext, params, response, CLI output, engine adapter, and test result contracts. -- Create initial `tests/conformance/` layout. -- Define support labels for Lucee, Adobe CF, BoxLang, and RustCFML. -- Create LuCLI upstream issue list for Wheels 5 needs. -- Create RustCFML experimental conformance target list. - -Success criteria: - -- Every major Wheels 5 feature has a contract home. -- The CI matrix can distinguish conformance, full framework, and distribution lanes. -- LuCLI/RustCFML-dependent work is tracked as first-class roadmap work. -- Experimental support cannot be confused with production support. - -### Slice 1: RequestContext Foundation - -Deliverables: - -- Add request context construction in dispatch. -- Attach `request.wheels.rc`. -- Attach `variables.rc`. -- Keep `variables.params`. -- Add action injection where engine-safe. -- Add tests across Lucee, Adobe, BoxLang. - -Success criteria: - -- Existing controller tests pass unchanged. -- New tests can declare `function show(params, rc)`. -- `params` and `rc.params` point to the same data. - -### Slice 2: Strong Params - -Deliverables: - -- Parameter object/wrapper. -- `require`. -- `permit`. -- `expect`. -- Safe `toStruct`. -- Exceptions mapped to 400 responses. -- Generator examples. - -Success criteria: - -- Raw existing params access still works. -- Generated CRUD uses parameter contracts. -- Mass assignment from unpermitted params can warn in doctor/strict mode. - -### Slice 3: Response Object - -Deliverables: - -- `response().json()`. -- `response().status()`. -- `response().header()`. -- `response().redirectTo()`. -- `response().file()`. -- Compatibility with existing render/redirect helpers. - -Success criteria: - -- API controllers can return a response object. -- Existing controllers still work. -- Tests can inspect response status/body/headers consistently. - -### Slice 4: Modules - -Deliverables: - -- `app/modules/` convention. -- `Module.cfc` lifecycle. -- Route mounting. -- Module service registration. -- Module tests. -- Generator. - -Success criteria: - -- `wheels generate module admin` creates a working module. -- Routes can be listed by module. -- Tests can run by module. -- Module views/layouts resolve predictably. - -### Slice 5: LuCLI Platform Integration - -Deliverables: - -- Define `wheels ci run` command behavior. -- Define machine-readable output conventions for CI-oriented commands. -- Stabilize server lifecycle calls used by Wheels tests. -- Track upstream LuCLI PRs/issues for generic capabilities. -- Keep temporary Wheels shims documented and small. - -Success criteria: - -- Local, GitHub Actions, and Proxmox lanes can call the same `wheels ci run` contract. -- CLI commands used by automation have stable exit codes. -- JSON output can be consumed by dashboards and release workflows. -- Wheels-specific hacks are either removed or explicitly temporary. - -### Slice 6: RustCFML Experimental Lane - -Deliverables: - -- Add RustCFML to the matrix manifest as experimental. -- Add language/CFC/request conformance suites that can run without a full database-backed app. -- Document unsupported features clearly. -- Track RustCFML upstream issues/PRs tied to conformance failures. - -Success criteria: - -- RustCFML produces useful pass/fail signal without being release-blocking. -- Wheels assumptions about CFML semantics are captured as tests. -- No user-facing documentation implies RustCFML production support. - -### Slice 7: CI Harness - -Deliverables: - -- `tools/ci/matrix.yml`. -- `wheels ci run`. -- PR fast lane using the command. -- Nightly matrix using the manifest. -- Release matrix definition. -- Conformance matrix definition. - -Success criteria: - -- GitHub Actions no longer encode the matrix in only YAML. -- Maintainers can run the same lanes locally. -- Compatibility docs can be generated from the manifest. -- Conformance docs can be generated from the same result data. - -### Slice 8: Cleanup And Removals - -Deliverables: - -- Remove or isolate legacy plugin loader. -- Remove old test aliases where appropriate. -- Remove old CLI docs/paths. -- Add compatibility package if needed. -- Upgrade guide. - -Success criteria: - -- Wheels 5 startup path is simpler. -- Legacy users get clear migration errors or adapter path. -- Docs no longer teach removed APIs. - ---- - -## 13. Documentation Plan - -Wheels 5 needs documentation written with the same care as code. - -### Required Guides - -1. What's New In Wheels 5. -2. Upgrading From Wheels 4. -3. Request Context And Params. -4. Strong Params. -5. Response Objects. -6. Application Modules. -7. Packages vs Modules. -8. Testing Wheels Applications. -9. CI And Compatibility Matrix. -10. Engine Compatibility. -11. Building APIs. -12. Strict Mode. -13. Runtime And Tooling Partnerships. -14. Wheels Conformance Suite. -15. LuCLI Platform Integration. -16. RustCFML Experimental Support. - -### Generator-Driven Docs - -Every generator should point to docs that match its output. - -If `wheels generate scaffold` creates `userParams(params)`, the docs should explain that exact pattern. - -### Docs Gate - -For Wheels 5 final: - -- No known stale CLI references. -- No CommandBox-era install instructions unless explicitly historical. -- Every new major feature has a guide. -- Every deprecation has an upgrade note. -- Compatibility matrix is published. -- Conformance status is published separately from full framework support. -- Experimental engine status is clearly labeled. - ---- - -## 14. Risks And Tradeoffs - -### Risk: Too Much Change In One Major - -Mitigation: - -- Keep runtime compatibility high. -- Make new patterns additive. -- Use strict mode opt-in. -- Split implementation into slices. - -### Risk: RequestContext Becomes A Second API Competing With `params` - -Mitigation: - -- Document clear roles. -- `params` remains the friendly input API. -- `rc` is the full request context. -- Generators can include both initially, then settle on the best idiom after feedback. - -### Risk: Modules Become Too Heavy - -Mitigation: - -- Start with simple mounted app modules. -- Avoid HMVC complexity in 5.0. -- No separate module DI container by default. -- No broad AOP/interceptor system as part of module v1. - -### Risk: Strong Params Frustrates Existing Developers - -Mitigation: - -- Do not force it in compatibility mode. -- Teach through generators. -- Warn through doctor. -- Enforce only in strict mode at first. - -### Risk: CI Matrix Is Too Expensive - -Mitigation: - -- Keep PR gate small. -- Use conditional lanes. -- Run full matrix nightly and on RC. -- Move heavy lanes to Proxmox/self-hosted. -- Publish status without blocking every PR. - -### Risk: Engine Neutrality Slows Innovation - -Mitigation: - -- Use engine adapters. -- Define primary vs compatibility support levels. -- Allow experimental features behind capability checks. -- Make unsupported engine behavior explicit. - -### Risk: Partnership Work Becomes Informal And Untrackable - -Mitigation: - -- Use labels for upstream LuCLI, upstream RustCFML, and engine contracts. -- Keep contract docs in the Wheels repo. -- Link upstream PRs/issues from Wheels roadmap issues. -- Treat temporary shims as technical debt with owners. - -### Risk: RustCFML Experimental Support Is Misread As Production Support - -Mitigation: - -- Label RustCFML as experimental everywhere. -- Keep it non-release-blocking until explicitly promoted. -- Publish conformance status separately from full framework status. -- Avoid marketing language that implies production readiness. - -### Risk: LuCLI Coupling Creates A Bottleneck - -Mitigation: - -- Keep Wheels-specific behavior in Wheels. -- Push generic behavior upstream. -- Maintain small documented shims when upstream timing does not match Wheels release timing. -- Version LuCLI expectations in the matrix manifest and `wheels doctor`. - ---- - -## 15. Recommended Release Policy - -### Support Levels - -Define support levels for engine/database combinations: - -- **Primary:** must pass PR or RC gates; failures block release. -- **Supported:** tested nightly and RC; failures block release unless documented. -- **Compatibility:** expected to work; tested regularly; failures may be non-blocking for a limited time. -- **Experimental:** no release guarantee. - -Experimental targets such as RustCFML should be useful to maintainers without creating user confusion. Their purpose is conformance signal, not production support. - -### Deprecation Policy - -Recommended: - -- Deprecate in one minor line. -- Warn at runtime or doctor time. -- Document migration. -- Remove in next major. - -For 5.0, anything deprecated throughout 4.x can be removed if: - -- There is a migration path. -- There is an upgrade guide. -- There are tests for the new path. - -### Release Gate - -Wheels 5 final should require: - -- Fast PR lane green. -- Full RC matrix green or documented. -- Distribution canaries green. -- Upgrade tests green. -- Docs gate green. -- No unresolved P0/P1 issues. - ---- - -## 16. Recommended Decision Log - -These are proposed decisions to ratify. - -### Decision 1: Do Not Chase ColdBox - -Wheels 5 should not attempt to match ColdBox's full enterprise platform surface. - -Adopt selectively: - -- Modules. -- Request context. -- Route inspection. -- Response object. -- Scheduler later. - -Reject for now: - -- Full HMVC complexity. -- Broad interceptors/AOP. -- BoxLang-first optimization. -- Large subsystem taxonomy. - -### Decision 2: Keep `params` - -`params` remains part of the Wheels controller API. - -Wheels should add: - -- `rc.params`. -- Action argument injection. -- Strong params. -- Strict mode. - -But old `params.key` code should continue to work in Wheels 5. - -### Decision 3: Keep The Monorepo - -Keep core, CLI, templates, tests, build, and docs together. - -Use separate repos only for distribution metadata and truly independent packages. - -### Decision 4: Make CLI The Test Contract - -Prefer: - -```bash -wheels ci run ... -``` - -over workflow-specific shell scripts as the long-term contract. - -GitHub Actions, Proxmox runners, and local maintainers should all run the same command. - -### Decision 5: Engine Neutrality Is A Feature - -Wheels 5 should support BoxLang, but remain neutral across Lucee, Adobe CF, and BoxLang. - -This should be visible in: - -- CI. -- Docs. -- CLI doctor. -- Release notes. - -### Decision 6: LuCLI Is A Strategic Platform Partner - -The Wheels CLI should continue to be built on LuCLI, and generic CLI/runtime capabilities should be contributed upstream where practical. - -Wheels owns: - -- User-facing command design. -- Framework-specific generators. -- Framework-specific CI commands. -- Distribution and release packaging. - -LuCLI should own or grow: - -- Generic server lifecycle. -- Module execution. -- Cross-platform binary behavior. -- Engine profile behavior. -- Machine-readable output conventions where they are not Wheels-specific. - -### Decision 7: RustCFML Is An Experimental Conformance Partner - -RustCFML should be added to the roadmap as an experimental conformance target, not a production support promise. - -Its value is to: - -- Expose hidden engine assumptions. -- Clarify CFML semantics Wheels needs. -- Provide a future runtime/tooling path if it matures. -- Give RustCFML real framework-driven compatibility targets. - -### Decision 8: Contracts Come Before Major New Architecture - -For Wheels 5 architectural features, write or update the contract first: - -- RequestContext. -- Params. -- Response. -- Modules. -- Packages. -- CLI output. -- Engine adapters. -- Test results. - -Then implement against the contract and add conformance coverage. - ---- - -## 17. Open Questions - -These need maintainer decisions before implementation plans are written. - -1. Should Wheels 5 support Adobe ColdFusion 2018 and 2021, or require Adobe 2023+? -2. Should Lucee 5 remain supported, or should Wheels 5 require Lucee 6+? -3. Should BoxLang be primary support, supported, compatibility, or experimental for 5.0? -4. Should Oracle be a release-blocking database for 5.0? -5. Should legacy `plugins/` be removed from core or moved behind a compatibility package? -6. Should RocketUnit compatibility be fully removed or left as an external adapter? -7. Should generated controllers use `function action(params, rc)` or `function action(rc)`? -8. Should strong params be warning-only by default in 5.0? -9. Should modules ship in 5.0 final or as a 5.1 feature after RequestContext lands? -10. Should Proxmox ephemeral runners be part of the first 5.0 release gate or added after static self-hosted runners stabilize? -11. Which LuCLI capabilities must be upstreamed before Wheels 5 beta? -12. What minimum conformance tier should RustCFML target before Wheels 5 final? -13. Should `tests/conformance/` live in the main Wheels repo or become a separate shared repo later? -14. Should contract docs be treated as release-blocking for architectural features? -15. Who owns the compatibility dashboard and cross-repo milestone hygiene? - ---- - -## 18. Bottom Line - -The best Wheels 5 is not a bigger Wheels 4. It is a clearer Wheels. - -Wheels 5 should preserve the framework's most valuable quality: a developer can understand it quickly and build useful applications without ceremony. The work is to make that simplicity more durable: - -- Friendly `params`, backed by safer parameter contracts. -- Simple controllers, backed by explicit request context. -- Convention-based apps, backed by modules and package contracts. -- Easy local development, backed by the LuCLI CLI. -- Broad compatibility, backed by a real automated matrix. -- Open runtime/tooling partnerships, backed by conformance contracts. -- Modern features, backed by stronger docs and stricter release gates. - -That is a strong lane. It is different from ColdBox, still recognizable to Rails-minded developers, and valuable for the CFML community. diff --git a/docs/releases/wheels-5-roadmap.md b/docs/releases/wheels-5-roadmap.md new file mode 100644 index 0000000000..0ee826d270 --- /dev/null +++ b/docs/releases/wheels-5-roadmap.md @@ -0,0 +1,268 @@ +# Wheels 5 Roadmap + +**Status:** Roadmap (decided direction, open items flagged explicitly) +**Date:** 2026-06-20 +**Supersedes:** the earlier `wheels-5-roadmap-recommendations.md` draft, which is now folded into this single document. + +This is the one document that describes what Wheels 5 is for, what it will and will not do, and why. It is written to be acted on, not just discussed. Where a decision is genuinely still open it is listed in [§11 Open decisions](#11-open-decisions) with a recommended default; everything else is a committed direction. + +--- + +## 1. The honest starting point + +Wheels 5 planning has to begin with two facts that earlier drafts assumed away. + +**The CFML market is contracting, not growing.** CFML/ColdFusion is niche and maintenance-weighted: it is effectively absent from the Stack Overflow 2025 developer survey and the TIOBE top tier, the expert pool is shrinking (which is why CF salaries hold up — scarcity, not demand), and greenfield CFML projects are increasingly rare. Vendors themselves now position the language around "maintain mission-critical legacy systems." + +The strategic consequence is blunt: **our competitor is not ColdBox. It is attrition** — developers leaving CFML entirely for Rails, Laravel, Node, or Go. Fighting ColdBox for a larger slice of CFML is fighting for a larger slice of a shrinking pie. ColdBox, backed by Ortus and now vertically integrated with the BoxLang runtime (ColdBox 8 ships native BoxLang integration; ~350k installs in 12 months; 720+ modules), will win any feature-for-feature, vendor-funded race. We should not enter that race. + +**Wheels is a small, largely volunteer project.** The active maintainer group is a handful of people, and the community is an order of magnitude smaller than the Ortus/ColdBox ecosystem. Any roadmap that assumes the capacity to build a conformance program, a partnership track, a five-tier CI matrix, and a half-dozen new subsystems in one major version will overcommit and stall. Scope realism is a feature of this roadmap, not an afterthought. + +These two facts set the objective function for Wheels 5: + +> Maximize **retention** (keep existing Wheels apps and teams productive and confident) and minimize **onboarding friction**, while making exactly one credible **forward bet**. Do not chase market share against a vendor-funded competitor in a shrinking market. + +--- + +## 2. Strategic position + +Wheels remains the **elegant, convention-first, Rails-inspired, runtime-neutral full-stack framework for CFML** — small enough that a developer can hold the whole model in their head. + +Three things define the lane, and they are chosen because they are defensible for a small team in a contracting market: + +1. **Runtime neutrality.** Wheels runs on Lucee, Adobe CF, and BoxLang and is beholden to no single vendor. This is the direct, honest counter to ColdBox/BoxLang vertical integration. We cannot out-integrate a vendor that owns the runtime; we can be the framework that never locks you to one. Neutrality is the brand promise — backed by CI, not marketing copy. +2. **Lowest onboarding and migration friction in CFML.** A clean install path, scaffolding that works on a fresh machine, a believable upgrade story, and documentation that matches the code. For a shrinking talent pool, "easy to pick up and cheap to maintain" is worth more than any advanced feature. +3. **One forward bet: AI-legibility.** Niche-language code is increasingly written and maintained by AI agents (a working CFML engine, RustCFML, was authored almost entirely by Claude — the ecosystem is already there). The most defensible single differentiator for Wheels 5 is to be **the most AI-legible CFML framework**: machine-readable routing and request lifecycle, a stable MCP/introspection surface, and generators that emit one canonical idiom an agent can rely on. This is the only theme that simultaneously rides where development is going and lowers maintenance cost for the apps we want to retain. + +What Wheels 5 explicitly is **not**: a ColdBox competitor on enterprise surface area, a BoxLang-first framework, or a platform with many named subsystems. See [§10](#10-what-wheels-5-will-not-do). + +--- + +## 3. Wheels 4 baseline (what already ships) + +This roadmap is a **coherence release**, so it must start from an accurate inventory. The following already exist in Wheels 4 as substantial, non-stub implementations. Wheels 5 work on them is **harden / document / contract**, never "add": + +| Capability | Lives in | +|---|---| +| DI container | [`vendor/wheels/Injector.cfc`](../../vendor/wheels/Injector.cfc) | +| Background jobs | [`vendor/wheels/Job.cfc`](../../vendor/wheels/Job.cfc), [`vendor/wheels/JobWorker.cfc`](../../vendor/wheels/JobWorker.cfc) | +| Middleware pipeline + built-ins | [`vendor/wheels/middleware/`](../../vendor/wheels/middleware/) (Pipeline, Cors, RateLimiter, SecurityHeaders, RequestId, …) | +| Query builder + scopes | [`vendor/wheels/model/query/QueryBuilder.cfc`](../../vendor/wheels/model/query/QueryBuilder.cfc) | +| Package system | [`vendor/wheels/PackageLoader.cfc`](../../vendor/wheels/PackageLoader.cfc), `ModuleGraph.cfc` | +| Model mass-assignment protection | `accessibleProperties()` / `protectedProperties()` in [`vendor/wheels/model/properties.cfc`](../../vendor/wheels/model/properties.cfc) | +| CLI (`wheels`) incl. `doctor`, `routes --json` | [`cli/lucli/Module.cfc`](../../cli/lucli/Module.cfc) | +| Compatibility matrix CI | [`.github/workflows/compat-matrix.yml`](../../.github/workflows/compat-matrix.yml), [`.github/workflows/pr.yml`](../../.github/workflows/pr.yml) | + +The risk Wheels 4 created is the one this release must answer: these capabilities are real but not yet a *coherent, well-documented, trustworthy whole*. **The first job of Wheels 5 is to make what already shipped cohere — not to pile on more.** + +--- + +## 4. The Wheels 5 thesis + +> The best Wheels 5 is not a bigger Wheels 4. It is a clearer Wheels. + +Concretely, that means a small, decisive scope: + +- **Make the v4 surface coherent and documented** (the consolidation half). +- **Ship two genuinely-missing safety ergonomics** — controller-level strong params and a response object. +- **Make the one forward bet** — AI-legibility. +- **Remove real legacy drag** — without fragmenting a small community's codebase. + +Everything else that earlier drafts proposed (application modules, scheduler/async, config schema, DI discovery, OpenAPI generation, a strategic conformance program) is deferred to 5.1+ or dropped, and is listed in [§9](#9-deferred-to-51) and [§10](#10-what-wheels-5-will-not-do) so the boundary is explicit. + +--- + +## 5. Scope: Wheels 5.0 core + +These are the committed 5.0 deliverables. Each is small, additive where possible, and chosen against the retention / onboarding / forward-bet objective. + +### 5.1 Controller-level strong params + +**Gap (verified):** model-level protection exists (`accessibleProperties`/`protectedProperties`), but there is no filtering at the controller boundary where untrusted input actually enters. `params` is a bare, unguarded struct in `variables` with no accessor. + +**Design — CFML-native, not a Rails transliteration.** Earlier drafts proposed making `params` a Rails-style object with `.require()`/`.permit()`/`.expect()` methods. We reject that for CFML: turning `params` into a CFC that must also behave like a struct invites cross-engine member-function collisions (the same class of bug as `obj.map()` resolving to the built-in struct member — see Cross-Engine Invariant #1 in `CLAUDE.md`). Instead: + +- `params` **stays a plain struct** (zero behavior change, zero engine risk). +- Add controller **helper functions** that operate on it and return a filtered plain struct: + +```cfm +// require a top-level key, permit a fixed set, return a plain struct +userParams = expectParams(params, user = ["name", "email", "timezone"]); +model("User").create(userParams); + +// finer-grained building blocks +requireParam(params, "user"); // 400-style error if missing +permitted = permit(params.user, "name,email"); // whitelist scalars +``` + +- These map missing/tampered input to a **400-style** response (not a 500), matching the intent behind Rails 8's `params.expect`. +- Generators emit this pattern; `wheels doctor` warns on raw `params` passed straight into `create()`/`update()`. + +**Compatibility:** raw `params.user` access keeps working. Strict enforcement (reject unpermitted mass assignment) is opt-in via `set(strictParams = true)`, never default in 5.0. + +### 5.2 Response object + +**Gap (verified):** today's renderers (`renderView`, `renderWith`, `renderText`, `redirectTo`, `sendFile`) are imperative `void` side-effecting functions. There is no unified, testable response builder — which is most painful for the JSON/API and MCP endpoints that the forward bet depends on. + +**Design:** an additive, chainable builder that does not remove any existing helper. + +```cfm +return response().status(201).json(user) + .header("Location", urlFor(route = "user", key = user.id)); + +return response().status(422).json({ errors = user.allErrors() }); +``` + +The value is concentrated where we need it: API controllers, tests (assert status/body/headers consistently), middleware, and a stable shape for AI-generated endpoints. Existing apps need not adopt it. + +### 5.3 RequestContext — formalize, don't fork the idiom + +**Gap (verified):** there is no `RequestContext.cfc`, but the `request.wheels.*` namespace is already rich (`params`, `currentRoute`, `cache`, `execution`, `tenant`, …) and dispatch already builds an ephemeral `{params, route, pathInfo, method, cgi}` context for middleware ([`Dispatch.cfc`](../../vendor/wheels/Dispatch.cfc)). + +**Decision (committed):** formalize the *existing* namespace into a first-class `rc` object available at `variables.rc` and `request.wheels.rc`. `params` and `rc.params` reference the **same** underlying struct (no copies). + +**Explicitly rejected for 5.0: action-argument injection.** Earlier drafts proposed letting actions declare `function show(params, rc)` and having dispatch inject them, and floated *three* coexisting controller styles. We reject this because: + +1. It is the cross-engine-risky part. Actions are dispatched via `$invoke()` with the method name only; no named args are forwarded today. Making injection work consistently across Lucee 5/6/7, Adobe CF 2018–2025, and BoxLang is real, fragile engineering (see the invocation/`argumentCollection`/`attributeCollection` gotchas throughout `CLAUDE.md`). +2. It manufactures the "second competing API" problem. A small community cannot afford three controller idioms in its code, tutorials, and AI training context. + +So there is **one taught idiom**: actions take no request arguments; read `params` (friendly) or `variables.rc` (full context) as needed. `rc` is additive; nothing is forced. + +### 5.4 Legacy removal — decisive but non-fragmenting + +Remove real drag, with a migration path, without breaking the long tail unnecessarily: + +- **Legacy `plugins/` auto-loading** ([`Plugins.cfc`](../../vendor/wheels/Plugins.cfc), 1,131 lines): removed from core; offered as an opt-in `wheels-legacy-plugin-adapter` package for apps that still need it. The modern package system becomes the single extension story. +- **RocketUnit / `wheels.Test`** ([`vendor/wheels/Test.cfc`](../../vendor/wheels/Test.cfc)): still on disk and selectable today with no runtime warning. Add a deprecation warning in the next 4.x, remove from core in 5.0, leave as an external adapter if anyone needs it. `wheels.WheelsTest` is the only documented path. +- **CommandBox-era CLI docs**: removed; the installed `wheels` binary is the only supported surface. + +### 5.5 Single CI matrix manifest + +**Gap (verified):** the engine/DB matrix is hand-encoded and divergent across `compat-matrix.yml`, `pr.yml`, and `tools/test-matrix.sh`, with no shared source of truth. + +**Deliverable:** one `tools/ci/matrix.yml` that declares engines, databases, support levels, and lanes, and feeds: the GitHub Actions matrix, the local runner, the published compatibility table, and `wheels doctor`. This makes the runtime-neutrality promise *executable* rather than aspirational — which is the whole point of neutrality being our brand. + +### 5.6 The forward bet: AI-legibility + +This is the one new theme, and it is deliberately built from pieces that are mostly small extensions of things that already exist: + +- **Machine-readable routing.** `routes --json` already exists; add a stable, documented schema and let routes carry optional metadata (`description`, `tags`, `auth`). The route struct already tolerates extra keys via `argumentCollection` and exposes the matched route at `request.wheels.currentRoute` — we add a *consumer* and a documented contract, not a new mechanism. +- **Request lifecycle trace.** A `wheels trace ` / debug-panel timeline showing matched route, params, middleware, controller/action, and route-model-binding result. This is what lets both humans and agents understand a convention-driven framework. +- **Stable MCP / introspection surface.** Treat the `wheels mcp` stdio surface as a first-class, versioned contract so AI tooling can rely on it. Deprecate the legacy HTTP MCP endpoint. +- **Canonical generators.** Generators emit exactly one idiom (the §5.1/§5.3 patterns), so agent-generated Wheels code converges on what the framework actually wants. + +OpenAPI generation, a full conformance suite, and route-level test generation are **not** in 5.0 (see §9). + +--- + +## 6. Runtime and tooling dependencies (corrected) + +Earlier drafts elevated two single-author projects to strategic pillars. That is the *same* single-vendor concentration risk we criticize in the ColdBox/BoxLang stack — just with different logos. Corrected posture: + +- **BoxLang** — *first-class supported engine, not the primary optimization target.* BoxLang is real (Ortus, 1.0 GA May 2025) but its adoption is vendor-narrated, not measured. The hedge is sound, but it is not permanent: **re-evaluate quarterly.** If adoption inflects, "not primary" can age badly. +- **LuCLI** — *vendored, with an explicit continuity plan.* The `wheels` binary is already a branded fork of LuCLI in [`cli/lucli/`](../../cli/lucli/). LuCLI upstream is a self-declared **alpha (v0.4.0, "expect breaking changes"), single-maintainer** project. The continuity plan is the mitigation, not a relationship: **we own the vendored fork.** We contribute genuinely-generic improvements upstream where convenient, but Wheels' release cadence never blocks on upstream LuCLI, and we do not assume API stability we don't control. +- **RustCFML** — *monitor only; not a roadmap pillar.* It is public ([`github.com/pixl8/RustCFML`](https://github.com/pixl8/RustCFML), Alex Skinner), but it is a ~26-star, AI-authored, single-author experiment **with no ORM** — meaning it cannot run Wheels' model layer at all. It is interesting signal for "AI maintains CFML" (which informs §5.6), nothing more. It does not appear in support tables, gates, or positioning. (Earlier drafts both stated "no public project exists" — false — and made it "the strongest alternative to vertical integration" — unsupportable. Both are corrected here.) + +There is no separate "partnership workstream," no RFC directory gate, and no strategic conformance program in 5.0. Coordination stays lightweight: GitHub issues, milestones, and labels. + +--- + +## 7. Compatibility and deprecation + +**Runtime compatibility stays high.** Existing controllers using `params`, existing views, model APIs, migrations, and modern-package-based extensions continue to work in 5.0. + +**Strictness moves to tooling time, opt-in at runtime:** + +- `wheels doctor` warns on deprecated APIs and risky patterns (raw `params` mass assignment, legacy test base, legacy plugins). +- Generators emit only the new idioms. +- Docs stop teaching removed/legacy patterns. +- `set(strictParams = true)` is the one strict mode shipped in 5.0. Other strict modes are deferred — five opt-in strict modes is configuration sprawl a small community will not adopt coherently. + +**Deprecation policy:** deprecate in a 4.x minor with a runtime/doctor warning and a documented migration → remove in 5.0. Anything removed in 5.0 has a migration path, an upgrade-guide entry, and tests for the new path. + +**Support levels** (rendered from `tools/ci/matrix.yml`): + +- **Primary** — blocks PR/RC gates on failure (Lucee 7 + SQLite at minimum; the engines/DBs ratified in §11). +- **Supported** — tested nightly + RC; failures block release unless documented. +- **Compatibility** — expected to work; failures may be non-blocking for a limited, documented window. + +--- + +## 8. Testing strategy (right-sized) + +A small team needs **two** tiers plus a release gate — not five. + +- **Tier 1 — PR fast lane (blocks merge, target < 10 min).** Lucee latest + SQLite: core WheelsTest, CLI tests, generated-app smoke, minimal browser smoke, `wheels doctor`. Seed already exists in [`pr.yml`](../../.github/workflows/pr.yml). +- **Tier 2 — Nightly full matrix.** All supported engine/DB combinations from the manifest; publishes a dashboard, uploads JUnit/JSON, opens/updates issues for persistent failures. Seed already exists in [`compat-matrix.yml`](../../.github/workflows/compat-matrix.yml). +- **Release gate.** Full matrix green-or-documented, generated-app lifecycle, upgrade tests from latest Wheels 4, **public distribution canaries** (Homebrew/Scoop/apt/yum installed on a clean system), browser tests, docs gate. A clean public install path is part of the trust story and is release-blocking. + +Generated-app smoke testing (run the same `wheels` binary users install: `new` → `generate scaffold` → `migrate latest` → `test` → `start`) catches template/CLI/docs drift that internal unit tests cannot, and is the cheapest high-value test we have. + +--- + +## 9. Deferred to 5.1+ + +Valuable, but not worth the scope risk in 5.0. Each can ship in a minor once the core lands and capacity allows: + +- **Application modules** (bounded `app/modules/` mini-apps). Deferred deliberately: it introduces a *third* extension concept alongside packages and plugins while we are trying to contract, and "Module" is already overloaded (CLI `Module.cfc`, package `ModuleGraph`, TestBox `registerModule`) — naming and concept-count both need design before it ships. +- **Scheduler and lightweight async** on top of existing jobs. +- **Schema-driven configuration** (`wheels config list/get/explain/effective`). +- **Convention-based DI service discovery.** +- **OpenAPI generation** from route metadata. + +--- + +## 10. What Wheels 5 will not do + +Stated plainly so the boundary holds under pressure: + +- **No ColdBox-style platform surface.** No HMVC request lifecycles, no broad AOP/interceptor system, no large named-subsystem taxonomy. +- **No BoxLang-first optimization.** Neutrality is the point. +- **No strategic conformance program.** A thin internal compatibility smoke set is fine; a multi-tier conformance suite sold as market positioning is not — users do not adopt frameworks because of conformance suites. +- **No RustCFML pillar.** Monitor only. +- **No contracts-first/RFC process gate.** Heavyweight process is delivery risk for a small team; keep coordination lightweight. +- **No action-argument injection** and **no three-idiom controllers** (see §5.3). +- **Not a major version for narrative's sake.** The only true breaking changes are the §5.4 removals. If, at beta, the breaking surface is too thin to justify a major, ship the additive work as 4.x minors and reserve "5.0" for when the removals and any idiom shifts actually warrant it. (See §11.) + +--- + +## 11. Open decisions + +These need maintainer ratification before implementation. Each has a recommended default. + +1. **Engine minimums.** *Recommended:* require Lucee 6+ and Adobe 2023+ for 5.0 (drop Lucee 5 / Adobe 2018–2021 from primary), keeping the matrix small and modern. — *Decision needed.* +2. **BoxLang support level for 5.0.** *Recommended:* Supported (not Primary), re-evaluated quarterly. — *Decision needed.* +3. **Oracle release-blocking?** *Recommended:* Supported, soft-fail (as today), not release-blocking. — *Decision needed.* +4. **`strictParams` default.** *Recommended:* warn-only via doctor in 5.0; opt-in enforcement; stricter default no earlier than 6.0. — *Recommended, ratify.* +5. **Is this a 5.0 or 4.x minors?** *Recommended:* proceed as 5.0 contingent on the §5.4 removals landing; re-confirm at beta per §10. — *Decision needed at beta.* +6. **Legacy plugins / RocketUnit:** core removal + external adapter, as in §5.4. — *Recommended, ratify.* +7. **AI-legibility scope for 5.0:** which of {route metadata, lifecycle trace, MCP contract, canonical generators} are core vs. 5.1. *Recommended:* all four are core but minimal; OpenAPI is 5.1. — *Decision needed.* + +--- + +## 12. Sequencing + +Rough order, optimized for landing user-visible value early and de-risking the hard part: + +1. **Coherence pass + matrix manifest (§3, §5.5).** Audit/document the v4 subsystems; unify the CI matrix. Low risk, immediate trust payoff. +2. **Strong params + response object (§5.1, §5.2).** Small, additive, the user-facing headline. +3. **RequestContext formalization (§5.3).** Additive `rc`; no injection. +4. **AI-legibility surface (§5.6).** Route metadata schema, lifecycle trace, MCP contract, canonical generators. +5. **Legacy removal + upgrade guide (§5.4).** The breaking work, once the new paths exist and are documented. + +Each step is shippable and independently valuable, so the release can slip scope without collapsing. + +--- + +## 13. Bottom line + +Wheels 5 should preserve the framework's most valuable quality — a developer can understand it quickly and build useful applications without ceremony — and spend its effort making that simplicity *durable and trustworthy* in a shrinking market: + +- Friendly `params`, backed by safer controller-boundary filtering. +- Simple controllers, backed by an additive request context — one idiom, not three. +- A coherent, documented v4 feature set instead of a bigger pile. +- Runtime neutrality, backed by an executable compatibility matrix. +- One real forward bet — AI-legibility — instead of partnership and conformance machinery. +- Decisive legacy removal, without fragmenting a small community. + +The competitor is attrition, not ColdBox. The win condition is that fewer teams leave CFML because Wheels stayed clear, cheap to maintain, and easy for both people and agents to work in. From a748630aee94cdb15a2d9306a62ac1ba3ea3bf8d Mon Sep 17 00:00:00 2001 From: Peter Amiri Date: Mon, 22 Jun 2026 05:09:26 -0700 Subject: [PATCH 012/140] fix(model): evaluate positional args in this.method() validation conditions (#3239) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A custom validation `condition`/`unless` expression of the form `this.propertyIsPresent('productid')` threw `The parameter [property] to function [propertyIsPresent] is required but was not passed in`. `$parseConditionArgs()` only understood named arguments (`key='val'`), guarding on `Find("=", param)`, so a bare positional argument was silently dropped and the target method was invoked with an empty struct. Teach the parser to also collect positional arguments and map them onto the target function's declared parameter names (via GetMetaData), producing a single named-argument struct — named-arg invoke() resolves uniformly across Lucee/Adobe/BoxLang where a numeric-keyed positional argumentCollection does not. Verified on Lucee 7 + SQLite/MySQL and Adobe CF 2023 + MySQL. Fixes #3238 Signed-off-by: Peter Amiri Co-authored-by: Peter Amiri Co-authored-by: Claude Opus 4.8 --- .../3238-condition-positional-args.fixed.md | 1 + vendor/wheels/model/validations.cfc | 64 +++++++++++++++---- .../tests/specs/model/validationsSpec.cfc | 23 +++++++ 3 files changed, 75 insertions(+), 13 deletions(-) create mode 100644 changelog.d/3238-condition-positional-args.fixed.md diff --git a/changelog.d/3238-condition-positional-args.fixed.md b/changelog.d/3238-condition-positional-args.fixed.md new file mode 100644 index 0000000000..016ab2d029 --- /dev/null +++ b/changelog.d/3238-condition-positional-args.fixed.md @@ -0,0 +1 @@ +- Custom validation `condition`/`unless` expressions that call a model method with a **positional** argument — e.g. `condition="this.propertyIsPresent('productid')"` — now evaluate correctly instead of throwing `The parameter [property] ... is required but was not passed in`. The condition argument parser previously understood only named arguments (`key='val'`) and silently dropped positional ones; it now maps positional arguments onto the target method's declared parameter names (#3238) diff --git a/vendor/wheels/model/validations.cfc b/vendor/wheels/model/validations.cfc index 53aa704755..cfd0ff5df3 100644 --- a/vendor/wheels/model/validations.cfc +++ b/vendor/wheels/model/validations.cfc @@ -584,7 +584,7 @@ component { Throw( type = "Wheels.InvalidValidationCondition", message = "The `#local.item#` expression `#arguments[local.item]#` could not be evaluated: #e.message#", - extendedInfo = "Supported forms: `this.property`, `this.method()`, bare `method()` (optionally negated with `!`), and binary comparisons using eq/neq/lt/lte/gt/gte or ==/!=//>=." + extendedInfo = "Supported forms: `this.property`, `this.method()` (with named `key='val'` or positional `'val'` arguments), bare `method()` (optionally negated with `!`), and binary comparisons using eq/neq/lt/lte/gt/gte or ==/!=//>=." ); } cflog( @@ -897,7 +897,7 @@ component { } if (StructKeyExists(this, local.methodName)) { if (IsCustomFunction(this[local.methodName])) { - local.rv.value = invoke(this, local.methodName, $parseConditionArgs(local.argsRaw)); + local.rv.value = invoke(this, local.methodName, $parseConditionArgs(local.argsRaw, this[local.methodName])); } else { local.rv.value = this[local.methodName]; } @@ -917,24 +917,62 @@ component { } /** - * Parses a comma-delimited argument string (e.g. "key1='val1',key2='val2'") - * into a struct of named arguments. + * Parses a comma-delimited argument string into a struct of named arguments + * suitable for `invoke()`. Handles both named (`key='val'`) and positional + * (`'val'`) arguments. Positional arguments are mapped onto the target + * function's declared parameter names, so a condition like + * `this.propertyIsPresent('productid')` resolves correctly (#3238). + * + * Named-argument invoke() resolves uniformly across Lucee/Adobe/BoxLang; + * a numeric-keyed positional argumentCollection does not — hence the mapping. + * + * Note: arguments are split on "," so a quoted value containing a comma + * (e.g. `'a,b'`) is not yet supported — this matches the prior named-arg + * behaviour and is out of scope for #3238. */ - public struct function $parseConditionArgs(required string argsString) { - local.rv = {}; + public struct function $parseConditionArgs(required string argsString, any targetFunction) { + local.named = {}; + local.positional = []; for (local.param in ListToArray(arguments.argsString, ",")) { local.param = Trim(local.param); + if (!Len(local.param)) { + continue; + } if (Find("=", local.param)) { - local.splitArg = ListToArray(local.param, "="); - if (ArrayLen(local.splitArg) >= 2) { - local.varName = Trim(local.splitArg[1]); - local.varValue = Trim(local.splitArg[2]); - local.varValue = Replace(local.varValue, "'", "", "all"); - local.varValue = Replace(local.varValue, '"', "", "all"); - local.rv[local.varName] = local.varValue; + local.varName = Trim(ListFirst(local.param, "=")); + local.named[local.varName] = $unquoteConditionValue(Trim(ListRest(local.param, "="))); + } else { + ArrayAppend(local.positional, $unquoteConditionValue(local.param)); + } + } + + // Map any positional arguments onto the target function's declared + // parameter names so the result is a single named-argument struct. + if (ArrayLen(local.positional) && StructKeyExists(arguments, "targetFunction")) { + local.paramNames = $conditionFunctionParameterNames(arguments.targetFunction); + for (local.i = 1; local.i <= ArrayLen(local.positional); local.i++) { + if (local.i <= ArrayLen(local.paramNames) && !StructKeyExists(local.named, local.paramNames[local.i])) { + local.named[local.paramNames[local.i]] = local.positional[local.i]; } } } + + return local.named; + } + + /** + * Returns the ordered parameter names declared by a function reference. + * Used to map positional condition-method arguments onto named arguments + * (#3238). + */ + public array function $conditionFunctionParameterNames(required any targetFunction) { + local.rv = []; + local.meta = GetMetaData(arguments.targetFunction); + if (StructKeyExists(local.meta, "parameters") && IsArray(local.meta.parameters)) { + for (local.param in local.meta.parameters) { + ArrayAppend(local.rv, local.param.name); + } + } return local.rv; } diff --git a/vendor/wheels/tests/specs/model/validationsSpec.cfc b/vendor/wheels/tests/specs/model/validationsSpec.cfc index e3d6d1335e..6dfdc974d7 100644 --- a/vendor/wheels/tests/specs/model/validationsSpec.cfc +++ b/vendor/wheels/tests/specs/model/validationsSpec.cfc @@ -215,6 +215,29 @@ component extends="wheels.WheelsTest" { assert_test(user, true) }) + it("evaluates a this.method call with a single positional argument (##3238)", () => { + expect(user.$evaluateConditionString("this.propertyIsPresent('username')")).toBeTrue() + expect(user.$evaluateConditionString("this.propertyIsPresent('nonexistent')")).toBeFalse() + }) + + it("evaluates a this.method call with multiple positional arguments", () => { + user.stupid_mixin = stupid_mixin + expect(user.$evaluateConditionString("this.stupid_mixin('1', '2') eq 3")).toBeTrue() + expect(user.$evaluateConditionString("this.stupid_mixin('1', '2') neq 3")).toBeFalse() + }) + + it("if validation runs when a positional-argument method condition is true (##3238)", () => { + args.condition = "this.propertyIsPresent('username')" + user.validatesLengthOf(argumentCollection = args) + assert_test(user, false) + }) + + it("if validation is skipped when a positional-argument method condition is false (##3238)", () => { + args.condition = "this.propertyIsPresent('nonexistent')" + user.validatesLengthOf(argumentCollection = args) + assert_test(user, true) + }) + it("both validations if triggered unless not triggered valid", () => { args.condition = "1 eq 1" args.unless = "this.username eq 'TheLongestNameInTheWorld'" From 8cfd176942984fb7d9a10ceaffb57221d39dcf04 Mon Sep 17 00:00:00 2001 From: Peter Amiri Date: Mon, 22 Jun 2026 07:00:02 -0700 Subject: [PATCH 013/140] docs(web/blog): Beyond findAll: Scopes, Enums, and the Chainable Query Builder --- ...yond-findall-scopes-enums-query-builder.md | 266 ++++++++++++++++++ 1 file changed, 266 insertions(+) create mode 100644 web/content/blog/posts/beyond-findall-scopes-enums-query-builder.md diff --git a/web/content/blog/posts/beyond-findall-scopes-enums-query-builder.md b/web/content/blog/posts/beyond-findall-scopes-enums-query-builder.md new file mode 100644 index 0000000000..051f45dcc3 --- /dev/null +++ b/web/content/blog/posts/beyond-findall-scopes-enums-query-builder.md @@ -0,0 +1,266 @@ +--- +title: 'Beyond findAll: Scopes, Enums, and the Chainable Query Builder' +slug: beyond-findall-scopes-enums-query-builder +publishedAt: '2026-06-22T14:00:00.000Z' +updatedAt: '2026-06-19T14:35:00.000Z' +author: Peter Amiri +tags: + - wheels-4 + - models + - query-builder + - scopes + - enums +categories: [] +excerpt: >- + Wheels 4.0 ships three model-side features that compose into one design: + scopes name reusable query fragments, enums turn property values into + auto-generated checkers and scopes, and the chainable query builder swaps + raw WHERE strings for fluent, type-aware composition. This post walks all + three through one worked example and surfaces the bug I hit while writing + it. +coverImage: null +--- + +The first thing you learn about Wheels' ORM is `findAll(where="status = 'published'")`. The first thing you stop learning, six months later, is *anything else*. Raw WHERE strings work for the four-line query you wrote on Monday. By Thursday you're concatenating user input into them, by next month you're copy-pasting the same `status = 'published' AND publishedAt <= NOW()` fragment into eight different controllers, and by the time you go to add a filter for "published OR scheduled-but-the-author-is-an-admin" you've forgotten which file the last similar query lives in. + +Wheels 4.0 ships three features on the model side that, taken together, are the answer to that drift. *Scopes* name reusable query fragments and compose by chaining. *Enums* take a property whose values are a closed set ("draft, published, archived") and auto-generate the checkers, validators, and scopes for it. The *chainable query builder* replaces raw WHERE strings with `where("column", "value")` calls that auto-quote and type-check on the way to the SQL. + +They're three features, but they're one design — every one of them returns the same kind of deferred-query object, and they all flow into the same materialise-on-terminal-method path. You can chain a scope onto an enum onto a builder onto a `.get()` without thinking about which is which. This post walks all three through one worked model and shows where they touch. + +## A reusable query fragment is a scope + +Let's start with a `Post` model (`app/models/Post.cfc`) that has the kind of query state most blogs end up with: a status (draft / published / archived), an author, a publish date, view count. + +```cfm +component extends="Model" { + function config() { + belongsTo("author"); + scope(name="published", where="status = 'published'", order="publishedAt DESC"); + scope(name="recent", order="publishedAt DESC", maxRows=10); + } +} +``` + +The two `scope()` calls register named query fragments. Each is a struct of finder arguments — `where`, `order`, `select`, `include`, `maxRows` — that you'd otherwise hand to `findAll()` directly. From your controller: + +```cfm +posts = model("Post").published().findAll(); +``` + +`published()` isn't a real method on `Post.cfc`. The model's `onMissingMethod()` hook recognises it as a scope name, looks up the registered struct, and returns a `ScopeChain` proxy carrying that scope's specs. The proxy has its own `onMissingMethod()` for the next link in the chain. Nothing executes yet — `published()` returned a chainable, not a query. + +`.findAll()` is the terminal call. The proxy materialises its accumulated specs into a single finder-argument struct and hands it to the real `findAll()`. The same finder Wheels has had since 1.0; the same SQL it would generate from `findAll(where="status = 'published'", order="publishedAt DESC")`. Scopes are a layer over the finder, not a replacement for it. + +The interesting property is composition. Stack two scopes and they merge: + +```cfm +posts = model("Post").published().recent().findAll(); +``` + +`recent` only declared `order` and `maxRows`. `published` only declared `where` and `order`. The chain merges WHERE clauses with `AND`, *appends* `order` fragments in declaration order (so `published`'s fragment sorts first — both happen to be `publishedAt DESC` here, but the rule is "earlier fragments take precedence"), takes the last `select` declared, and takes the most restrictive `maxRows`. There's no separate "scope merger" object — `ScopeChain.$mergeSpecs()` walks the accumulated specs in order and rolls them up before handing to the finder. You can read the implementation in a few minutes; there's no magic. + +### Dynamic scopes take parameters + +Static scopes — fixed WHERE strings — are fine for `published` and `recent`. When the filter is parameterised, use the handler form — back in `app/models/Post.cfc`: + +```cfm +function config() { + belongsTo("author"); + scope(name="published", where="status = 'published'", order="publishedAt DESC"); + scope(name="byAuthor", handler="scopeByAuthor"); +} + +private struct function scopeByAuthor(required numeric authorId) { + return { + where: "authorId = ?", + whereParams: [{value: arguments.authorId, type: "CF_SQL_INTEGER"}] + }; +} +``` + +`byAuthor(42)` invokes the handler with the argument, the handler returns a spec struct, and the chain absorbs it the same way it absorbs a static scope. The `whereParams` array is the safe path for user input: the ScopeChain splices a quoted, escaped value into the `?` placeholder, which the finder then re-parameterizes into `cfqueryparam` downstream. Wheels also runs a sanitisation pass on every handler argument — it strips null bytes and escapes quotes and backslashes so a value can't break out of its quoted literal — but that's escaping, not keyword filtering (legitimate values like `Union Pacific` pass straight through), and it's defence in depth, not a substitute for parameterisation. Prefer `whereParams` over hand-rolling `where: "role = '#arguments.role#'"` so the quoting isn't your job in the first place. + +The defaults are reasonable: `whereParams` is treated as positional, and the type strings are the standard `CF_SQL_*` constants. Inside the handler, you can run any logic you want — branch on the argument, look up another model — as long as you return a struct with the finder-argument shape. + +## An enum is a property-shaped scope generator + +A `status` field with three valid values — draft, published, archived — has the same shape as a thousand other Wheels models. The pattern in plain Wheels is: + +```cfm +function config() { + validatesInclusionOf(properties="status", list="draft,published,archived"); + scope(name="draft", where="status = 'draft'"); + scope(name="published", where="status = 'published'"); + scope(name="archived", where="status = 'archived'"); +} +``` + +Four lines of bookkeeping per enum-shaped property, repeated wherever you have one. Wheels 4.0 collapses it to: + +```cfm +function config() { + enum(property="status", values="draft,published,archived"); +} +``` + +That single call registers: + +- A `validatesInclusionOf` check on the property, so `status = "wat"` fails validation cleanly. +- One scope per value (`draft()`, `published()`, `archived()`) so `model("Post").published().findAll()` works without a separate `scope()` call. +- One boolean checker per value on the instance: `post.isDraft()`, `post.isPublished()`, `post.isArchived()`. + +The scopes are parameterised — `where: "status = ?"` with `whereParams = [{value: "published", type: "CF_SQL_VARCHAR"}]` — not string-interpolated. Auto-generated code is the place the framework can afford to do the safe thing without you remembering. + +Two value forms work: + +```cfm +// Names map to themselves — stored value matches the name. +enum(property="status", values="draft,published,archived"); + +// Names map to explicit stored values — useful when the DB column is +// an integer or you need the names to differ from what's persisted. +enum(property="priority", values={low: 0, medium: 1, high: 2}); +``` + +The struct form coerces every stored value to a string before the underlying scope is built (so `0` becomes `"0"`). That's usually fine, but if you have a numeric column and a literal `0` is meaningful, double-check the comparison in your SQL log. + +A few sharp edges worth knowing: + +- **Value-name collisions.** An enum value named `name` or `update` will register a scope called `name()` or `update()` on the model. There's no guard against collisions with method names you've defined. If you write `enum(property="action", values="create,update,delete")`, the collision is silent and cuts both ways: at the model root the real `update()` and `delete()` win and your scopes are unreachable; on a chain the scopes shadow the methods. No guard fires in either direction. Pick value names that don't double as verbs the framework uses. +- **Invalid characters in stored values.** The framework rejects single quotes, semicolons, comment markers, and other SQL-injection-shaped characters in enum stored values at registration time, throwing `Wheels.InvalidEnumValue`. The values you provide are baked into auto-generated scope SQL, so this is a registration-time check, not a runtime one. It only fires if you write something like `values={oops: "it's fine"}`. +- **Validation fires on save, not on assignment.** `post.status = "wat"` doesn't throw — it sets the property. `post.valid()` is what surfaces the inclusion failure (`errorsOn("status")` returns a validation error). If you want to fail on assignment, you'd add your own setter; the enum machinery doesn't intercept the write. + +## The chainable query builder + +Scopes handle the named, reusable case. The query builder handles the ad-hoc, runtime-composed case — the place where you used to reach for a raw WHERE string and concatenate variables into it. + +```cfm +posts = model("Post") + .where("authorId", session.authorId) + .where("views", ">", 100) + .whereNotNull("publishedAt") + .orderBy("publishedAt", "DESC") + .limit(25) + .get(); +``` + +Three calling conventions for `where`: + +- **`.where("clause")`** — passes the string through verbatim. You're back to manual quoting territory; don't put user input here. +- **`.where("column", value)`** — equality, auto-quoted: `column = ''`. +- **`.where("column", operator, value)`** — operator in the middle: `column > `, `column LIKE `, and so on. + +Auto-quoting goes through the database adapter's `$quoteValue()` and is preceded by a *type check* against the property's declared type. If the column is declared `integer` and the value isn't a valid integer literal, the builder throws before any SQL is built. That closes the classic injection vector where `"0 OR 1=1"` slipped through the unquoted numeric path. The same goes for `float` and `boolean` — those payloads get rejected at the type check; everything else, dates included, is escaped and quoted on its way into the SQL. + +The full method surface, in addition to `where`: + +| Method | SQL | +|---|---| +| `orWhere(...)` | Same conventions as `where`, OR-combined | +| `whereNull(column)` | `column IS NULL` | +| `whereNotNull(column)` | `column IS NOT NULL` | +| `whereBetween(column, low, high)` | `column BETWEEN low AND high` | +| `whereIn(column, list)` | `column IN (...)` | +| `whereNotIn(column, list)` | `column NOT IN (...)` | +| `orderBy(column, direction)` | `ORDER BY column direction` | +| `limit(n)`, `offset(n)` | `LIMIT n` / `OFFSET n` | +| `select(columns)` | column projection | +| `include(associations)` | eager-load associations | +| `group(columns)`, `distinct()` | `GROUP BY` / `SELECT DISTINCT` | +| `forUpdate()` | pessimistic row lock (DB-dependent) | + +Terminal methods materialise the chain: + +- **`.get()` / `.findAll()`** — returns a query of all matching rows. +- **`.first()` / `.findOne()`** — returns the first row as a model instance, or `false`. +- **`.count()`** — returns the integer count. +- **`.exists()`** — returns true/false. +- **`.updateAll(...)`** — bulk update, returns rows affected. +- **`.deleteAll()`** — bulk delete, returns rows deleted. +- **`.findEach(callback)`** / **`.findInBatches(callback)`** — stream rows for large result sets without holding them all in memory. + +Like scopes, nothing happens until a terminal method fires. You can build a query object, branch on it, layer more conditions, and only `.get()` it once at the end: + +```cfm +query = model("Post").where("status", "published"); + +if (params.authorId != "") { + query = query.where("authorId", params.authorId); +} +if (params.sort == "popular") { + query = query.orderBy("views", "DESC"); +} else { + query = query.orderBy("publishedAt", "DESC"); +} + +posts = query.limit(25).get(); +``` + +That kind of conditional composition is what raw WHERE strings make ugly. The builder makes it the natural shape. + +## Composing all three + +The three features compose with no special integration code — they all return objects that implement `onMissingMethod()` and accumulate state into the same finder-argument struct on the way to the terminal call. Here's a query that uses all three: + +```cfm +// Post.cfc +function config() { + belongsTo("author"); + enum(property="status", values="draft,published,archived"); + scope(name="recent", order="publishedAt DESC", maxRows=10); + scope(name="byAuthor", handler="scopeByAuthor"); +} + +private struct function scopeByAuthor(required numeric authorId) { + return { + where: "authorId = ?", + whereParams: [{value: arguments.authorId, type: "CF_SQL_INTEGER"}] + }; +} +``` + +```cfm +// PostsController.cfc +posts = model("Post") + .published() // enum-generated scope + .byAuthor(session.authorId) // dynamic scope + .where("views", ">", 100) // builder where + .whereNotNull("featuredImage") // builder whereNotNull + .orderBy("publishedAt", "DESC") // builder orderBy + .limit(20) + .get(); +``` + +The chain reads top-to-bottom in the order you'd describe the query out loud: "published posts by this author with more than 100 views and a featured image, newest first, top 20." The SQL Wheels generates looks roughly like: + +```sql +SELECT * FROM posts +WHERE (status = 'published') + AND (authorId = 42) + AND (views > 100) + AND (featuredImage IS NOT NULL) +ORDER BY publishedAt DESC +LIMIT 20 +``` + +Each clause comes from a different layer, but the layers don't know about each other. The scope returns a spec; the dynamic scope returns a spec with whereParams; the builder appends WHERE conditions to an array. `$buildFinderArgs()` walks both lists in order, joins the WHERE fragments with each clause's own connector (`AND` by default, `OR` for `orWhere()`), appends the `order` fragments in chain order, and returns a finder-argument struct that the terminal method hands to `findAll()`. It's the same finder you'd call directly — the chainable surface is sugar around the existing implementation, not a parallel one. + +## What changed while writing this post + +While testing edge cases for the builder section, I tried `model("Post").whereIn("id", [])` to see what the framework did with an empty array. The answer was: nothing good. It produced literal SQL `id IN ()`, which is malformed in every engine Wheels supports and surfaces as a generic syntax error from the JDBC driver. No framework-shaped error, no pointer to the line in your code that built the empty array. + +Empty inputs to `WHERE IN` aren't an exotic edge case. They're what you get whenever the values come from another query, a form filter, or any computation that might return zero results. The Rails community converged on this pattern in 2016, Sequel matches it, Django matches it, Laravel Eloquent matches it: an empty `IN` matches no rows, and an empty `NOT IN` matches every row. It's what the SQL spec implies and what every other framework's users expect. + +Wheels now does the same. `whereIn("id", [])` sets an `$alwaysEmpty` flag on the builder; every terminal — `.count()`, `.first()`, `.findAll()`, `.exists()`, `.updateAll()`, `.deleteAll()`, `.findEach()`, `.findInBatches()` — short-circuits before going through the finder, returning the appropriate zero-row sentinel (`0`, `false`, an empty query, or no callback invocation). `whereNotIn("id", [])` is a no-op: it appends no clause, so the chain proceeds normally and every other row matches. The chains compose cleanly — `.where("status", "active").whereIn("id", []).count()` still returns `0` because the terminal sees the flag first; `.where("status", "active").whereNotIn("id", []).count()` returns the count of active rows because `whereNotIn` of nothing excludes nothing. Fourteen new specs in `queryBuilderSpec.cfc` lock the behaviour in: every patched terminal, the empty-array and empty-list inputs to both `whereIn` and `whereNotIn`, composition with `where`, and the documented `select()` silent-ignore on the short-circuit path. The reference table in the query-builder guide notes the short-circuit so you don't have to read the source to confirm it. + +The first cut of this fix tried the more obvious approach: append `1 = 0` and `1 = 1` as raw SQL clauses, the way Rails docs describe it. That broke immediately. Wheels' WHERE-clause parser in `vendor/wheels/model/sql.cfc` runs a property-extraction regex over every clause it sees — even ones like `1 = 0` that don't have a property — and threw `Wheels.ColumnNotFound` on the literal `1`. The fix that shipped is the one that works alongside the parser instead of around it: short-circuit at the terminal so the parser never sees a column-less clause. Either approach is correct on the SQL side; only one composes with the rest of the framework. + +This is the same shape as the rate-limiter `windowSeconds=0` fix from the first post in this series, and the OpenCode template drift from the third: the article ships alongside the framework change because finding the rough edge is most of the work, and the cost of fixing it once you've found it is almost nothing. + +There are a few related rough edges I didn't fix in this PR but that are worth naming so the next person who hits them knows they exist: + +- **No `.toSql()` method.** If you want to see the SQL the chain is about to generate, you have to enable the debug panel or step through `$buildFinderArgs()` yourself. A `.toSql()` that returns the would-be query string without executing it would be useful for debugging complex chains. Filed for follow-up. +- **No `defaultScope()` / `unscoped()`.** Rails lets you declare a model-wide default scope (e.g. "always filter out soft-deleted rows") with an escape hatch (`unscoped`). Wheels doesn't have either. Soft-delete is the obvious motivating case; if your model has a `deletedAt` and you want every query to filter on `WHERE deletedAt IS NULL`, you currently scatter `.whereNull("deletedAt")` through every call site or write a wrapper. Not a bug — just a missing affordance. +- **Enum value-name collisions are unchecked.** `enum(property="action", values="create,update,delete")` will silently shadow the model's own `update()` and `delete()` chain methods. The framework could refuse to register an enum value whose name matches an existing method; today it doesn't. Pick value names that aren't verbs. + +The next post in the series is the last one: *From Empty Directory to Deployed SaaS — end-to-end with generators, multi-tenancy, jobs, browser tests, and `wheels deploy`*. That one's a longer post. Coming soon. From db98af0299198bd1fbf9e70623bdc6f99a15a5e0 Mon Sep 17 00:00:00 2001 From: "wheels-bot[bot]" <283220952+wheels-bot[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 14:07:52 +0000 Subject: [PATCH 014/140] chore(docs): auto-refresh blog visual baseline after content change [skip ci] Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- web/tests/visual-baselines/blog.png | Bin 126496 -> 132975 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/web/tests/visual-baselines/blog.png b/web/tests/visual-baselines/blog.png index aea03024b5e01936a661ec64dfcfe191b2fe993e..a50a6889cb10f75acacac045095fc3d08c826f2d 100644 GIT binary patch literal 132975 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%0D(0ozE;))_GM<7<^(48WFruBm zgyF7ot9T*Ic1hg$1L3^~BVieW)Zq3_%LHZ7CIA)q{5OqTwzo`nJB~x*PNB#1Y1a}# zA{lev_CKW7u5@1G-TycQMDbKl6&2CS=#5VD%K76rEJh?(Ea`%!fyqNpOCu3DH zF)dBK{(NhyQu4{|QEHvaGuRmpLxRx@Qbo}6R9DB+b95%1AQsRYo~CGF&QrB=Ns9i% zB|1g*4D7|24pCDhBcsvms?LFHgWl-=AjDSIsR@JBH1Uvb(3U!8D3n28`S9Y2ar`6L z&tXD0hRbh{;&#a-pS;3dLQo#zp)GIlGyPTsd7+5pcqFX-2v zWNn^Pno;LflDM)Ft32Ogbif7p4qy zhOsnkc}uPCSqPrb)?<}hcmR?iRI^syk#bO3P4 z^HyqAy2`cOw{4No*~L25^)%En7ZdoCPmR(>(|twkOI)dIl?Wwj*)UBWtEI73y`K|H zO^d=nZIoa~1FgT6@_7^_umpDb;D{<#Bi-g;I~2kz_wuunUpRJPWTzv91T@jP0JoAE zf_5m7NF$^0(Aw26NZL$$ZhIFO2|O0px_L zMOn=b%$V(f#_^ha)C}(K_~lxQzz7ECT*!g=`%!^ z(~=TO#RiEo=|_RVbbVjpt2~dqBInd}D(BPZ@i>a&#tvBFuv2nI$P<78bqnYQaSYktw@T#1)KOWjfV3kdZRV!M)igOjH13o zbkH+PP_a}dAM%11?;$!eMXQJvCqA_UC#9S_hy7H)iH-o;u*Pnb&RsPKJ<)=Y%#`pY zEzjsZf<>Q&gYxoL0#RjfP;Xm=HF&iylS5TG)*umvrdW=jf26JB`N-^0;U%Vg7T^f$ z7*7AgvJ>8sEIMa8egOIVi&x~?uag^Zw0p}XF%w>L$ioet#u`A;tQRMgU$gCS4tOlR#TJx97@4uFZaFuJRFT%*TDvKDpdCJ59?Kgv2i+vrvZ%cH$^|9(Y z5lMLI>1>AyzVnMkfbFCewn`92Lx3y@jmCD~WddY~37AnbYz^Bg?aLZQ!&vTt0a;(P z!^%&LOS)j_@zENKB>Fa_BS`8M7&0NZ>8{5`9UVVWI|T4P!zD)I5FM`}m+ z4LG8eyrK8rAMcJUN0{wF=F}K|%|G{uIlboHI~yhOr5J!rRV)L1<4mNZqLhbGR5vR# zKhA65wP2x`@APcYERi4tGREhwz-~F9JE1=$?AKj?P31&#iNafOnX|ArAla_2BbY&= zERdj}0yFKYcCSNjP|jE(ZAa57wQ&6Of>)#>+8At{Owvry+{KJ$|SfCKxcfd3?UA^bTt`{FhViYyw`+XIr_L^OXpee zMkuG^gL>)ss(q1GP%*~3sF-7&YBjkRduV}%Z22Kmo?~=6@Qo2F6cxs2+kFB~tw}{O z*@8;&V@fV25~g@O`RqJ*qQZDspwj|`6eXtvYhgvKMr)(CctqqB#kA6bqYlVYLcuCn zKm5s4CEVPvv@tCeowS$?3a5mip<$pFj{%ScOJ|oeNx>$i)XK~ezs~Hts+3U+pjR8M zO%(#bD~Rk_v)aWiS|OxuI@zvk#6V0jMaM9}&k1p{salH#X+;p@WoqLdc1WyP6-3*R z&M9WmiJO&~@U+)UA|Zh+utc{?(1inPBm*OT+i}E7=N^V(klTPgfW(?EsW~JsiGG5Wh7TJQww3NwFuzR>&o$*Q-00TdhdYMv5fogz#s)n00fg%Nr z3_~YQ?6kUXQ!W{g@rt)ey27b*5jsL7VRwh5S*7z6|B+kS`19Rf_6$JO6+cv>PHY_j zrxaZ*x6fb**$_P~MG?NL^2So+lZS#xTz35kD+i6 zQkY4iPtInaM5acGdLH!ESb9<}<`XR)c;6#IBBzECC@f0EXG|k$a%33bu0@y9xTe2o zKyK5b&X-MF*xP%{O|JFmF|||v&P8-kj-s7|+zFsFTmcca=gaNYS=#kd{G|#2mtGPr zF?vNCX+nz^jxCw+0gw}MDib5z^*|`M#X=P;65ZzPG|B0ulyz&+6cqHzd4j|QR@;g?HUzU2o=kp825U7Y9Pp6IpQLr7= zOgh3eo7poV6f_`--?*Z?MHIYwqd_jU#MR!o&61@^6LGjLZ}mEMcAMyn3zs=yb-+7` z12n6!@EToKbM-c*!;qjhC7VGy?uK9g$+!ym|)1yG`oRI1CQAnF97 z#7XGw&MIrZ1~R8UfXhcc-3Rv4H5(PeBw`w zQ$*U^iGn=|+`e+m?cCo_08kl0B#B+Ey~J(=>qnvrw$Ok9qZEtJ2VoB*Mt$5o>`Yj_0#$=WJ!z#TIKDBf4=*Lpi`||VHv68(&H~C*F zDMH~GFa@jHt7eNltZxxJ=^jMMl1%`@dRBv@uOhV-G}@MIn|tMpKE7f1jxna~8I<++E6b&0bm&vTRog#3$6wcuFk4o{Ii-lNaEGUuf-pK`UEgiSdzP-Fp0r?WFTl< zATVqh&~A-3s_#YmxREMvh+z&ISWOW9I1NaCoq`Dv`LS=AD2!TOndh+Ap}cA9r}3^h4EWCRQvn11Chr*9X&P?1A6J=rUM4A z(LIg1Dsx$9gyYe~^e`jYoR!M?aEE~5sqGfij}_Ixj2N)A$VfICk^y?%C@s<>X98&N z?1sb_T9?3g*pa*$gbA*>zM`S)D3FdQf?~y}_dk{_-J1168@>Ki8fe%|{%OkQ zQt(q-F{lC``T0z(nB>CIf!5`IynXaZTpaX? zQ8Kw@wJ=%yaIrmw$Q&O0CPI~_1_TVqHiV3e@TVy!!=UJt?N({WcY1?k#zWs~IR9e2 zGD4B!q)&q~bwB2mbRHOLIUt?oEbDfZi>--tS5EF@;>x4jtCe^*L)S`k_E6TT58Gw! z1e65{YXwiHM-rYZT%$7<_hD&Y^ubyKR#P8Fj)Jps0?lz7DA1Nhnp!(dy(_rkfqnH2 zpwm7qUMB?UBvxTnN=8&QXz|)SD^L3$3x+K?M{U&e9y^h8P2TaLCO01*{dH(waT(my z5B)F~X}vCz>KHz;OCap$#>&<52(Q>%r2Nv=AQd4Y_{|5EqB5qRKd@gPXjYdtAXac) zv53-k-r_A`&gcm1$KGBaM>C1bn;;7IVyi-~@@B+V4r3w`rWIZ(QuRgP>y3)}lVy(e>;CpPb0n*k0i&2Di@;c&)sr8Mbe=Ll-J=enQDE#@88L8B!COyrF zr30-pU-8VgLxZQEDJYJ%0*ZujUJI?>kvi~G#ez3zp=(to1Mi2`EM}TH4-zAaA-i+|Y`X^Nf~m2ZZQH^(t6 zmR8pe3Kk=!HlI-83*_thL6i9d6<%h|tXZq-P;kL=5`r#Jwx5GSTXUTM!fhc_l|;Gp zj#AJ-V8QVr;N!JK_iJnQc@v{ihCOB2j|AI2Y4@lp8_{`N;)~DCDk?ocRhHF;^K{%! zcg4SJ%8saG31UC;y}WGP5)vIcBOuKg7O5`3X-Z5Z4^NOhi49YfhS)^|R+ZxX-0~hk zY&xaAmIvRNYD>M$AIda=IqgHL1;!A8+SpdsZ)* ztnj7lnwCywB2V3X3LRHyrF9pJF@e3}Uub0hnC|9LXQ4j%Ve$$z85FMLcm+mZzcG|D^i;GQEaY$T^YR}cNluW-IJa|2(DNk{br4((eS1K=RDFiL)hq>|^ zFxCx5VCk*FKgsiOTHF4B>O>1wQ($lq1!7PZJex)^N89 z{gi^XaKN1Ad)Rw&xQ4ZiTw@ogQHIY`g}>A5kr3g|jutCsbgg<2{R;Sn+B{<)R<6D$ z<~U;9j>o4nOra8kY;+MW!kASdumGctxn6;T)|_k~$= zYy4T|00?_fFw~bP7Nt2ldP54tR(1$xT}k)P7P)p}ARIf@hOKX^@S=*ETqy6!nJ@uv z$#Zq_>wXj_1Ttt206$bp&_wJHI!!Iv77t6v z+6mgMt4{ieN1X4#b03FZ2F1&Ac8_fclStYLqE7wxy+~SSWT$M z^Vm?^wQMa>8!0khc?4pMvBA;g)esPa2J$c_eMb<6nqemluUawD zuKXir^$ac5T%Lmi*63bn_dbS%v8LXJ)Pqa^r4%_z#i^FQ^X1BRfQ?>4g-rTliU6(1 zlA%sqZHRTyrVqaVwE8|DHI*^jXY1tt;!6Up7ow!3V$Pp;l?ETsJwIoP>Eb=P$NSyO zCffRM9hogz>7erV$X1-_X%j`&?AXxqQK@`RrP;&pqfBzdEsBzfW4f9iyv$VG`hiO7 zM&|Lr-c7GkF~56dq|%6@L~2Y>(|2!LqOBk3uQC}Xk@h5Jn0AmYur8Px65J8ko#PaT zD8RS7l~y4os(N!WV>_d5Qr>d5;DKBrJ)aXC!n=V*r?kMeU>#|Ms;m%|d#j@7Gsjl> z88zr&%BAaey#nv_;)eCxCGs#*niV4)5yJOf6(SpsE1fV&4xkUs=ZsJA`eLNxk_if& z_t>&7C4MivT2Ghlc$
T_z(NfDuF2dCob*{3JGIKsHp-L$~GBwNz@88|POKTOKk zVTYs&X1TLgOY@7Qb@keA?)&p?SAra7)v62`@*FEq8+p@vy01o z<_+0Nsg(tBBh(*d&|NlLnt^1l2JePjno` z2^Nbp(F>YH`oTrIkns8YvQdsMoN^)*Dcq0356}C(-f1Do`VxbrOp+6&+t|_YtN+>6#gwv=Pxq#xF}~Hl2-->J&q)I!c)X0VqX*6jkCi(3mv5 z#7GKjHkYTzYbKuwv}TT#t!a1Mki1*1rUKrL9!46DS#EE48irtDIs*-K)Sbe~GjzkL zWcs1Mm+RY$(4s07%AlW!@bVkvNLg>M682E)zWYlI**l2D@&_n%*s1Y0EK+{ktA2<4 z?fiuRQI6=0_-@H-pLb+4=Bonke4qf5Q!>~F+bqa{902uJ<@)HHnJg2Bh3-a(>kM-^ zmPo2fcN;LW*G0VPHjHbFYasSVLvVFU_NPsNaI##_1XM&h%j` zr44^RZIMlboe6eSW|$f7ymCiqz;aj%WyASXtmZ=aMY4~%-s1(l=Uaa^gNC5+AM*z| zQOB*&q<=Q+P=pa+SThR z6IwnK;~6)dE9HwOyb@w&jyIorimQkYth1Q0YEX0v8KweD!rBDxy&G#4L^?e+Zs;#^ zC%7tARHV`#S1c9aTf?Fd;UeVnx!bV1RzCj7?P)!w5vf28lzz^fiwzbSKdCx6Dy@QQ z{YGxI>+2UhSv^nwTBk@S((3@yD=3X#U+01HF`=hIC+rSpIUqh4;>0RtqfP1@KPy;X zD{l5#Y5ko_=O4_JBQHT^!})VWO6p{NS)2>?CKLz_SA{beIcVa#Y34S#Xu^(}X#Q03 zkTAc#{Zn*^G6>;>z9uwN5}B|zq*WEj0(T;%u;`cHM4)h{&WC@R{1&8OYwNgZancgZ zNgMpR6oO>>ej8;awF2p}OhB%{-SMIxWC`6gIKUl0%WRz$l|rRvO}pP5yiUhRrtalK z#_DX%h?a57`I41;ClE7b|Je;ctR3i^g;d;ECs&5zByl69eND4#dkbgOYUpA@YAb8J zLQ&t1zKAUH$tkMt^ULkhv-BbtYrgLN6A9QPB|*xAcrD*{RyowYs%uh475RiwmM{)mmMgR&p%2(vy(H+9=K{EOfy^awRA( z;@P?m1PEwZmiKR;ujSE5vuBOqS=!FD8Zar!YcS$5u6HKKh+?y8NI>oFw^;#Sj=08>+(R{QnR6I+)0?6IMeM5^+Pi%O$=GARQ_u_nd^+*Tuo9B<8An} z1RWtc5$%eO=2HIszK;`@wGV3E&J+egrS01G!xX|mhEhf(w(U8&F%+fNSbX`ox=Smm zdZrGKA(ts0+_!DWYLwZra+3lYJ#?-C9t-u(E1*RAqIWB4y2Zpe@B9P`WW4I*qMPTN zWn3v?fy6-!LPPv1ff>K2W{|##)??aCvz*1wsbg18$6t^WBrA7=AgO9er+QwOt%W0I z75r8tNijUazH(5EjFPEj&IfHwu$lvIOS8gu(4xV@BB%zR#On-dw9KqrA!<8m!~jjp z?rhqW^yb%mbVuG3mW2;xr0O0wn~|;Ww1mgjq32khoDeU-^Y-H-UcXazcXcreNq<7d z#En%*tJl+bQkilcIqgt%iTXiR3ZOjzgZtJ^!TcRh`kfF)%lI8s6cRy#;xKaGl5Hbj zO0c(RdgXJXV=g}0m+fTRWhlT~w$9AEAm@_DGR3xfnTH+tKAQ&(q7h{av## zyw-Aseb?u#KPnw>l!S6{>7Cf`&HzjBTGIkOvn0HHpBkDSa5e`OL^uueoA}`h7m5j7 zW|h7Olm;3#aN;ogpY?V%Ry0S|EL#dwr$7rkNfuX%K4MFIg-#0G&nKy^sd;%*kemS? zdH9_a8GQdFeZ6q;e3R)f^jP1kPrtL2A@Tmmcmg<&yaMhsDb?G%!O+|3BO-!cEGKgHq ztZqY4i7}(LO6kH60p}#My0}diDr9*EOe}Bb2UZN~zqofq8v7tKW4aLwzRj~WAS=)Z zZ`~4(o@RGFC7Mk(3W|n|-GrEl5GBggbvn{ijj&*P9#U-)(#VJMC5no0sP^;~sLyE& z0Qih^QTQE6-wDs;(44Jn+@D;;UW$pz$OxB#0dW7<3S(#i-+0f6p9adn4Ruaa~`9sbvCYotFqbvmFFig*z!1TbflAj`v9zvbH~Yj1V+4qMYZsoi1Db!g@K%GNnr7PlzULK z$><9hQ)r198=uocd`>r{TH{V&pD|mP2_f(P3}libdj0OU>4DIp{1XZh;)jg_31K5K zkDx1OXWTe&swF!IE1Rm{wQ^(eTDxd>xgHGvgEU|O`Q{J9-T zixMxTc0RF%9Uo^c93&59GUQ(f)(rfR%?sR~XIBUCk=BOOy%dD{7~R&Q#f18GfV6@r zrd*J@q=LUD6#Iw$j~Xz4nJ26th8w3Fe5XT;p+dVBD|b8x1<&H$NfdxJs0`RYf>Dy1 zJIID}X<=b88+1uc>-L8pP%sb^|GHw>x4!|k5LE%9wcsE7KcDTz|FsoEt1kS>*FTqp zCdknY`*rwW!;NM)Aji&Mz|u1@PIqI)BFo3sBRkcMYT{>)-RfNJf(XFq(0_kgeITK5mixn#+6&13 zWiRm8zyD=B;X-YUO$zDv1x=BhHMKG-pM8*|qB+EkIVT!shJjs@HcT3WT%_oX&AcOo zrTQ;?oA8z4HPl}KH>2Uu&hBsQ@fuRN;NHT z$pa(hrkQ!Mf{BWD#*USYUhst8avdyMpwZTWt4J1OeZt$H2Q%kO5; zSfWvBefN|X0AOZ0XyxV-!@81&jU{LlPX$=4W1Av#(aZlES9b?t#5%V=;PAduL93jN z{89oHFUFcRwy$)`O_DgW?^u*jNZll{R$%<$4c3N5!d=nScDu{z0HwZr1)+p}R>Tpk zdo_UW%$g?geRN+V+ACFzG%-yP&teV@`qOt@KCE468QLg)z*z?ePWkQW8b4JFH9U9EdI~`nmF6)u;6M6#;k$YpKYD;SDpqOQNKL<9MQgdq{|T| zIc*r-y3Fkg9a>Z{TCPVs&n<^YNN2118$fuC#H}=4gOoGuJ@8iLXb7q5G4v37a@8jG z^x{)^>hhiUgZyfU-vJUi`ofY{Y0OpxUH&j2x<&ML7Py zaZ_}8aaoTm^q1+hMyyc|cS8#+sjDmpxTiZv=yd>bY45UK5N`S;rf0tn48jR_7R^>h z^c)Y{$dZO&S}vV>F<^l~`|PeO290EIWYaDUo%7=$YuY>*R|bzU8O#_fvnEp&2hYcF zIbgC?FUQyr{*D%Jzw9&Ulxn@UUrC|(`-0QYbfx8Z=NQF=10z-;3zv)iv%j~Y;kRjQ zCLm*Z=;s#%F@gp*(Tys$qs;#45)D&+1%x>|(+ntPARd3OP&7!p8i1 zoa}g0x?N~%Ru)zP?ZL# z)syD&_(QD8w{11T9X4@%yv-p?$6l9{m(%>3GFX=8K<~=QEseiK7s=9J9)@1Q&Di6< z>OJ7!Pl6VrUwDOD@FV_ndRD_2(i3ey4$bcjW;S3<$||2|EZL;}#^ZD?Tn?WqRo!^z z29Xq&mgxfLajBaZ92jh+LHPt+0$YU@wDa$QGnVG%FTX@+iSovXxqky=s{(Y!b!(*L zybb9!Xi!;==z}f?)dmGjra5&z=@5lUWee`0#x&aptj&(aI0%g`k}6|GD7%%?cE+SE zCm!tZDMqQhsg3~4NF?YE1dq1Me60W{&W@gdeG?Je02lRuhz^@e^NJ*Vg4*+}IXAIhmPwMCTnXF$V8>9j&mmM`ei4G+Wa0)wW zf`l6LK~mT~Qw8_wG6y57`!a1hcVNb=-KfwZW~U!*53_})X(hY?_FJ>j<#YQ)e3ab0 zR?j&e@uz6#)*m15PVUq)TdY(cuz6cSx?> zwUj|9Ck8gqnTIb#l^t*`H!?3#E+A>5f}vI66*(4}pN>h1D!uQ{R}dGQc?WOy@_JAT zQ>nFcUkXENajDOdEWxN*Pn~MaPoohxJniuAW$dT=){7=nq*GMUn23hy7|0&q=XY6_ zLthMt67o1Kn_iC|GFhwuWwwzif1jM3nBbmQ+ak_$9Ulj!@hVq(1WT&-7DGKxn zP&GY)Bb%e*%JNa0OgG0SEM~@nJ1HeoI>jSLo--EZ14ojbPh7sl48r$$l@sm+K1n}< z(%{{LCbkSRVq#)I-@6BYRSPc3eWLi27}aoTIoc*gm!|Lao*_#~Orw0#Sof7*cf>E| ztzwB<$t%(rL+zwKa~Whz!q~_X53Q3FFPBeCR&QG#Ac;xyImOI!)C3@1u3vmecJRPB z?YksabR{)!I<+pY`u(rCdf~F`ILCaNz?;1*8XQ@_+|h<0-Xpo%pnyXG@Tc{_|Fb!X zCNECaq#j(;Zyk$2r3w`!3}M#sn1W*>wC6Q)#BleeLu#vnbc=+9Ln;xFemwcCBHCV_ z>KaC18?f$15@5;2&K$J>13C(2J)SO^6MM#|{!>#-HgoBdynvfxO-ey*1>7*HcvTZH z8s-^Gb_EXff#2#}Kg5*qTtChCG_wS!rz-j2c=SOR?Czi`$4G0OFC1_S3}h6t+3uR; z4GQIVEv=to9n$=w)uyA`$S(7)HyKBL7rx>gSZxu5flaW%V45%!S%3sAm-?X1S0xi% zXWgw6f(9r#Q@#OFCqxxFnz((RbZ>mhkXm6-GhKlgRiTLr4leYx-18OR-%%;CO28fg z8MXm>gQ2bg3x!xp%e=Xbu^dLwSpUh_FUpbjQUk})Z5`PmizeA=3>QBZ zEodC<^rbVWMP$tdO-M&zcxcJ{-Xj~qaNM%%f&tm0^gd+L2BpoMSnEks)}F=J7V9Cy z!hW&NWmvkKp|zffQ&Ql}`$5p{h>X2&LZT!<4@sPQ0g*Varaw+Mlin|E(d5+DeUN78 z+?pkoV8OP%-GD!3{0p5HeeVsN>iDQ7$akGhtGv>-Z<;zeTsx9Sasst#jley{;xt+o z*zj|+IT`k^kP{pgI)Zs35FT~_wE{psr6v^`3(* zS8_k8A)-&Fg5Rvc$uLp;Jv@nlMd;oFBq@coeApvjfa(Og^wJ2Y;==LuE~)h`^zq?w zqj1)B<{TmPztIv4bri}MXy3V6O@_=q9VG7fGkxBP^%y;f9O7pnOWE(%)m?e&YY$|( zyVH3qX;_id{lhvrq9!hA*$-zlSE?49fRuma^D+y?nPmd5CDb4OALHX9CnbdA3fvlFJ0C8##a#Y&%GDLx#alD9|LFb6}?}bOx zB8ssJ~<758k&J4*7F;_`anC!vH^+T zS}P)yJ-wzsi^gW-5&@O6kk!_YMT$3=F@8#SvP)Cl6m#g# zhJ!`x!*j6}1UNuAQ2nl4c^4P|+%2D?;o-^|HLCXPKZeP{v?ZQX#GOoQQl^IEOfZ0hQ}eq;3X|NaR9MVoj4c0*cG;x!X%zBADCCEjjW&m|~$HGZ9_i5>wF5 z{iD#S5LUZzK%S!+^$H+D5zf8Ka8p7nuA08A4i2SXD-pMo!fJ(`Vt&NJl@oNid%r z>zgzgm{)Wb>O`dqK^8TtYDg@mhQ7o%+iK_fT?!7OuY5Ybv>D&htXZ|!eKmu{bD-Z1 z$_iCS^NW-lNtccJ(F`IXr-z3@!=EsT8AfO0zj5pGl$Q$Uo=A{T#uS)E7rf%DpaWVX0VWygwD!04rTTzZRV&;B%KPS8rkOu*D|#Hn`FNyVk@8KmKn zhc!$)R5Ww6*#B7h(V2{9>{DU%=e?MI$za)taxRr(a571&CB5pCL+(d&gE&^inw(@1fjBt*^NVQBP`jLb4R*Iz>&EYE z7vC@cdYb;If_3+Y4ks_nKb0B<*Mvq9)WAg{q119W$pxr>O`dzjx``4CUhON41=VF@ zS>RmwQ{RGa-*Ch{x1~CLiIlKtFCoBLvLA(~9Nr#c`Rc@D9e z5}uwcoGF=lWYkfSB=NJgiQPy190XOxoXI)Jp0A_(6Uq4Gqo*vJ!^(K!3qH!IT0FUP zAu(fqYvDYW<{+K^|Cnz*8SuMT&&l2Pk_y&Oxp8zAjP&qDc{T4LY@YDWR<=m`3Pi8Aj9l$P^ zHiy;eUj?HOLAsiDp5{ zje1HRD-N`@jhfd9VHhc+ivWCh z-LTwd*2gD*pHFJwFLGr3LPjLWK@9E#SIVHEHV4YzWKX=(Gr1@M<}c-T4x{4dlGcg; zA9-&X6xX+QagsoSLvRZaJh;0BcXxMpcL>4V-QC@3B)Ge~H}2Z#^#8s0zIUdkYHGgC zhdCd*>vVOs)Y*HVz1Oq$Z}os2=>^7wX8tbM3B5er=SVZ)rG7lbRmij_(es^_JBeqC zFUqJ?(_D@N<(8?qyi(knnySX^;mXr%L~=}~ec2>ajFHMRK--O-eji@Q1jvmb(E}I1 zf4Aicq`+TGKUC7HPHGEolC!194?{ue8$=guNErc;2ai1r|0#;p56TS-dq)r7u)s9A zh%c~6E3X^jvx-2!lC?O~0SQ9e>M&w(2xgX^<03Aq)F<$=NKewUqVS@$d71KK)Kt;` zPeqGB26yuAYF8VrcO#t2TW`P2a+pit&5Q4v2uOejfPGd=U5jf{34Ec*G5>| z!4_4ds?glD#=lBaYO>^VLF>uWa25la9SxTFH(PXu^>RxGk8nkZ1qk;@;DJ?ngXuEg z-bGMU@zwHIUD;k)dd^}q9f^vD+)+WYyomQ}v^##;Y457Z#(&m93IDS>0j%azhFBg* zYtI}qRGiq3Bw2npGaXl+8}T|%-Z)uGT*=crwjfqsq@3DGrob);lmncu(|M1#Ivg17 zQzcXn{z%zSe@XFLi8OE?&9g;iu5fi1MQrjwbxIDtg4fpIdV{0x`lN`g&bP2iry)nq=>peZ zRMwh!bX0P@E-3F(+X10P$~gl1#v?3EJ&Tq0W>iFEiyxJGku?WSayoaZ3*nj>q4K2) zHvBHOrDh_C_Q1gDQ3d(JLSR$%pPXU5_D`wuh*4hJstLL>3*r!Tr;4Xl+0$QQ1g5|3 z5)2*VRCH~I&0x1wGJ3x6CTi$dDCSFDrgkzIkuUZ13N22SMG(2^fzzavbGV%iMt?QW zj2c?HKlD}>cz)`JV9xN(TgHKzil04gBFB;?X5K@`$u|oQuo~}Nj~0=6G~P@zq@Iu zxcx^690wQD)=7x>wj)yY@GBTCtpSaKCUOZ z?F`td&OU8=g9WZjV-IA8$bk~+g~B== zy2bGHuOe_4s~dgP`Xl$epW=P{LiTdA-Q)$538${gx4@RjxISwsG+Oh!%5Z89r}@X- zhn3Ih61M3z;S@jUtY~~pt;WvdNlrT%*`|hcSUZ{@WW2v3byQ;W$oslH1pQ2~u}Q^V zQ-tMv)k#Q0qw5b{uR zkKS&iwD8xrEL~j%tkqgAU37T`Ed5Ka0snDzGcZ2#6Oq@G0V*dCfWYUD$lCgOHin+r zi(tdmgpms?a+aPL`oM?#(Pv-o{$*c_{$nqt`}NL_;Y=&%qq{4}V9k}VSxaTuQP+d) zkfP(p=rRRZ>l1^P($#YHxk2acqweuS(^PTuSd_5SdQr_+(S}^}T7p zF4FJq;38&NH}w5!)~*&m#(Vh6p(+yOz<{pN+W!r?0>N)~Dax_K`QW(5=Niy&Flnmg zN%?$0FM2uWs`qit9Fb;KulwS+@xGt(@xCg?XSC6Ruk~g4^XtvNVahpdK<3m#l39nI zx8qt4pT8=!q=nC2z%uj9A(L9&3&G}N&d2^<3`W+V)HuDb{kxw?j#%^@?c9ukoVgXexE9GC|sT68ZWYsTNfaR@YVft=wsK8pLQ$Q zy6a$MpPv5~{%nWe>q!7-#^rG-C$EO5z8m!f;Cz0AoUcUy+V;a;P6zc2MCfI-ldd(( zJcK^%0q8%D0CIk}THJ)sg_c1gt#=v1`(N&JG(H|?pqmY}YG#(d*573uW=~>2R|Z4Z zVRapT06$(s@R{JLSZ^cjd_djwn~y{R2UmUlvj;(!-ltZ2ou>F)KTn4vJ6^hM4#Jm% z%l9>bvr;wZYn$&R(-T_Fo1H$Vs?|Zd!`f@jPLGg9fR>T>?VhR#dehXRtTEp9^#iR- zAmpf?*A8fW_93LkXK7De7?ZDVFD}M6-|b@(5B-0EMSq_mLiAbpo5rTRA3cECA%qFE zGyJWAyf@cf0WlY=vesKGZy$?pTRtGMDP0Xs-?7;wOtsCWw;aAMJFL1Sqk+x{es_b@ zzK!8N_m;{RM&jFXCwh3)WydX&9BdZ+^=`R2c6)n@2S;5~?AQLDH$tu_vmA~eeZEd0 zb}5(eT9cs=K3jKb(Rm5k)Eg+wCMm-dn{N2^3`Bhv`M>yAeV#3~XV>X)CJ39v|R) zzS`8BQ`;iP$G`LVZOeGgBsVZ+-r4aW7S#k5X#xO6; z$c$Sp>FKJs*86M?A%BDccdDj7-sYEx)5sA1-Q<32!CXPm8y!ExAM)FA>%G?640XwQ z2d=xiT#PPkX{XnJh`aCjaM#cojA{RtQe%#)_Wt%}G}a7F;9Kjzg}UN;Jx+vFXZ9a0 zfbE8ayLGFDZ~A`t;gYu@_C2=}oxIcK^daPedb9oh;^ktk*=9`WG0AtO+2+C0P$3L9!}0hqZR zk2ZXqS~WOSzFhge<#u?_xmb_&J%4Zwzuc(k)Sv3z4CRb?mtqm;|4Raa*k1gEux*lv z)Z=M?x=8!T^TSI%ay)CPnpo-S(>(?M+{=}tRY^2OLr)U+Vf}i$jZ^@fp679!8J&*L z_3X%$cg-`|?KnKNt4a=O<5sh^&DhuV)#!;97clpr9_uu+XwI+yYIv>oFMHX6=2t*&~N5ZfFInwpn8^e0gw8ylZ|TXvG6WT6_QZnnN@E zR+Hz0s_0#Oapn6xKu_Csx7r6#U2Yndx4j)T?Re;A=6{~>nIC$2;FXt6^`fUfgrNjPU)N1&6O2_@2oxVHRh6IKK8u#BV*p^Hm+1{$z*6(h6 z6Iw4i`^_}bH%vp*^L(_(jJU^acK8i&pA8K|;|Dre($rl+H~x6PgR2v3aFbKR(s(}g z_1=P9!t`?v>#;?OMS1$xL*x75VJmcNl@=5MPv3%MOy1rI?WXGm%rK+p%MiVoB?G3w zV|`p7kAb*Sx*lc^q`K9;iTYI5BDz}}pCZPJvU)*Mavzsw*+p16QF?b?U9VMRT5eVg zWGzp#Qd94j5po}Y${KK9O155a)C|W7%^z&d=w>1!?uw+kY4~E?u~p8J2(vyW8|V+x zqyE5B9_CX`#rFQdQ zzIJy-+pN_+7Q7I2bxhwBS2<27tTj)syLE#GrWa1NF4`{r&$%CYwM+O?r9K|#?*xy{ zD+n{Qog5!2PfY*{3A7|^`eZySNVgAJB8h9wTSOt?=k4JYK=yQ#;yPxh4 z>62|&XIZaS`Bc$L0fmGD=``~TMp@((3-g1t^FnSIlp zSHZrvEwQij($NcX*8=(V#{dYA`)rKgTyMu22?|uLQ@&B*rpZ_aX^dF1Q ze-3N7|H)PQ_v!zA#a2-WDdu{)Y!w5f-U7!zdAXf0*FCzkP(RtWyDe2i8o_&1{*ohD zZ8{WZh^S)M?gh9#LeGA&cG*81Ldwm&6RMF?LL>)Z<8P%*Mi~6oGczZ+3M!@Me(^CAlB!EIf3Wk`GL_!uoLGE@Bkn5 zT$QVu4S#%ex37^`i!tl}z5(!>a^3tbPWMQnVLhWJA8wX4gmk{q`HxwDFQF&MwcXl3 z`(h(1dqX(3p@+n)+{e1;n`2XVi3edv*vQ-`vk(7HfaE=3cWL|1_?LPDUI{XLXp)FJ z1(+P=)ykL;o?DygD9HU-TO4ny@1)7Wt5ktw!R>k=fUoH^Nl*H$&U;$cmr=jToTfR` zZZQxr*D2h&T)dnJ`&Hj_IsdZT0LT?Rr)eLtAfGhPdrd9vQZ%8>`ChEIOV8GA&oYLBhvfHBuS4P^WBFgr~@mA@i~w0D2jrw(^lG66q<}z zrlgs+v#ux{TWT#F8ZZp9UhMGwJ9g4RRmH_2pHBy$kFScY$EAx$WvB_PJ$%RYqO9Ap+vzA%tx3k8qy2r=(9g=WzGzF7 z|5U8ENW9Y;#zgo@60eZ>2XPuqgR9y%JpnoMgq1ztfl{{t#yn{xiM*p3ZsN4ytakdE z=JfckUkPLNj5YNB6&oc($WCN)@$MI~eWy{_lh_A{wnY2r3v(N*H&}7tjYxeExsl53 zp0XiT%pi{~;cs(V_YQWI*D68A%Xs1vcS=foUuA0-;ArL!A7lqzz{ag$_97vpO;QWC z24B5|uz*&xeQ9J@FGc-$3su3ianUSvNLysKEYq$muOpkO!3pEh^~PPIg{)^fc75W@ zlf0*!-b0HIW6}bK2~W{BqVZgCtftSqM7IWS@5E%iLk|0(B2tW5=u2r)KS(I~H@mqa zKAFfEVNkZ6MC#;3)hn!f#5c;Ql1UuK?XM7EZn?G+iEUJSm6}_ zp;|dEzPw$3Zl>Yk{S5%pPdo;tgB-I(rCeSf?G*w64+LDU&88alu}Cral%j3+EwYnl zrvPHOV~@nYpDri?4_7FBGWic2Q%UqyT#SWDtPAEET#|<{qq&qi}(H+)pD*is)gnXO)#Tr_Q-E)MH+2kakvVPe)sUJ1Q0ATQm9HUq&H4;d- zP$uxanGVr`O%4O|w=~wADzSfP4o}KC5w&^GU0&AscoN~^bN9kdT)cG-QS{yVn;2-` z2bCLWuG?8N@pyE&(Z|nphD7I7A*PJdXYy`pd4HFj)}4SOTy1<@UTK)jzdF|;IOr#9 z!y{7)k3M+(rcAOo!{z*O!Ta{p@wYQmD5bgRW+vs(Je_gz&`b@5ji>w!{L)cFwPplPb^Q+FLeB}6=Z4z&T0>5A;X$9<{UVV~wwly_mc14v2$*R^&J+Z} zV#U82J)BXw-tUzT0W&ZKV&k6MQ&P^;hx>a!W3{LPr~@g(n770~zx_#yP#CAi>Pe+z zIqE)|m3WC0>LA#4VxWY%v?fNl|5C5YT+oy!@lt0va8(y?gnv$KQK?dYYc>@9m;%>& z`0MhzVF9J0OLb(z)24%*&o{UtgWut(Oi<;%v! zzu``z$f)zOVp07$e3!<0w|GxV$Df9`xh~v%)@{)!(56bge56V-q=kEjQf+o{%9sl+ zhTP}?>}i!ERZRViXjGIWL0PusY*6M-+-Cv}vcYuZC|igXQ3D&+nMzG)z#PwIT!DcW zwTPI+Jo)0KT*Sp`GQ1Y?wK<^YDmHbDz*~aZ7{2MF@4Q}puZ6nMgf?z>F=WD!yN4bd zIvc%<42-jdS&zE@vpZ$P7(k`sn0OlM3Id);e18Rz2%e)RAsiluE1T?RIBAiib^DzT z(p%_Aq_PUxp`lSSX&EzOlvRR2&5}t^5ti(2HTgVy2{g1ete}k}LY_)%sb4Q6!*F&E z=comF;U;ZoGfXj)1}~Kd-_Bzj^s`gLp_o^)hx#o%TJonxBujAGYpfJZqy%{bLU2D| zvsC^@TVu)sqq0Ur0lv)`Y_3HJ4=1B1MlVE&C^^y=AgOw^PS&|Q0d#1u$Nni~0iq4_ znV%zyDv6B!CXq>-*rP~f`fSGJoGwrS>(U{4T-)hpkEE1=FQ(u!0IB<^?`H~pZ7ptt zmXy}yz37-gN#N$`L+_zAZk)s#D?DbA#g$9lcjrSv{PNaJ;<4LX7Tyw}gOG`UBO9rg zsmSDT=>V7@kDIumE?)=AkNu8FKAy0}51ZMM(E5>NVB(^PLW!`KT{wY>n!($r2^+nm zs5pAe@AmPVUhF}G7uSOb{w}Pr7Q`L&gA27&i4lQ|;#>;oKlqMV^BdoQP z>h#G2IgFV`L90f4JTMTkpvxdOqR!ee8-CLmwa!?V1j8xgi@CHdxm5|h;yr9kKwWDB z)lz91DZ}@sWSG5RQ}Ugrk)B zbTqC!y=dFH*)_a3p5t{ya_YLV2>!1@lTg`ugtcF4#&h7rZp(=RRmSAVkN|;4eI#yv zX63R5(cbA`RpSN;t_Y=Kl!WhXQL(6Zn$dMG!MV=|R^U07v@PQZRg-FgN~YW(iT`gS z1_~~IB~_}iCb;OqUf-_!^{-v`*3HJj14%`Ra2me)!wQ}iX2M`N8Q+$^pDWN?M1y^1 zfx2O%^)lD^nbyf%*cG9y^?Jx6PYI!TFrBq-tj5iQZt~|!D>9i^;DFRd3G=&4ha>vov?#M#oY*sSp?DW zRP+-b)GGaTvc$y9R3W#6I@YuGv8fnD1os3u-V&n$Yc7Z=33zW`HY9wGx$dofIl%P!7 zp`t`909{Vk6AQ^xnTSNyVhdz(u$$~37F(j8o`caa76ICm=YP{vL-(G`ZpIgK$p$(h zyGB}f8fDX?WU?b`E!{Mt5myN`^ezM0&GVBdKxyc>5-NQpeFv9bEQs)bJ*rV1Z#iYb z6Hw-5!Rp_|>ZtyF{R60slR&30&Cw1~XoZpyBMZ2N&+*s4w=Ns{6EtigZ1Y~zjEST2 zIFkz;O#)&IdIhKP43!sfXC8;YdUm3HO0X>TAQpd17={-g7B4R;nXs2(^mv+2>nlR$ z3YZZ_BuIzppKX_%N3UjyYLE0D4c>`!cV@trOmB}n85=C|fz7u&(RTQ3`b(;+Stwb4 z!&ulco_N4L@E7%0-Xe+uRvEh=BAR32=&Zb)%T_seWb*~Q?p#3lLUiED%5FczTPZfr zerOVPS(^NU1Uz*$73#^1qpgZ#vl|1hv@z=uvzh2KmPzqSJ&?6D>4|8pkUy_#TngrX z_$fBnYjd<5gIWcBNADMAZ84q{iJVo6>IAuY*N45-WTbFk4Vc_`K_mg|Uvf}bUXm$# z>{fJtXRRRJh@Q>O!iXh;EgQ? z4iWAHWn3aD<)6Qds7;1#JlfRNs)UPWF!R=h_jl+uhzL{`@7vqjk?B;cVCLzHP_jOQ z3Aw@zsMU@s_?Y)l@)kZISuh4kS~!wfR3o_9iK)uWxinK!!+(*omkIY|v)NidY?7H< z_hO*%i%M0FYD{i)d@fE<&ki;fyV-HsF4r4Y!ilKt=_p}r_AECt;@1EPG>xW9To@r< z|4NsmFt1=)wLp0@7MzhTUB4d&=QE8(B6t=U(uFLMIgH9oKFg(iuEUt2rgx*G)8zA1 z;Nt5sb}>G`5)&DM`r!5TZi92*o^<_s|E}qtR9@aMHf0o<7o_HF66=6bjfX;&qpJrB z9v(dQ1PhS@TywL^4#wI{e^LALiq8U}*Sn9yXc=be-&5coj>7C2+c~n#7Hf_0F#LLR zNbwtzlE?zC%_;c@XetHpDyyZ~Y~ox?CP1RAtx$Qck=)Mf%!MICLrNq5zu66UhgwwA z(*{V((F%mT7YmC~toEmcEq+?-o_MyA{=7Y^^&bmbci$CeF{O8@5WEFXH{ih8x}Vw_ z+fA&&h%lrXO^k_Am0<@`!Bqmep|;D`4`Qj4)x`+7JhBjn{V zl{A0EQ0>Ysmf$Yu@HjJPCL8sgEw{(p{Pi_Rqv1~&=q)U{ZgBmCB>8I9#>n5iUW37u z93_vDtei+7s#L+KACn0WWdgjjE9W1weG0PeO5XBe=z(MD0TpLIneoC@%ov6uPs*gd zO@iDYsyGZw653y3M@b=+^Bnb9DdAXs`PEUXaPi_4tDS44Il|=NEUdKg6XlAoO(HtMB z(*|vl3oe*19}1(_@I}9{_o0ihq|`t)!^bh2utwjOu?I$^$s6jjoX+WAv&`^HDXzC^j98Ug%O+Jz`?BMazF1yD|Ew{WNI6?j%8uEoT5~Bbld}_rx!bf zDqgt>%X?_J_$uw^O>--_7+7W(s_JPg>G%|dmyJ6}Q2Nr<1Omuyxw^#hV2w#IW;!k_ z_h0~?8s*9wkocR1y-Ep7cw7nKj5Sf#=|OeMpTFPqbNB)X~96A~nRArI#yU49m z4KvXmeP%YsiW~lDV_?hrj@porPm~-s7M&QH=Qt6U;U2j8Um;_SVYtlWsd=-QN``$c zx06}bchRZ$h-j>8&#*GeXLF4lLr|KJJ+}aQ3gwl0l%2}2RXu&EwyPw7M|xC--zomD z07+uOAyoKd76Hu&Epk%Hq)b?cEi#R;==dh)j~%GEzs6LLtr8jqAr6#GaO!k$N`jn& zRmu}A-?6AuLLwcngEvBkrU(h>3$YA$ICGZRQm?c*j7smvFj9?~259IWI$KPKB42WQ zWjN_3X=8{nB@*FaG4qt#1l=4;Uq2ci`Tp8yALd=g(R%E7or|nvo7;TyVXU(ex|ml< zb}(irL-3^fBoq9%LmSnG5VnZq&pFz#>=&wp&(=<#)>$Av?%$PrQmcv+%8-bRCg+3&n|K`|! zgeZ=>H@6G9})_TPRsjc=lyMmnE@zElEpVrcv2CRG~BEDC7 z)B96+gjQIm^LDe^@7FP~^Y`Qr+-o4;7$+K>#2dg}5*5aW9sTk0E~@o*DfR>8VKC1) zOBkggPu{83(A1F55Ga`Lg|P-X%v_d91zdR!lj12@z{AJDQrFP^1EH6d4Hk`RZFN2JC?ElwX4k!V&vOUzgjXO95~ z3fQ4WLDtp6r8w6q%2-^({V*L| zwPU6V?QnMUmFZ^kl`=6>nT#*19!Aykwa#?v9F&v7k8{jYC2!6sM=(%-wPImclz(Q1 z4_@CLd!O%rPYW*|nU-YHrHYH3XNQ32Bno%7MN}xs;1L$fXiRU7HMYTz%^adsdc-52 z|Cv!+x3U|2yH?uT(;#hA9C_1LI@T5`>P_IpzhNvRCxO>keqcrI}nxte1u@E4S5OI4dl!VjY)0rTRB>MshvWt< z`{698*lCUrGJW||FOLXEq=uYYdE!WZJa|f!Bw&IivwY$ukrXe?NrW6#F4OL$<@1X& zV;B>0!K@u>roLk^-zM{XtW2OmMI(|-sCR|#E&Tj}nuBr$C>gblwsbWdNID}y6x7S! zLNsb6i2u0#ir&HTyKim64RLRBxOoMs&&pgAF}!FwzU{$Vn=?h1wu&2ulZ+HkWToCw zQ*&}?GL{k>Uj}N{WlxSSp{L%qq@sw%bv|G;{oZ(vQ`e~4wXX5nq(acPn4P5^CW>Wk zWdUX_i~nLVgt|!1{o+Delu9Qm>7EFngKH1o;2HV zVqr+Zp_05XCud1AeXFsJ0!6%d`FReyaJq=SwA;)pA#s(&1}rsL-w%qbhm94f!6mQG zjV|k|!jt;ws=MsE9;7{nBh88AqJ4v~6Opxe!N?Qm5@MK)A`>QJ#tquT5jJ;e6lNz@ z!kdyC63sFaItv}(___adI2Xo2-7@)tD9N+HS3}smB8!2Vj1r(Ka|4q8EXObNuD_S} z2jiiBB8fDpg%Os5r+#L|SR&63HE1kRx!Y0cn);@ap(XE`eeoestt(1+|H5j)t&6e= z6CUlcZHlWkOu&Vc^$=|npFOWC3U{EtO=(Yp++D{#EjxB_SA5vzYu-H>8-A2}4gIHW5yA70S4Bg4)zr(;}tMD1l>Z(ww_Q4Avy4rV>uTf)|V& z!VFQ)5}r!t5@keM?Gzq;UK9lldZJ{HNx=+M7*^`_6$y=NvKsKrKhl%wXr+0HWV}t; zU!0@8ylM7TlWE(&=vwtpW44MVMde-XnyuOwUeoX?QJsfjT)}i;cXAwh(YDdGxMEcw znl{;n+)VQAU?A==Yoww5Jn8B3m$;10p2lB0wY9ZVN=eKQ8q9RVCxcKFC5T_$p2F_-|(h3hEs$46{d`o=UAOWjN(}R!k zaBO!X4RK)t4BcCCdKS43ROMXYmp2mv{XvB$?Ny*hO+L<`GSJaLMHJXn<>d-1&hk9l ziHf~awAYM^9}&+ST$KDt+1^(%11Q%@DRo(tuvtBCf)16a1bxSI7?5(e`{f>7+reda zYqG!m$ZnQ|K>sPQ)6h+V80ou~% zat%hzD&I}wQU%6?`k=d^EMjV@U)WnXXp$MD@*%U2v2X?=&|?i~0xIiyqFS200J!gzn+glplOiN1q$lmYmBIgIk(AUBrISP#4MlpH>L?#vjo047!S&$#puhm zmu{G~I4P00$A>-b2JuU-6bq%rNFmM4QqeEIw+JC(+@tIeypFU8(|i_vTKC z=2Mj79}cVQt9bC=dfR|VIo66bsG=Bl#!=1B6>__mgUpvW^$-8tPyBo`wq8W}nHZZdXJt>PLF;uLNt~@dK9zD-T{{Ji2rO@01m(Jn33oRm zP?M;zq#=XO7R+K{z8GcRW#+Ir>&9VKE9bdWMZQ5+cLmSL(0S6x&?hPYK^4Y-Sx@m} z65RzCN-}is)S<0xwM4c4^u+g_GVx6j)!P|Azmi@qyOT7P6<*VPH%dGls9c=#47xkE^a3Mhanv12H>UYk*e7Lg{aHV7ci zER`@j4CiDYlp*y{A-KKQ`v~%;9zT~bSCHUC+-I?$ESl@~htChe-ulm@#Ez|kdn9Ca zYL%Giq1Krv%c^C~TT)ATv^Vc%16C)$t>{qd;Sa0hajQ1ho!uJAdX4@H*OTrGM$mp! zjZofUjV35ew^sr^7_+{3E~_7=3v+{H*KZR611))!c`LBT zXHCwk)Eh-#g!iZNpF3ie=h;CNRKVQ}{AOEu(~0*I)&zb{tZoZk+@loVyPUh?2(RW68g26|k5 zG+KFMKsX0ndDAy(C343e#O~NH%iflvvIrlp7Vel~)h4Qh0dChX{FK$rc!IO060!U1 zC26!L(t?#43CN!foE0X*Yj#TtU>0au!ot09+NH9*oAY%W#9Q`}t^2X4Kf-PG5nCK6 zyaH7w9$?+9o681WqaVU$I>1W>&@Mlc=AwTzKb zx46=S9mQ|p+kvvAK|U>P+m(tVojKv71+<<&&59Cf0YVp>N%kJi1JA=Rd|KyWr;uWq z5>_A|^eYpki@rHUwlRDWk13bij&=5RHSw>#u4%MQB?M`0P zW5)4*tB1E}BV|Utle^>+S3`2Irm^Zk%CV7FA6K|nh?Ed;9>+gg#ba4-0C%|y6dd~h z>2eWML{!cR3CgCfG}_-Jm*nW5t>lXL?$>qPft>|?U{zx(kK64c_azzZt!=s6^Lqi6 z@c)L;hd;m=ntlT7DGPwt_&=TGgxuU`!)eLYlXqK7=U`t>t6k|nT@3Qe(}>JoON@J9=P_bO{41 zR_)m4KAb}CeESsxsukjD6M}pNHkIz;E6i_yXf%zF`KFq@7gUWPM1Z%|g0}D%Bj?Gf zR7!gg_$R->roguOd|@n6a(4;0^BpYwIt34LiK8En|ND5C?)U%6hLy{V{0r{RN89D! z1|;xPEE3e;|2_Nb5Aj+5f6ummL3{$^oBn;+|M(5@zpiEoj&Hvp{%dRc4)f!`d880X zP~RZ_>ji`U4D;W#)!&ex{vW^YidU4(&7-x&jU~M%)bBtE-YG?`-0v*baMa=EDb3uL z-DEw01+Khfmt)hZw@FddODZjjc3ea);^;y?GK+JOnPrIWv;yvwcg5+|T2NDmsx9zw zeENE`KrH3~fwmTK{@R)3YGm>F(}e8=o7bZQTI!n`YfC%Byw{mDP0S|VXhq5tVh#`a zJn*Sa*$dx%I{#w6I2vEC)rkOtda%XO0D#6_{`fSq(|}~>T(mQ|T%zZih4E5<_%t%p zP;DOISF?{9?Byxzsdm|Hb5=JL3ywuO7CfZ_9huu*UL9bPtP!|9Z>9+`I$ZRJHC(1q zw6QO5a$~sKmO^_i1CH!)-I4DIkA8U!xa1!Ol91W_T8>z$H{P^z`SJh-^ZSy~xG>(d zG4W3$Fzphu(9XvNO2&p4HylEDP}Fm1szv$&l8514dVh+l|TW;+?aqoP-t zm~$p~HCXiasD z>Rm$Re0gwxsAPhMgmz*Q*1l5mx3;Xc`H&C*$q@pO@+z= zc-*>DzN*GO3V!(Wnmjg`Z09;)e|p4}3^)w`bdE7#O`5Ev^&0t|cY63JEJAG>GAfcu zuhlU5VGS;Y-k#K^IUVuD2YUqhcO$hn-4r!8e6l|6DhsG4b=nI`Pj~E=Dqz5nAXb0) z#y?F85~g)6v0=tOed$XLUHVcAo=iyzPZC`Dn~JnM{?7MvZOu&FQj4S>>)AHZA;<>^ zrv>I*;Y*B{Ge*+6s1!iOnZbZDZa^FyG;!L9KmzWk$Ip-9?~oAokH7J^zfysc#-bG% z=V}j^!*&`r+ez^mVXuW*Th9AyNfuK*g1TL-eIw|NgUH?t&#a9kD`L0F$^F8YU|#zW$la->;c!$ytO)(l~5K3k( zPnVdfL4l9btZDzWK4zz~s9wu^4Rt$-sk#I+EZi1yO}ISI^R_VsI~nhxkVzd=Ejud~ zD{f2reMveXF5k>rKn3ebYbNCl;(!gg+@j)M$4py;p{NqARQ2kGW%wN9`bCmqQQo1F zQ*Vpmf&&P?%p1pT0KVBdY^q((0t)mP$tKZKv5)E$-N5R9Pe91ECu99;UO*0iSl*`6 zNg>)<792QaIO-+ZirMn8u1&RMdRov0H4nt&*;<=W?rW5dbeFod9$G6TmiE zbJ-xqs97ML2^)}C>y(iOc}Otds8^NI z;X!>%+_(?8&5w15 zDZ8?(t)LHx`Px0R1MnChf2E#tRRmDw7tbY4NQ5LZR%`e*<0&=2Hga{)RaPpK{opXx z?g^K#a%$4(YvY<5)giF)-Y=`CQdin&;5i@6g^RIrwZ(2}o~W!Jv2J@tmpC=3ctaPY zY0SciXjE8Q#IKux%;DTd7VdESi)4>~u<+Z4Mtf1CB;arX4%MOUd-jZeRZ`w=xRo%Y_4L(lb0fTG|~Mth^Yi1v}W+Dm^I_lXX8FHoHY! zo?9yY%km+Qe^Bq_g?PQ7herksRL@+Q>Mn)M5>*xbI&u z3#IUoZJQa*vgKo~_V}36NMe_i1h9~?P!HWK)O9JM1DgA>DFT=+zkdqu z+bb9lpDb^-UjCmWCawX27 zQspBxm#jjnnI^rk0)Ufbr=rT5BBjdO$fmx6Qh7w9!>i}~ndQ-I^mF$UiSn)ghTC(y zx*&X@3ot%}{JLZ1q5+VoM$fiYd|)SRwpV=netL_Z0-NQud=9rTtK7|zZT-`A`j=Yz z&t~ZX1}eIALr$lmH&M>bx z;Hn|JvF7-KJI=bl;}_bH5p7)Cx<>CgIYyT9E=S`q1wYWGgnV1J__= z)}%UsIhQ0*DXCahQ^pao5k;xZrtie?bu3UUM=G$-R?B}Oxj~!%g2#vs1r~7bc#>X- zQg)8rUqgn^hPh=nXg4nU*}&{p!=z!QzVf_wAuL*TT~>$NO*jCW90SIk{x?J`l5Nxk z+UjxI@f<5XCxiN%pgR=3qmYS)COc0;G;y%CQ(PqhHOo8OHx$%0%Ra*QRUQRug)hL}Gk4UZJ1a2Gw8yn5*5vvq z)XW4gr*c;YM)p)I=CAbNr-fzvpWm9yODsRJDq{1V-lxGmI|(&k2@X0N$gk+aELf?0 z1=q%&LL6r;B%=BaS9bMJXBzU(-8Cv*K*DsGvW}XE3q_W^GM=KWJiFA5G&m@Y3+Idx z`1$CL$Yu#0whbH4pB9Ggf1o!oJOvnf+Oo-DAJ%{=C&!^Z&h3kkEJE>6`3}(2wB%Gb z{$&w(pyIC$1JW@FV)-j0{)kvIOsZ3j60J3>-tXR2=jyUmX_T6(BPD$^tWho&WmNnL zzVgg`{|9q#72O82t=Wdm7&FJr%p5Z_+cLx`lgvy>Ofj>}%*--F%*@Qp%#hf=`u9Hj z^yx8r+}G|`JxaAyRcpw41P(7`#hn{90CA_}{EL`tUK!RUY-gHoXvp#q9W$}@| zQLHGJmB#hZl8P4DEs$xKt2|Azr^RWd1;QyS>yq;kWnpOUMUP(=BR|XnwiH}dU7jve z^(G<(_?vlJ-Lpqbioy^j6Y6MKAM)_orDVxps1N$V3Y|R@nm(_r_w9Q1{GNuDd5K$0`Pk(f#6#?czADmrkLl`LN zG2Lp8ILdtwQ9D8%q?LE5F>4G;TuU+MDVaKkjkE|a!9lp`gODp1rwQ>X)6XLIVmnKc zloWh5)mu;D54{ZOb#^Zjom8!vk?EK+{YEyfzv_WCVAg#Y@hrJj^0?!5s@0eDo6#%JdGK^Qs!5yY8DiY1^br! zUF9(-Q_4oX!=tNN{|2@ju4hZ9(2^D6!tja1x62f#@QYmhAF){MKY9!OOvB#GX(>Lw1|K;5J1!imwB%CDdE{c?izAXf4?`=qo`;8u*9A{jnRh7RLWM zJAAx=iTPjvSCTX5!@ub;+NX8x>WS)cCOnoa+%vep#o;k!SVmis?`-a9{&hs%nIJ#f>us;&SuDtov!qiQ5kXl#5*i`>bq7Z+! ziW=j#M2e3TrZ}_DzTP9nnQf|Seb!@eK->|3cKzw7An)69^+U2FPYknmuDwy~INNlSJBYyUk zzi^=f#dRAbqwt-sTheQ15orul*HX=8$J$-2uPju6W#zt$O9&OTmwrJp7OYBiEp=B3c@L4>H z7+1E@S5k?>-ze0V`<#%cpZ=SOPty%-K6UQ|6^glS)i|=Xuf%LSu293zeXvB;_$zX$ zHTcevU^diVEt8zV4L8hm90kxifbMx3ecUr(13jap7s*+asz9|oN(5_XVRD}zD7mwa z632qD2u|yZ3co8oowb%i8+x=3Yy|WiVM^_gq_#=Trh^yO_~ z)nmk|>o6Khk~h!n{LFqIM8Kkg5bD_7xVR49jY>!%O)ztZlOGPkH)kXo+l91{uOm`J z{KTEbx1SKBwYhl02Q(`-YxI<6Ux=c6KN&G5@VsiwesPhdy$psi+AkZkWeQw|T(_i! zzEKtKZjJH$DY^0(J1CY)tTe(~oxi`|8*#vfZ!R5|-0oaPNH2e5o7iHPlU=!y2BCZ< zuQxxH4aFEhxQQjsxX?Ac%D|5%&FEtn%F!}iavb_WF?{1=AUVV&CW?J!V`zydJMYWT z10jvwO)(jXYn<-bXuOLuS_-N+pFQd;yZ*62*f1dOQQhrrh!g&qCGSQu3K#K+bpGBo zPcJ#25^y30mmt7u$VGy#Ibs77X|>$eK{xrzoIvLRhW7@Fk6%^CpUxoVvV#=CU@>5Y zjTF^)&%ZFhmixSpp+|@;<(T_bdUf3VA^tAC+TS++*?@C~kyKry-$Eo^gjxLYld`aS zQJs6}?mbWb{YyIfS(A|bO)VMoyhgI2M6TbNpH}2DYC_iY>M4F|JhC%aqT`>0bNY#@ zJ>F>1GpS1N9>1T#dL5t`rS)yNa-dD%HejdQ^|-8H69VW`8Blj;{X2b?vw5Iso zG0%oluDE-#Z4p4Iz)cD?IK^^55gn5#w7|duh}A^__zJs=qj=Z#jgir1eS?a6M|_`FEP^QY7x@}0 zO=f_a4Fp-d^vQu*o18=JF96_bw_twquqr&vg)H*v^=q@3A&csk53Po;?N!2s)R}t4 zpXceoWMny7%~~(IZ%+tH@6RTsT`Aty#x$2FTJuK}+?W+8OX~DO{OyGdmcVzeYepy> zpTwv+-Q`be5Zvc4lx_}!bqf^I$DPva12R|80K}DGlRl*D z-)G$$37u8#YR`o3ISdMCq8PU3XBfe<{HGUyyNWjjyr00+jARh$-tqYKieuB(L<>>O zA>3AeKP7Vfm7Kr)kG-_gPQh3VOX?swcTM4B#sVZcH8k(@1PE56sg(VyII*QP@yaQ6 zvuNRD0DP=n@DzuK^m!Ws3jDEr?nn#a(B7U;9f_qYx!YK1Z1;UiXKmnm7BbY41K*e8 zie2g>_8(=L5ipbPcJ~MqWx64~G{(=|jMx&n|NI9L*+bA=WZW(QQ=X3TL|u4<^_jA zrfrKe8~GTC*1z@QZ;N1`6%ty`L~XJ1N9nJ-vnxhknb%CQ3^IhfEFrW|o?yhsp|G=| zxhZb79BFF0{$Y9;KIIVq_~3jMbnV8=u zt_Upl$;>aJD?mJ&)n`v3tA+8e6n?kbF*08^e`jV&oYL>ZR>@?qAp_ZhMFjJ6p^Kvy zuo^9n4bsLMKo@PeShs=|Zg;}GZbj+5S4%D7$;!lQw>X!ZjJ^S<{z3Hec$T~LFXOUl zJ4CXvFu-~fNcxod329NB^qpOp!kT@uN}g?ZzeTt?rcgF8 zs~)7WqxpiIcAx?}*BGwxG<;^0&c)8HFqDx(Np*eiJs7)#NFT1dV!b0$nNP>AhY@F2 z$^oC^pR4J^nW9%WJ%0)Zpn;US6n*1>{>nnJyI=0=E5`^mrQ>$8E)Rg*;LQ&8c-Xs~0T`1Dd3?8Lv1J ze)>tQQ?tfO%IIjzteUu>CaYxv7k~SXNpJ;RhO8moB}bPwQyYueARldUS1@t~ ze35BNoT>pxi;Zvu3w~IPE3lz^zev+yoN~=Jstj4}SyYjCI1xMtH`k~UJk1tn*>KJ# zLjwqW(_5M8mB1c|$|a zruhRozMRfU5*to9_i@yt*mGaXSSyZtcfd5_OGF9iYUNL56w`4&`ZZeKlYR+1Deeds z$?QP9J0-DbX6+a;Vi)zoqw7MxrPcD9uCDh5y{(URHEMQd#Ics#A@783)nDv(;KO?%+e&_Ux z)dbSgsNckcT5T6>7dlISBl^QUXlF>nq!C9Aj)_G++9^80osQ^BN(?JlX`i;$B~%nK zv=Z*P3CAD7m#D?j(g;E`l9V?+FI$R|WQhX!>p%^w#*1-~G%=Z)?ZneFvyY2kN#CvK zcN;b|$K{WkWe4SbT{^U_&7ZWHTg(|A8z0(Dw%^t0hh9xAVY>F>YRocIGqbwXk(W6^ zQBhB}Zk(pZ)slPcB`!;w4{5Vv`(KH#J=<0LJTq#O5&pDYVZ?Q;Ml2N0NtjV#$diU) zjYIOv_VefUkV`$xP}r25)3pC0PVDBQXNFfQukGrcBnStI0~?(PSfZe)7*AUvJ1moH zkb_lKPk6b8?wC#DF-BXZN26@&kzYo4rEhTvQ z=HRY}d!-Zs%hSYeYNd13vSp$E*EEnIt) z>di+5P!o2QhBfL0u3lUpLz|(RC&*r~?nZQkC_rAYWHRmW{|0$nmFM*qnjYnjb40tV zgO?E)giae)G)1FRw(C@rh`sA^gmgF(t9x=%YbKj=hg4`sDjJ&uL{fEXmOcFVxsQnm zO{5w7MYo##efU2E_vSr2qwEW&iCapN-6Fh@X0z8xU0B!We#;%nJNeGbX3#3)o8K!G z{aVYZ*-Gytr-e(J=*jpM!G)huwI{L$7pJZL2#NL-JOXv{T_IcPe zx5?IJp0F@ zE^}nt%V4azwiu(K<$lIWlWj3@3u|QGW<6GPj(p;T8(&<+q6t| zGEeEQHuI8J=E7&U7f4qG9u&H?IkDj*~U!yCXts)jCT+!8R2GKAG zYWr?|mCC=FDj#^-&6bcaRmKCjg&b5Qe9UARAt0h!?7wtJ)cn$yj5W6^vW$V8NMx9F zx_$wM+c@NHaGg^V_%pVQu6lN|P|~@3Mw#oeEw0`e(WlY2;My{lJ}z&(v5- zHIngax(t(o-@(XD7VSH+7|O-ZE;HdIC!71TVJb&OG<%KmwTl3DBRyBmXlZCC== zW*U47y1rW(o?r4SZB@ZX`Yj95-N+{9D}WFU)mfR1D37ClRhw$F@%MyCmc`A<_wA8{ zUwSmFiK~7Lkn4Iv8hCmB2kB^X={N}oD5-0pj(=J+G_q`((5*<^$hd-~v=|7Jgp<+rXwM7`;>v}udYH&XJh$Ku>;xd1uv{Rl2q6lc^gbh zJNQ@O?os+m=5VySXUpV}bUoVA7ne%$^AZ?7N(zxERMH%k84#&?vORKYP0cVPSJquw zZzr!>;iJ71l{}fWknnz>+(uAiTXvQ9APy+DDnpTA9i~tv0W=j}WyC(Ge5jq%&j8ZH z327&B2^;b5*ZsO$Zpl>!vI1ajETol3S;&$oIPcri2L3oFS~arm+RO#y){y>U;1pJa zhU8d_{)AW6EWZC>W!-mcl_OfI!nkX=ALuuItY|?Ipl$a!PrufXCezPu9z`?#*~j>7 zULtGC-Pp^tQ#A_Uqey%`F4cW**7Terb`Uk8Y#Zv0=y;&h^E1yk{;Hzn+RVl^t|apH zi9B&`@WxJ+NL^|D0BCmpK+E|-NP@8MvRl>xb26J@1bm5>!5lKOP{DyIbKKWSrF^=2$x zDd3!O7z;U1G=+=kK?{aXLd8r_ae8h}WVU(a9!||BV}7rDhr;6xBYGk6DcgBX$lWT= zVwUL-zxI(^?`f2QtJcYp9NbAyS^N^RyiQtT%P-Smx80W+T>rKao3GgW63Smq=>*gW z8|}DYT^ncCZ5vj-7BTEs?GUG?!dB+Zqp1mhzd9X`X9yg2?5(+PFugo(_`M#XWd}%k z_HhZ~(@9##OfXMIr%ET{y9i|(Y^a#^! zbITzhLd5Jl4Q>+rceO8*|glh zMpnFY$lhF3Fa+J7kUfJGJ-G;s5mGTwQ8C#4fICDx95e3D%#8zUfe)$&0X99{2fDxh zhHZSx=mg6Nf0lKy)|1S&mTFEmDQi8*+mK_%k-frVBI*ikTqCcW`T#^>Aj&S7w~5D^_C(V zJ1BqQtg_=YZ1#}xHRb4!$y*R`hq2sNc4Dk1-H4!ehaFYV!mL6U z#yV9Lsoqs$-(=b8sK<%Fdfgr(49Iz+$zc}n=H<1w_ar@3uYvy#n=dR)#s_M_&nkBpHi-8Vj-ccDuLOjq35>vL1 ztxK6~#%*N-YXCbTAel4;IQ*YpK=^!;mhnNb*SP>_1FmXru${DcZM7z@Rd97hbV$!2 zRhenjz_6sXHlY5&mUAO1u92rGJk5=)A2q)6I&8;d0%2howZG`v+Qlx%*leW}f#hAi zIc^k;WsmVEPSQN(KQA^r%-RW=UloVYt2+m0slT&+wQ~MQZ%YoQqenjC$2ebA#% zWkN-!pAwQzF{sXRq>(3R?{iugl!Y?j^eG{&AgZT3$vVBikzxn8%Iv$(RDp47^~@|u z3Sg{&XB?brLo6ec8EEpm*~so=*^NbY(jOTATnKUj>7=1LG;>N!7c$peoQEYBrdG|F zw+HtAo_B5yM)cgV$@soULL8oeH&VYrKS8ta(_mKU1FE@W6|rRWi&oXNAtKYBVIsmy z3J?CUx|>~Ngg`wV^^uX585aqz7Pg-=J8|AcOq5NpAXUP9+%RF))%l!@zQC3eofHg< z=^L#i|05tELSy?U79Bj^*Ly7ZAB}lLxB7$HG8c21xACp=dLF^2Tuk#)6mIwE3Km+T9BGzz(Fr5%K*Bv}@1W z9w+=*2I_bR2QSpdeKJL&L7$B*nN6D}O@_ir69}XP-pQf0;SR!CFr#F@e0!6FefN!q z7A2Db_R}d_%!f66va14jimQS+0Ny#D*KK}T;<=V?hQJaaOHpUbIkefiXTaOrD+(>6 zbu}4E6u0}>J@(d+u(`V|ezqC3qpxEdu)LG^Ia(U2z&NIFo)xP|Sl^+Mo`8&tRA8yE zb9AF!jg5~LIQ^Y3gtVA)q1d{d*FKC6>47Fj3&NOgScaREZQ2c*vV*`T6@^LC-rj`q zCDp%!y}YE|W2Jr-l|rGNxs|)km5eKDZp5;JNY6Z^1MBAB|4=*6y|GH{OMZ{jhj`PM&{0a9&qkUf5lxz-i|E$zfd z!a|*Cyu5zl^6xEUYcqRKfOg%oh=koeIb_uoqhr5?@O6@{Dt2Ni?smDo9_>P)*OACrKVsW(dm{+T|QI!5ciVUql z+Dy=nfsk^!#K|-Pp;~sCqO)XB;a%7qu^SgZHDi2p9i)EW^ieppFjU8X;?TP*Wvi+F z#Z%G1+CiBsT-^b7!0R~kk);l)r(K9$!EI#1v)nKV4aM6NYZX(_UH!+|2%}S^R zAsWbQ4eNErAMeb=g`uyo_$?*f?Y5{N=6aj%+otxv={tTFeKd^x> ziD%RvYDEqp#@wB63qeeIzSU9luQ_e>N(6+{E+cdUp_!&kx8)FG*Mse4Sz(sLYgv0= z)V9Uc%t$yby=Z|ISl@;3jaiG-mhsxFYn_&;ZtGdmcce6`iNC#+cqKZ! z()*{e9`JHdqITyhje>+ltC?V0ma8E5+kR`Occl!x-pyX>tKl(q8wBt_1SpE?k#%*( zG%D&6#;SRTb)ksD_Tvwr42(ZPzRi=^U%hGLw6Wnx4!=gp3?sM9I}lNcroJOeH1Ce& z@M&fin$q-MF=!EI?UDp(r`yOno`d&`i?!-9A9u&3*$>*HRbanQdAA_3zMdiScrt#R zz3^+I_J_QkoN|30;@hl+5f0`w27}T+Ej`3fYRd;Br4vR^`;qqj87|DM!X%c*lMKzp zzKb|?YSc9bO{5QtO^1eN30>tBOFEpbR(nf(wDQNJ!5Q}HmwiM4O1u#T2ev~_4qC$6 zjJr7jQfAB)d4`Il%I^nhj%e{{E8JOZ=cMt}kpTHV$G-xWCYBkx3{t;?P#hasP`t0M z*nqX&I{r5|!bs=#jD^p?vqoTTD|x3C9|P>-*>Op}xK=SBC6<6>XuTXTj7~X+bT<}@ ztB&#%_VoGHMF?K9Euz&R^fnAfM10vNL~mNd&0tGXbOQ=}p}e>``gJk<7$=8i(>||V zc=)s8T~p=-C)tx*z~OzV%9b3DlVCyCEz9^HYLsD;Fveo_^Dt%67e|=6}re)D%r!rzjh2g zRBPM|&!6gV98~0f;plknPk;3}NRyAZo(FEUHOMLksnYe9MskoGkjA1cP4E(N3uvvy z;&;yEn~8Hv`?TK^x7(lyesqqAlBVB(Vi4Wh`o*0G@Z|bN=v;*!Fe55@B&1c5+nqCP z2rt)?l~95w)dl3>yJ|JD3+l7b9xN>T?ra+@X$=+28?RLAUPVS3f62k-n#&)Tw#~cW z{}o(Me08Gw4+6)JQF41OnX`9=RG6y1Tm6@Kik)NYO8F#2VQ~JrEkejSV8yb;mdUHZ z)7gW0Vjp4IM>yoANs?hg@)W3#F-~@P`nC|q{72tVh#m7*7eaePQpaVa0WN1^j~x0! zG?k5_-QZzZq~EDshLE{Sr!Np5Gp#e!(Dr41YWeG+RZmFbgcODiA%v+gFVuhd+Z4BM z@P(!Hw1Gb1P#MHyz9CV@&P}|a8e`(RURD8g!P~-x{2brOWl`9yz-fS+T$pPW#Z8!^ zrQEs6mq{^nLM>>AWDwB`;)a`lj!;eT-VXkoTs7zg#`ENITo>fZiXp8^8KxV9`zAoZr@2#2Zc0dZ96gW z`A^w|+om$Ea{U-b@}okU0D`qB{oUV6}Ljiq82n#2;)k4$TR=PDS_ z&kG@2(WfkXKt_KuBaI=8xX})vW^FbXG5INRSfrSrK^xk~3J;RKt zvQVWLpkfZH=;U(i?$6VYF&ynzt_K2f{6!mdQl)ZRLx-z6oC)=#X^n!j>f?b2(}Q?z zPO1vTy)bM|*_NbMhMekh8J;R!nIRT5WfSAuYr|OgAtYza(;<5w)p2>)>ya(OQ%LZm zY*$6gc}?#W(gMTE#ttTmrla;|Q&V!yiOr@J!gycDt_e;z6WIAor%Sf4BF#2X3-;oh z?6DIiS2wmBsXqq%5#UVX)?YkS8}@Q^ltboJ?0-M@FY3sW#!{C}h$pnP|lbug(77r@#Cf_Rqp2+k*2u6tSoHVN@c z^464E9Qm{ zTjlFBr%8LH-+KLhp&8s>f;E9aj)iNFcb(1s6ya8ArpGl%l~O|Q}mI*phIdkI-s z<45Ekf44sb>j5A-AVsigDTkwyG{- zC2Ls?BcEg*$Q?IQBf61T@cnJ@&FE9M64TBN==-qqVi+5Z`Ilv)) zE+iF>#UBQg?v}O76Awh|cbF@L3#7}PW_6yb zp1QFJpW@;q3EyM9ov(AGFRM{WpRv0ya}?p?CPI{8T8`9s)Iw-F*>6}2JGuJLaso$l}=ShwF0f|ZN1nF#`v=Y zUBO?QTme#7h^O*!nm%sL4ZTYp^(M?(^ z-)u)2sA*kQV2v@%uDo6Jd%3q2$lF3d2?_8jhLK)2y4uNTkpoEjeoURsKXbAngk)il zLjUOnL^F(lT{5Q3Ic#(ydCt^jwSBSX%sgLD(g|A6 z{?Y|^vvw)jw1Hvs6@*O@8pX05g?z#EjSyxk8 zdy;L7QH&3=ZGftb*q7o=e%o3M`nc*$lqX`17Ghe>a4k`u6G$n~S(Rpz&udLLGcnn) zU=D#64q-VVVIhes3+jL+LY~EZR3>mmYi0$OHZxL5i{{r#&-D~$u!Cqu(A3ad{GFf9 z5Hhr1i4RT;xzd%|ElE{mi3JT}C4uALE9 zRRzf|I7-gaLfy+qq6P2AMRmm$uX7W1+N7Yt>E$FvQanJl2(ovCY+CllLUckbkwRg zfSq(I`I29ReTZ$IPBu0)rh_NyU`6UCKUQtWF$PG%Y}8P@w1pz2jm>1l)q-fKNUCw& zGUkZkt{NWtWdfT|5Y5tan*1kA#UIDk#8Lo$Nd$kphbGCTSI@l%Jes-`$7?@t_P+LN zkra859`W7Hn?tBo*+;Xx;EFq<3*%Tw zd*H$YheD}+c7nz1A(bqk#!e)vsU1*Ga%RR@X+=1-tPP_->Refg3Paa#gaZ9;t0s2H zd@t>Gifxp5{jMdT>7YLvVO9DuaqjixG#y~TVB?nuTR_uLg8Fm5q6Au53)7C73pz}$ z29s_s;{TJi^O)?C0_I^BVOetisdLYu!gXE)_zYl<|Xh{xBWQ|MEb-f z8c%!?0vNWxT49Hhi;vq4aQMq35>7LO{BrL!^>&#rVhL?koz%@w3V|bKTUS>iv1|Zp z=~*3!3<=98*lS|Unu5nSsjube3e9a5tLODF5FE)m1jAnlb2xg#igKm}%hw$`(r|C2 z=kC4TQwoM<4BM=+v(G4F^YIKAr!u+WC$ye|HXOydHUDtCpFN}lsOn#j$r}TwDvT#_ zRZbXT`|#E!GxLuWI8{{+1(&&VsO@(4MI;9U&zGhFi-LXDIGB~H0JRbxK)OyXJq&%X zL6i>W&F?6fw7M2QCuR-I5xcs137&o5A3xveV006(;*S?{Xb3A$&m^b?xmYu&jG`}c zP2PP3%2&IZPAow=E!#Gpy!)Wk#1URH2Q@2SKcubvcSReE>n0VAO&IUp^tRsEGseADzdEY3N!X9)<3qNuT1-w_6tn)sdzg& zQ5Lg4oZ+Sn0Tw)j>|!b{g{;iaLJ%D7MaH;CUUlyj+fGfK4a7I^6(VXJAk)joGkMI8 zJ~GXcN|#EF-N%-#Fc#clpNtFtusn0z0(WJWbA{c^!awAaw2qmv~P3Ep^3Yx&X$va+E7|BD1GQZwTSwWQp|n@Fr; zR-BAa+NOZq0aDV{$U6v$7w0jIYr9Sd7vR-whP?denWqOJUg z;c3prgpa5;8W^y^oZ{9hE$RZK=njaYXHL}973K5io{@toDtL4tZ&e#6vyM}BIk!x4 z*v?{|Dd%81-R1kBZEmy2Ke&57l|gulIwS<3qjWsXL3)0HurNINW7))RzBN7?8z)O{ z4@E?xw_X+#AI)2&jVMlB_*Ad-`{_tazp1QTgizOp^mWc=EN~g@o_9y_Pw8GeEnA}B zGdXBf{+^?Os4rU=@J9$h?~Rcgp=^GXshp_P(^Qc|ZLKc-u3;&(%wz0d(vPYT^V{NV zU*%7AJ~`vupw62En7=_26M#EB@S^V+-^2eX$ia$g4lBaRZQCRWj3jD9Ad+Lmk`Hl` z!{-g6ln@gCv`Bu$Y5#qL>8E=i*3l|Kt`eFIH%+tGZ!^s#4q2Ye22I#T#-mU=rXgEy zZTwMWCofp<>uVOtB|~@l3Pi&t1d3f#WA7T=Kn05M+f25%Su7bO&-B} zb6N;hsv7M7C})E7KZAB!6BzpDY(ohSEn2`6g*p;hK&)w&uGR@#Rei#va%Akb%riO6 z{wD?wGY^;5y^zUpOyXm01Mao-iA{_;7)k^(SMeU{_$7Z&gGlE`v|f%eKc=GFkG|cn zeqD=C*qa!$9nY;=QuON60Yycjge5NieF3-?g?|X=sw+_IC+e~91Up(v^iBAw2h@uJ z)e5j&TeJWzCHWOukTUcknZ&&1!S!F#6FgUew&k+!9T&BW>Gd5h@|k4j-jp$4(kK*x zRjVLu0LOXrS*Lb*C_itCSo(N^xt`kxO4>C!cRPn) z4~x^#Taoy1slcKpeUJj<$W;a$0m5t62sJyE^WD*880)AL;@Z9YqiYG14z6Q_mMADu z{6zKC46#wu&TDTRt`&3|?do!k28{s!P2#lMU`>gK&%{(oM%h*||Lf6X6 z*C`X~)Vh=Y{66l-I~{TpKlpVsDF0#tPg_*a`8f(#B};bscj#FEX}Utxla!MAC{BEo z7W#kGJSp#+|92qhD&xO^pzk{fh_@gI%ifIECWHMXu+D~~ z#Ed>;um06W0r$N_tfHCcep|zt#}Lv1wuKhFBb|h0l6$iVs}h@9Orv`6we=$QAT8q! z3Fi8?%X7tP^2F!dBnxhgx+jb@*|~!{goEp8egYVrZu|^&d8}!&Umw$m)yU`ut!@ID zt=;*2iVOSe*nAwrb(7L-GIqVA`b9$QVVH>)QL>tT(1*7@m@Q{!vEB z%Ex}vmI*es`NUCR*KoY11*ZbA_9AiP)o3E4G?EDx)3uYf>Av76;h>V-J{$sOjppY)Wm1*X`z!JLB6#D6ev1*v2cELF&Ri8Mwc`30%EwahS+4ZF{HSn{ z5)IBfQsaVNJ?(E2I=^XSr0+bgazVD&Y_sB0m6P71>;f64Q|4u+@mCX*Z5z6DNm-9BYLLsra#v`pN+0p5k@h z$aGEvGZrkv__NyPH$cUOCp;#Del3zPK`98dR0jr)ea@snlIWh&tN`yX#J&H;FeY0Z z;P63S`fUPeL2TF^Cf%W?g=gV<9!h-^QCTl3rIz3y-A5tI<#y5J{=6cvW@p<_uxhr; z4BNT}!IiB=rF#{vfZ%Cd4HB3vOZ+leRHdPmF_c0}J^V3o(2vN&Ue|2iS~rEFe8$-F zgUOKGb*5DwSRRlMXVv}LK!)J2*Ooa2GaQbf_3`V!;mZZQ)nThs8XITnoqZh`8JG{> zLI?j%;8?#XBKUX2U2)3V%&9??*1tkL6p0Dd&FCkErmtRr_mZ{Uvt`l0v_VG>FcA|1H5@Z~8A|NviypnXJH*&6 zL$dT70yxa@u5(alOogI$?cNKfm}r#lf=6+0JiXKbRO7?R*uQn>-z99KXu&EM)=%%D z&K6Hsn#OEF2M2s$2x0h7FTmffiiLCapx4<;pQTe^2SvuGyfi@JxRkWFlPYMwe9cQZ zAF;|I?%qX%_fHMTYWQbLfjM}DxHkHcH>Xjtt8DxklT4<*m9aFYt2BgBOIL^`}r5g{Jh!1cZ?AJ zbQaXx3${NMiP>bJ&Aa45*b}tHqC~XJb)B@Nsh)o4d-Dt6I6NkooqPmePDj@~yEvRxBpNJgPf_*XlL z?iU5Cu)nK(&Xh`oE3}$Ph{xfL$U?IHSuJ|CHONIxf1k^uSNs$eSuJg5+(uT5<4$ zPHHw_qW~$o5tG{&IdLh7^x{%#wIRfzJ9(V%i><3nTAUiD>ffH~$D~WFERMzH#lXCc zzc3f+?t*ID2pJd8x%d$2V~6SknTN`4Pl#aj!%yj{ZS09}BU6g~W%w{z5o7!xV9IZs zK4!>k$S*x>`L+kcxc;oBu6sW*3(OV4k7ui3-HYUk`}i$ zz=>AoIvIEEKv)}k!=!(?%@;f;Kmu3KoX@l-{T=H`s;q~JRu%;=LHFVy-h9?^qt49v6)C&h|5=uF>7v+Bd~#Xx*V>}$fSX%Fn}R7T`%l~81!QhJxeHqt%yACQ-nu)u zh%+3besBMOd!sNFT%gbN@!ciU-V(cO$v;*um1b$&9TnmVttsBUixqc2Uln~|y6E_0 zcQo*Jf1~{U-Ft8OpbSEMM25@#5G!RVvMWqO##$v;h#Y(>wV`?%~x!P-b9$7t>0tH zM(=T!d-Q&;(qwxzhDo5w1JWakK}oSpW~&;Do15?( z_P*rW$FFA$RZ`1CzkK-JwUgZ>0Vybm?$hZ+Rid8Wxl~#yH?41IoV_`gr)`{d?BxDvf#a11T{ctca=Rl#LaHryp+@ zuc+^TXR63}t(_ke{*Z|r-_A-QX>-?7eL(pybJH$o*XurT6z#NM_}#lRzGUck5uUIV z1EN$@vl{c8*!`Gdt)bvO0FotHQJ%DK79iv_=eGS4P2RtI_4{4Nf(Rn#e-Ny9lPPed zFwer3{Qv#QI~lnDyZWa8KU>r)4Ai`Jm5Esit_{qptqE#Aw00c%rMhr9v?C-PO>#yY zxj*$H;W_6GMM55(DyJ`x!cIQfjqLfrtSSE6pEN(*_MmYc+FaK|6NMnO>I{V*Qk>UE zO8yFI4GHD65o7>DYA_gcu(5F%X0Pf(bL))`FxEMs-~>z;DpR#L!!+}03krC3Z_BW& z(p{}t$_neh__T+jeT}d(Rb1|X^~}t5%pRb@)Evma57uWN?|j6x;!kIDPl+Fd=EYUH z1~M=LRYVy}`%AjqJ~m6(^#wtCVwYtDTGi!`w4O+<7@lnFQlq6CTOW>(vB3lBQqW8aeaOkit58$S{Sz(6Z2bj7 zgV5f0+(`fALk%|6Wx)TlcW02O>;;^ms#ia6eq9!d6f!il!c6J~X`dbjpVeR8LO>0*ZHoQ+io}AxzYuL&~nJjMdX&3qfs49;VH; z$t<20hfOiee8*7dOC^@}{`mZ~Ve}RYCZO)|(PY2Y^p^7VePWQ!&WWCXJ&#^%OCp0o zg5<5oaVh zV(Yz93@czp_){47#DnSkgCPD28)uqfTMgS_QeSOOz<1eyJV+C=+8V5F>m;IrJ(W6k zJ9fS-yd3Ec0=7y*-dRuUF=`B}RR@bHFy%tIweS!Fosz2ZZw~(CcOm@3$2yjAdxjAi zAO(bqU7XUC;^I0^0t`8-S-3LIu~%v0By|QPkeXpQLsI*Jl#PMc=`O1qUY{bH?F}Da zjZs?(I63AAGwqOWSALB-Vz9dct6ok|NWP~<_i+6<5^bT_di|;($k?sTeNpoJ zR#v9vXkz7XL#m{aLbKBSH&J`uG3dS#N^)u{P@NKPAUZd=;%r@M`mK>Vxck$+)Hd`CA~fg}yMBU9g9X~?f2X_!h(9GdnNy(7e& zm83z$pN6i!-|Zivg6b}|Qh}HS&q}`=fermydX958z|0dm^yP@4XxaoE?tw2(g&=NC zmSgD5`;_6$l*a9+3=7JpddAHsBcsQS0D0j|xp^4D)yZAzg~sP@t$L^CzL3rdu$ zWZp$ax11De{G%0u5(8q2l?v=8W_{)#xuxS46g^gPTJYRgY*BqyA{4&vxdR}y=M8Y{ zJ<>b;4VFwt)j>KC$Nn86%Kxvr?~H14`})L-N>c*TRFEQFK@=&{5_%OP9YKkT6dR#P zF98Hmklv(76%hdu=?DqEiZnrb=pa21(#wRudhdNdyz^n!%$k|=fwi9SoW7rZ&e?mP z-|w>!@l0f!QygdU-;p1U+%pzYb*1c(vsaQ@@P4)Fy^&pd=MF}sH8}r??s0A8N@EI0 z3U{OseBgfl&>MNTzAMP__x3VGEM$o(ZSe9Qyv$Gh9TQ^e+A+=CCuH$YOi0;!)xQ4w z>f|t^FOMaTyaU~%v4%IaZuXtCVCx#sa5_;~8Y z-X!c|uh3HLd@7|aX6F_bkStttT&XJbH{wuOv_?_7#zg#9X}NuXZL-wJYf=mQ$@8Z- z8s8)H6?}3t&hpBPI6(%lwj>LC2P_?jfD~5`A!@oe5ftMURRx3!l1#7CK)d(_?64M`O-DW#w@eM|IBbSJ)(w_M=;RG<2@Ct>7>9?MR(0 zK4>|TC;PdY;T-I1w89hjckjMnm)sqMIHDoQe+Q~H~=~NlP#X<3gKkR zFTDax>gwcKpKj$=`ccLsQN7B;^D73YWBEd~Ytuu|`rM%TnV(vAYMbw+ zjZJChcuOJnej2gs%jFZpv8UzYPaMKCPV>^RAiX(t<7ikkF;pWZF7)d2$MX@dezwk~ zD#5dWLG#1@wizw=Yc4Npg}Nw1FPAtPW;p35s>_v~v&k`%H24j=ay&f$LP-M6SxxvT zo&7F6=k+W44;Aw_1RoB$E)6C&q#tB3?q5Y+rGawftn)Zs|KtB=oPSnfp{k;GxlRV` zv=`V(yY*gw;GlV%?BgguR-qH_?L^5ps8cUbSp`olPJ|Yg1e?|@FnnAyY|%IU?4hs} z!}Gdlx$sOynHZVQk=HvSztpurN-8Qk+I&IlJLbo=p9J)$(;d43h8o$2>= z?)!8FExHTj-FtexVB)dtVE!y)eO_K^YZ$M}4a>JN(}RH?m%3 zhumUn1!s9t%eI^%1=lG??+y^xi~1WXwJu-gM2-Q_#B6|;2{VmLM`y>p`*ATpjt(iaR?e(PO zpxO*-$+^Es-_hWS+l{DOG`v;1IafNB<|)CS8cq%?Z|@&J z^SKIsZagHOK|*9F>ZOaG{D8_xp&8IRxsGZpc|S=i-%YRvcrpILajy$N8s>bdOvT01 z^p%dRdM;Iy2cD67z53yQYypggx(26`YhX=`^Yr=2GVa9W2f8$q`DC{D%-GTM4G$A) z#?GH9HoM5kRaTI)At3Qx1agbR4AWb`)O%Lw`r9#KzjVV#xi1Ny`~`jTn0No*KGuiTVM~=ldV&K+#?P1fe81_xUk)#&j2VW>aF2-_91UHZDyvQ^ zQE<4TsXNzWI0Fp_u|p>8BWc$}zU#m305)@5q%LnzLRZ*x8smmozxT7D#*T){4%=xf zRJ~xEtSls09@)EwGqH_&A`$-LE%Z?E*?zuimEZf1V9`1*b` z`|^gIZ;>c8vi#1Bprwb0xuX6p+X6ZLL>CKIk^YRRmz71Gi^Hs3+n)9ag;96tt;Zi8 zSBlAM$lznP$6ZrrgbdCmu4^&QXvlqtyfx%et=sK;&gZ^lf#0xxv3pi`C3~8T-9)nI z)f}xvyT=wE-;X%tO{T0X9}_a~4*$+V*3}m6>br5aeZ|A~$;;?~Hl>wD2m-MBx;ioL ztxAtYYlhi>A`J@Ay*&?-UUrVf_-KPmn2UY6hen=-J+#zbl+x}boR6`N=d8W7=H!v8 z9obq!xUovmR-DK$W%VDwX=f``;1&}5#voZ9d~xKEvxWce+>+j*KAAo8*Id~y?Y_Ta z>%OSFVTIRcGf5E#sY8F`yY*IYQHc6X_;KIt3vCfR5#*W!yk7l{r5iJ(6m^$4ds(3( zaT#ge!Y3wuqbdQ_G0EHpmy8%?^$(q|oOTz*uV0Cva)RGX)}`$7#Exem&PFtQ`ZlgE zpuq}2fBkMrcW(*RF`C--Q>pu=DEvbDNZI)G zx?X_9Ni&=5NACglkr%8-9@d&lmj3Zob5}&&x*z>xGG?HK#o#PgO)kNbW zWaUbYyGByZPd~UkcNW_j-Z*X}FrR3w$B=BUWcGS6m$?S8N@b6a8hc#) zkL!$g=&Z(^q~4c(#X~O^YUuvMenV@Yx4n;Lz37WetJqv=81J8$SoyF-R8Q06gsfq} z!&cLp(kzAQEE;d5$iyDO+(Ri4qMe!9^}%rR?P&W|sqz|DxtWE8lIp7SGsEWw6<}a?#S{KM2oS`d!;9`lo{+Qe|kQ)Ec@TKhI zY_008mBd^Y`JdZwT!fVebc`zn=TLcqq}8vX5v<>#J$^zsodvJwtV~KYc_H4 z+>*H@ov(b*0U&5C|FOk=B4nm(IH~1c|77Gx{qY%yGuf3_>DQOY{J|DV;I{Aw3Cix=!0AhMVfw2ak3^4%dDxCvB1=jRMZu-|q;B zD||d&{q?~N$7C4?U%0-zDc`{!Q)OUmijijCv4?=R~)@{4b~qKHh^#`kTRhA1(S49Yu5`aW<-n78{&4 zh@ZiR_B|cHK_X_e9i)n+IVRuFxLOM%ERB}#+3T$xkKOlW+g=>2hJ~&Y)*LY z%xK?8E4_kd&1(go4_|63FS)h5YZqt+JU3Ihdv^gylo+rz9@Y9Z>@ovW_}DVPrOgMC zJnfW=Fpjr@C-j$cZk+nK%xUaX;dR0ML`KySy>8w-Rk5f(UFW7D`S8~V3)XEP)phTt zcR?;Bj6fZ`0%O^l%C?X z8*jG%Ba#*M0}abO@4TV{hc|W|uYF%&kFD{qGkTIRvcmpkJpGd7tJL-V-aqcfC&(J& zp@gcRr%7nUKWGQ5&O!dzM8rgB!`>f1!s_C#ymE9`QHB>Z3x0vGY(d6%web)xVU5O1 z0fxR&>Xz6iS<233lu>kl6M2kccWm+5HTp_x^$n#ceCw4QwO3dX&LHJy6S8%9b>8A? zlMRn~6no>m&ciD1`3@s#aVyz>xu9Cv!`uw_U+8=>&DuSEIYEl4esDq0!_cUt^%0+1 zUHwzj`Mt+t<`#-G#cdpL1C}V!f{&ldy`OSei8{Nz^SKY~KJ6i8fvL-^O`a)$KE6=2U%3t{_o2j7*KIoRi@#vE- zXv@dBF_d6lG@1Nr6tpHqJRe)Z7RlL(-{3LUPQTrM-_iDaKK<90i`~nwtD8bPz?d^d zL8V9VQIPP+s<>ZQr$Z)f;i7>_h)Vc; zC4`RzxGUO<_j5s_L|%$niTf7*X3`MZh{5zUCI8o9z>A3tV1mlBbt059bRl?ftw|s(at2 zcxGgxBBZVB7T5XFniX^DH^Uj#QBP?QIT=sAf=zUD>>J;msMD;74@l>jjK4FP`wNFQqff$V_%ZY2P)DVCmUs) zNq=oge7qIAk}M~h6(zPZQ^YjWsBvuOlhO7^ysExMlvHM)qo#f7OAQu2*fCli(*cKs z6vOcV9CdqVko@dF*X;*qG#@nJs$D(IL)D)3g-^r7UcUyvuhK=5{3q2uu^bkqZo$m- zJcg8UHh<%l{HZN6X!#PnX8ZRBE9GK1eP~y@21E5NRN< zEpjM9*acjNJoZ^2B;IEryN``FScmCsC|#XA&3ouad=gHrN3uVY5X$&qF(@3z=fA}M zbd7ED2;h}EhMsM2d*b4m-xvbwEHngx*vl-`iGjgqT~kmNRLXVl_fy6-Q?)y)@qbMK zw1oux(WX!9REYj}s$Cg2ZA=d}BrWC2)A0M|SqDIKc5c3rTi?z#_K2ZY0dRH9kw$yB z7lP{DU-FG~4rPLtLNLujHg@%%8)F(TwA|`Mt1Orqv;>KvY$Jvodq;*E&J9N7|7npp ztwp&Q()^J;Gxo`;Y@gYBPq(9=0gS@|t8Z8lN;hn4>EB9R_*E{QKHXn)x){gumont# zbeXJZa;R_D_#ayU=T??oxfDg9b6{E`Pwky~z|Q7s%~G)ZI)6ds37=B0={|^x;$9Jg zR2ra4Fz25caiij3XY}BEw^_GNj2}Jzs}2l}IYqI4fBTDmtL{i93@c9U5+HAZ@tHEz zp*09~#`tMmYZ{ysc}=ciw{WMH<(w-LKC&WBW4%#T|LbR%9kS_iZDfK{s!-~EmbVYi zVb@pns0%WXrj8&L1#gVqqv|`@A_#;u_DDbhwm7w|v(ItVKmI}a``AR$* zWjJgxvRvS2(8?9c0m*nla&&QR_ANT5JP5x+^ylC4?Y;TM%BWYR34C;KcGxyCu_~6@ z6KAgl#xx3~Q1D`e5KYsQ-gv{G{cUU7_mv*C6# z>&92VurU%Qd}O4Q;pBFPo*c?<^_1FT4xti2T^pdHp_Dyd=Fk+X?lnfaskA?-yg$^=Q z4HbgXa6bpT)81Yr6LsT(X60%`oP z6(10`2ZVcF7t?r~Jo~t0R^~twmlM2okHpdk!U3t{dM9KkC}-fX5wp^O1B{@%Q$9_Y zFM;McgDB3=W5ycsAeme4L5s!vJiy?;$aAnp^eBSR83zgARoe?)U6DyQQLU%{qclRa z1?fH(khwXs2Qwcd{ftRF2tSm{0s^)>RJXYZ!$k7f2d<9~)xs$QP}H>xIPVC-K_3K_ zn~L7rq3qjTpl4Ox#USmdSH1Q}V0%Q^?ou3O!4tM0Q3&twe2Ct&-pcV?UYi&ikB*xm ztse})#3)OJNM-yI7_nDm4R_nOc1{g0;aR4x7b4uH)vkcxXSkCoKTBW~a2&a%14M`c z0KXwH1*a;SSYVi$<*xt`X`v{)2X=1j!>9^RH*~>v<`Rh(S+TfKbV(I^tpP8S1LA-! z*PBPfh+h}WgCAiE5tM!LE)aRzslR?DzmBZnPg<%6lTlaKA|d4URhjl!3Uln2VA3)R zvH_oe#T#{ob}KO8Kw)BUPx_$aK$6@U0VYp$-G5Z^p1j}#^th|OzY;T$^M%qDcQy@T z=2={~7)Qyl;iJyP12ZfGa{2 z6(CVD$J{Tq3kG|Tc#Zf2dF~8iH#3f9Aibd09>3a#sKpV*;}$NXoXZ1YnQK4^#`#Dj zuBBptVzoIvK%o@MObs-8OrsY9ubbM&*2C-ecn5+PPETAXcTSdI%dAtWlL@|P?4>Mf zOxHdPHBm<{>^cvdjCA;^2%!%3SAeC1O{LL8AozI;%2p0#X7%G&IN{amf_N+lUrEK+ zZ$LEYTgJ=zRs8GFP=D-OEGA0rxkE{I% z^TUI~cc1wpD2j)?R z0FYyF6m?a=oit#NpR#rZVi$_~2VAl(=B_OzfhlV{2(lP;5&+-(yjcs{U+4h<^9Xa5 zIm!hqaKav-md_2nVppgbk!8ELW}YEl>l%eZQom7gMdBd&d@(G3t9a|^c{dx>v|cb# zX&zxD16$pAj|EWTmAuhR{aq%cS-m0Z^`(tit%sMG!}+(!{h?shq8l#+DBBE30(Wdn zxP0c+^hS!}5WBYONBkVe{l30hH=Bd$W+?2$kJT6JH|6oRlt?Hu7ZD-wlZ+MsP6eP} zE(!}!o1Bq2=GiXS#!{W-T5AW8FM7P*le!nTh``Q6GG0|g6i!T|K5QUagV?Dmlnw+tm28c`Hw^$X93X*K zp|O1AUGueQknb`v5+a;~UxMaaUn0$=z~E%9g<>%9_DOx#Byey0Pcr*LLfeb3Q1j)L z4Ji3C7un@}gL_h3qs@G<*@Z^RB0@31Nf8)CEl>4*YeO|c4Vlx_4lWJ2ud@TbF)$aM zJ&?UdrVvavi7BBpaR4pwEx z$}`~fQr+px7FO6f0vdLnXnaYK=wv--fYd5%|sFyh-qQp zA9jY-2k*zj4wyPd21wsJMq=y&Ywag+U`^D^fmql=W$o^_r5tL{fsB+|r7!DFJ0)$h zw%qXv()VD81BS8Q08tz8`^bm zUl7xNwdTaMgMaAOfvdGA_B>f=i{sE#AFtSBd{WlACLWt_wRydJsWRsUBJkmppPx6X zc~%E{;DMLC_rDea$*GRx(-ZtK11%KRXpx%HihDu_c;5Rfhw?yxmnX5p#r z!LCfzGGg~t0Rq%{km~!h9I=aAE9&@8x8Q;-LX2Y{Q2MRmgwX*6T9Ha_Tc=_wQXdQg zG#Z$HP0S~|J0>@~+5ojw3O9D$nDP_id#dT6&DwN;VfF_bn;PvS7DwVTalCpt0f{0x zr0yX_c%rWsYQD(Uxf3|~Xk8S68l_U=MiuL3F9cCXt*>dTju3mCVT3du_&zN}_w~gf z?DBK#Mvw9ph~HLfyeuKK$bUB$xfsd&!96*h+L=S?>uUueiBoY@0ueSJh>qjw-%=2t zYUlcLO8;EcYPJdmgQW!i99@r&!2Q@m1|2wiAr*O!EkFzOvaexE4fmG{)<&)2q|dM0 z`>5!YG+20TJ3AhpT_g~Yb&bS0wBW%ckxd>f&l4ay8cM_k;O!v6mZ+C;%*2*B5P5A% z5o(o`muU?*ke{4!;nDm^+9iSl_9n3G&{X^R?6n|*sYt}T{3LawgGU9k?MdSHfk=SE z&G~bPz@Hm^Aaw!CV8x2_&2vD)P#goO05?fn3=O(X5thD6h)$-v*dYM$K*asE;G}f7 z#vkUy&9gLL($ZiX0QrEpkkbo*1SgSF#P#_|(}9iHblnN|xC0<@Tv!GaOgbYpRJGd1 zyifuSUYfvGGevhhLr%caTQa1HwBwJVs2vz&hXM8zOVJ)R0@CC@Xgz@i1tRq0u*l?d z=njZL=UiRee;kCRrX|Fpze-*FNK1=kmMXIl) z6JfVMbFBgZ-2X04*-h$N4@TbN)C++9K%XO~%TSh+;v}=J_{bsGRozPVdWTb}8NOP+ zuIL1D7|}CF870Enl3{4pn$QBqkWog^pn1<|at;?bltNn}zcECVSjapCeMZAFvcK4? z9cwUH&T%!18QawCZnb;IzZIn0iJ%l@9<|?7PjtDYEGcJ+5P#vl9`x2{v({<$6^x=t zee2JR&I!`Jrdrx@s-1l_x>JzqNOUe}H_B1PY?V)T1q+TDV-igF1wcQ<8ll2kzZFn? zcbjo%s4erKT5r>C6|U(kCqJ}JWRC(@AJRFwO6b05sG(y{+O z$p+BKFi-Ne2DmebFD3P`dVRI`T@!i{>hnyn$;2*=!Dz!fg!9iqmX4{p%Hv{WET2Z4 zY8d}hR`&2gGfBP^p_?o=uEXJh>Q$}`PxJm9-3FN$Lo!2FrvbRw>4G?KE>|Xv?tXFedBzWS*P=MrXI2An>R!#3$tgpC01!Ry z;PXj+5`LPAt@(3eJihS_gVlz2b1WCv?=iKdKjLN--h+h^z?u?!-&9&NZFiF7Q|=RUD8K-Pe(aA@;tVBFn*@up&U_`KBu zX&}AWWUWY6wLn~VnVstIGc+wLCdRII78rBj=9)tyxUMf37$@hgQqRX9J(AcZd5yK}tx*H4FkKSeMsnL7RR>;gF2{P)xU!@|#} z3pig3MK&BLz=&g0xE#A$B%EftV*I=9F8x{nwWqjl;Ya`|jEe0R{@fNR(CmU5e52ws z_^bogXbJDI9?YX@ICg(l>i%vU;Gb#EmEURHH+jN=;*MKv*JGT31z(Tlm*RgUc zU_z1rbvg+w;J3t%R^JUd+Dz*R!2orT10%pR{(iT4)|50v-S>JHjxg8k){mhF$g8_{wZWG`&i`dYdB4; z64qz!MeQ7v_N{g&Ff3`y{&^!LfP>F_er_XpAPi2WpPQ;>)%vsXpov+|A5}yFhr-DU z{}M7{@4WC)R`@pd+#Hc&Y2rg$8|NbhbpI4f*Zdz<5|~Hiy9WHb#s8-Wq5per`@e;M rdXCCKM@OaNKX^Z(_3!whzNV+!$&4o~vy+$(du*U%qWw|xPT2nd#1L8C literal 126496 zcmd>m#+`xIXo(CNACG9#*;6}S`MlWb)RlEewP~AlX^2X z)Xv$xSZdW+Y9&TBgKFGAHRE2ZTbPTTKGsJ0r;Qz8pQP3}BsJiW@NF=1?K#=V7@@;~ zOrtoDI=-v-?;?ycWJWIUGo1ZaFTFP+qN7zGCiAyF)qVAMdJk<4ix3UtU(a9vBO2bn z9-7~yM_m8u-C;g%`%iD}#sA?K1*U{4X=!OGC?=8Pa4h+?jpSG3Rc)}-BJ`s0%HAI4 z@9lH|tqKk#6VBPCYW-+-%pW7Ko|8 zmN}W#P;PIJ8!>G%g$_$}hK8MIT5p;;qwxz!!+DXner=jiQr1`ge>eW2CBO2IUr@O; zw8_>_%A&gKJ#nN-dfaLAN>G%B%V?|hiWO*kVB(yDDmtFbf*;=L+kY!EM_Iqe>gft1 zp~3c&CgYO%a0VI#K|9QQBk8^>{jx0|A3r}E<@CB&8;SM!t8fp^Akfnq!{-p*=zp>r z_eN)cQdt}2O}nb3DOyN-E;xAC*9QuA@4-SDh5Lb=9X}Y0%-ZQ%WJf$XwWg$?I~=nOVwe5tF+I5}BGw0+yy2ZFT%)2o0_AFO)Z;oJ z{G~DRQydTrD_RdhZF)w77M(V{34uAJ6K}nnz5DHXL~tO}X_ky3yJ?45b;0Xg;-R!3 z)&M>FH*J3*%asMRXzxf3nS35mN{7S5S2nunlje&uY*wxK}N;TPd54gXY)JHVUYYF-24s`Og_MNLD=G~z% ztirjS%F1!m!9>LJtj5K?&mo5k{PYyLJCKmwmd&z5gnhS|d8gpts(WRxMXFJO%!Jd4 z`pH-gbjA~iA{SQ=M!_&7ED3p6BueK^gK_7R>C!!m6cst9>hIS%;n_F0*{i5u0p$f| zguF5E5%zzEPtxm*VIl{5J-#gr{>W2XhlQL!eAD0@$XVqS;CD+66 zWKWA(Qbd&^5n{ww?xg~<;w1k>c~{{1)c=FNzUj$6B|$1-bWBHwOzOoGNl8p$LdnQT zq0)~+kL9#@sN2>ZHj+|dUQ9lt1-W3twoTQ^*OT+1)Q@Ahax&3an}}2#)%9( zd@PxF-c83@kG$#R6c?SFf$IJ7X7)Zz+^;oGn6^jp*rlRZU1cI{1S z8vJbUbfFi;x5X#>v2CueXp=GS)`9EQt36ue_*LgA*4V9(*Ww%fXe_7i^(V=GQw(8m zOsj!eU?f2Q{@%lYi)9}%sE^!uj;62dH+DTv3*aU9g4Mj>tn+iu&@Qv!+FSiFYrqxh zgx(VeMqdB?iG6tcV5o+Qo;>6CaItyYraf+|q_oE5g<$F#Uwe)bx}ghv!_Y+cB+qpB z8}T7|^ve6F)ZX-Q12j{8-+Hu_MWnUx?v6gFGv zXWjKunvd}(<#wU0AO}Mg2#s1#m#eh^pyyh^m`u{AFV-IdS~5_5 zvZDr4<+)|uuqT%x1KOuZr>o&vfN#Ct*(vAairD7NhI8f1yR$K0DK-oMB>6&bS@6|b zJJ$seu6CgvGv33^`x-MSAkn^sQcaIWwcc3+@RFQN;ji`Z;KJASIWF4WrykvvwisP? z8JK-G?FhbvkC5_UPI6_T#@7PaNNVY~AbQVqDdpJ73#o=VQ8k)(%N-!u7bktCjJA`C z`rsCx)5fv}&!zt6)3IS~w3mbwzN-*K$iog`H}HN+k)Qc(x@3`$=cQ`P%fumi=KP#^ z7uS#8*k>(x9ipfr>FYl)Ow-mALlPQa(@Otw!*`dqCF+FD!$Y@?8^D9yh&)#&#z~ZZ zWQ^9m?t6M~Fh9#e`z!fORzE`X`Z~c@V*!=liiD)D$`%k{E?{sGow8_=b^?v(fLKqm zM6@9st{`jjc_icjpo@~_LV-Df9}MR;5}#m>XbV|!B+-SzVlDb#^s zoRCR}Oxy<4D6sLJu&}Tinp|bjeLxPulOCV`YoU<|)And2t?{vTVJa(v08D!~aF|}f z(4_Ejzz-wu1(xqSyMxGlf%LWBx`<)`eW=(kjWt)IDrVIE82YzL@N+3 z?er}v<@F1WC1y8DRlQe%4u&>1@&4AH3}2CPmxj%_&h#^%O%Lw3pK{hqi1->5&81wW z>LdFWoNJ918I|AHM!=n7+4q#so)AidsoIwA>6ul1p~5}&6o4& ztvJr-?!HNv*J_1{`jM+smEHb~lY6uP%0q;-zWSHQC`|idL+voHwWl77sDQYJj;plW zew|Ij=kSN2Ng(kTn%}<7rP}u`BBe+PyF`G<+136P8<3V99s$s2yVH%j^YLRx$zDlL zR=-667a=w2cJl3m)&0=!qjK{0eqiG6&XdYD^zq6q&fV&K?EMk<>ZNbFcCcdRax>HB zc%+z^m|hYES7|^@f5eyRkbsv_{=JLvxjdmPuL)?NKb&8bqi%}{mH1ZwdcUu)o^}wf z)4++dB1=L;PV}a4o}z7+f-Ncvz6g2iwQ1ttwyn-nsSc<2prU!#;x^^6Ljr`UKDxpn zW+HDzGF@V62(W2jc5}3IjX&teQwrzfuk)i?<|$dC<)>y47bp%I*vtOm7`8XA;&6a}-P$3uKuFBp*v4H8TOj zm>u{@A}O5Ja+bNG#*7(t^;z#y=H7e~yW40u^Yk%&S8>{ij`0CUwm)k#{9F+*o&<3@ zJhHs3pt@p=GdKme{l<}(#6TAaRk<)vGxhN~il(JNmUc{Cl_Tdydqin=c6Ts?fg{d^ z1~gK2VQ}T@H-y;gUudD9T&A+Hf;o_dt`;61=Pzt(vxWR_o1?u@CbmE1KK;pwc6|tG zY<-0np@&6TeqQA{q2j>=6X7Nkq{LLv5lqeHIlK@@+-&q7MgkHHGpf@{*FP9GDDwKL zv7N>%!8(g^grbl6VOgGaQQOBAl&8-XfrfnsvKw^kH!QmNbe zo*kFF%9nemym`7Afu|z0gcK4FMz`&4O7h69Vusa0!$>lwVdWt0a?`v@gc)d+{HD*U zNS1ht4&NjeloyIl}>C?;^*We0OGO-ZJSr^7jWtki6WMW-;{fkTI}TQ zs6s3b##Zw8zRe3hXA#xe62M(?5Aa#_Imj5)5Q5EDNd{OT+}+JboP!h#Z#UGOb$Yx! zchC7bT%U!Sas(0TXpyr$kK^nLHCitXQ7l=k0KCzXTb3j^#$#JY;&ecZU{>NHaRU#Ns`sS)o?dZfZyZe(ZUDshTk8+OYd zWW(D15cyzi$ijf1m%`eFgF*f-+}d9EU~ksBLtJLn&*yTW*nN=4W!q%FSWmk<`1iF5 z#!dyzz%gj=xx*>~p0Qeh{@pI4_+9HQ8_^jyE-nVGheL@bI(nedri`PbzvtBqO33+e zSzpDh`qgQQKh|!wMMjxK%MsfIseUsO<;Qzfx!!uqDN>n$?bf<>eSoy$2KUX?p%7_fHFcRrqJxTQ0K>m z&gOlvsCmq`#{lQ*eTbjm;j-Y$gBc-gSkCHk5xgw870?gcmIh1C{5vFN5iXgYjYl0n zEo70CY%i|$e~bEUY_G@cUVtfv%__fq`yUp7w4gk(PzlqpTWSj4Zy1B$C?A`qQq}RW za9c~y&#Bz1e=92>;&nd08mzGDm@(NoCLAxM*={b}?R^5eM8qDC3bWvD;@w(#U7=fL z?t3kiE9WwakAKp7>C_@GQsV=vN2FI6^fPVNi}Dd@BVB=CeqnWLQ-p9u<4gVUN1mfK{ok9@5_pQ$gFB+ z5sxrn4($RxF9i6HDC+Rp^NQI4enARexel#ACs*B|TS5q^#o-%CFUr9|P6rKDL^PP+-$9`-sM$LJ)Fr|MkY6= ztL+74FFq9ZEaAyxOnL5Eqt_^J*j!bwI|?>aF@kw^57+fZFN{bxw>sb86pn9zYp^Hb zNvhf&TUw(D^YAPog@%jhpzkg%_GJOfh~?HzVdS*6u80Uwr->&(PDw+5bRDNbXG9~h z2k2Rx^ktUbi4n8!lrJ5^N#9k=!pTz7Iu0=4QB-TQ=34PWsVvfOw`~HmGLZ=tKJ#=( zTMqZG=A*t-%OZ}JCdX{16CtzZ1!ktRBS3+Bx8vTdm4o}qtih;OW#=Zlal~y9_9r6< zy-v(sZLKw}-c16hvw+xCI%YQ~enc3};faa8c)7+0oFgWdB^q}E$oDsI8i84c$mz!M z8@BX(UXIDg=#{(beIsXw9kLNQtG)*~>5d_;@pcOGBHal!p#`+cuRree6WdVLhOoSm zAX<;MTb{fBq^m83TCf;A4Q#+y6fw0Fe*4V4MoOq5nq=o&2lu<-`1FQyQ#r@i(2?6k zsg1fV-$gB_lw|1K+4O|0Ex)?G=6k^NKPiTi%vvNb%-H;>th|qzrZw0j0hpo9sO{!Z z@U$l{ele$esu8~*6L-v!($xVd+Ui->n3kUr<8qKg@aqDfT!Gix%G}~_U#MIT@#Hs7 z4U%sEYGV~=)|RP{`Oc|G>hfUn*rz+G2<+*I|*DHx|rrRAFs?+1z>404#wUAvma@HC51yvTZG!vBQ zX_8)PdLY5kzD(9Wk`S#Zzn@$z!){Ic3B_sh8Js+NV5D?FK^605Iwv_vRN5UG?iDDF6JV|fKZcK;l}b%N|mjKzSb<=hNDx#Rb6>(yHQ_KClI|&@$7&oWrGx5O2ka zxGJh`RN~C}R!MRb6#QThcNA}SR)94|P;voQ!L2N$Cq37g%S}z?2?87n( z;){#v1Zkx{2@+hrJIj8G4}{nM!J^%pyg^hztv2p#>$Ak>6x6&x)IO6rHCk^k=lwQt7QX3zDabQB zWX8>cQ?DMTj;tsIug_iq6YcM2ns#qQWW$1rKWsRl|Inv|wR$c6CisKZ_9%zIN9)Q4 zEo8I6`SAR_joGlTooJS?6K;!YgI{cc67?OCCsa|-3VMebH@zXxu%GP+*Tilp0z}Es z(ENeb{0TKcK1-_7(RYc!{gB{mbVH*u_RfJwA_hrEP74{g41E8_KrY#+48k#G^b3eZ zz%^Y+p=Akht}EDV0hz{M+e>it;iPInB0SlXeZg^=N~^{5l)Dp3Wow^tlHTr9n1;aP z*I}$mh;`gA7z{#}MHBAkcpI7!D%T6to5*4&>+TNg3f&<05*;*>|4fYw`dBqiG~<-l zHQ32n!va%(YTK&)knJ2`c$a`CaW_=z0B_z9M=90E6yTrT>DL(BgnZL_a6@7jEp4sf zojawhS|0(6<1ZXkG*Xu{J*qD%l5HUCHJQpQE>&}SC#boNpni|Opi!h{S1hEcppV< z#M0dvypfSXn{A~ocsnArEUwig_oci>V~vuuGkd{rMnoj?b?fdRW7N-a)m(AMyCCR` zunLZ(uAc7DB&M(q`^E4GO`TUS1DLNvuir==Kauo=f}UmVY{h;y1mrI{D95i&oDqKb z5~oK`x3Du%B`Eu@S=t+}hvy&KhDC#S-yYpV(UWgMfmpjJ@>E>bfR@bCWa?tR&F$Cm zdUiY0jItF_7DJ~(MlJc@hX>PIrxe&AK#*AHoHXG13p@>bEj7N$?@h$$QIIiQ3O8h z(e8Oy-Ot5m*I??mxwQ{@283?_6^y{1{# z#FPXEBsCdcxl`|qtU7~j4m*u}OuBra^i1o6OKSal$OjzS!0V)hMn=_*q|FNH!`Cr)ljO8d zp$u|WUPs>S7I)tM^NW;i= zeS;U>2O1}xT;&!YADk!fqJ1GIC4qA#qEXuB2{Ax zS2{G#tqLm?N4AG$d=NM$Wtbiq z$*Jw|JOEof1U45A$u7?7D)GJna^B09uG&Qk@fMN(#~B98mbcCwWsPOp##tUc<&W0i zrE^)iBvaZRa+&vHT?X6h*3~RLjav5;72vXwA#^p3ht5sS@U!ZY-6gG3O=qdphr-gR z>$p&ot3M4aCs;!Z%o*Ym)9nv;s+Dv1t;`9k1-*=11|qeZeJ>{_D_Yh3Vh0undfFHZ zi&jZE^lDX1ju)(w<1y08YTxuRM{jzW* zx~Fr#;%!y(D*h}KOD+hA8NGV(6SkFD{|&4@wif)$TDD>~ttBweK3C%*O`tmhZGxOK)AV=}Z2J0eHh zN5W2;0ViMvNBu9p9>Wka)S`B+xnyrK8*NR6K1%+Am{)tJ+OpgmGyCz`D3( z%T9-`%B#zRwetqu z>NiceG{(uu<%<&2wur*FI9WD}@_+~RK2f-d!h6a}#Dw4rq%NC1qBr53K#v+aA|%#M z8;uObcl=)EjteGvX|Y6jF~(`{XFv%;w(GA(K zT#A?tOq4}a(aFl&lnbir_AaMe9X^(Q6&HTIFaAoW8DTkj{+a_Xq2-m?M zHI4e9ug@evdTbN=ABu9i-q-D1N~3BOdc>uMjn$x*oP@KMnCt84A~*|D^fjF4{4m^L zGr<*zAPLh`e#->;FDlt5L|Z8p^%>>ii!A}ij}Na3sMbrX#PzHKlWX#i>cN1U^HxPr zXruf%r)vm?!2l7)D)5iE{!Q%pmG;h4e6Q+I$Yt~7voXrMf^RE;lLC(x?cLRBS|P!d zR717@VF7%?;ybtzKWie%ghCcT`uA0PIotZJH_BO-5zy$QD5SEtvCmYCTP^%D%RIz- zT-wUNk!Eng$&R8 zHk`pf?-aM}>!#4JTL)PA8C~52vcWg-{;Zi*9%r&3iJ)GF&>h|+SqA>!NOz{xU63R-+cY}NV|iI-q|FSRqpnW~4}6;#=& z_ZhZQ*6!tLHrRN-u+vmHIdf4ZksA+MB^%X{x8Ko93&v55m1yjFy>w>!e!bE8w0@N^ z{P$=FC|XL0omxPZ;0eg{4xHZm87x@Yq3du~pXKfEg@`L5o5W{N)5p{9@b+QKXpLaM zTI*iA-OP$WTmhswta_1G?{+IsgW&~MTNgznoC0e%1WV7~cx@F&#KbWXApPStCt|M; zO`(@F$g*OG`M6Psk@WHk-<%-ZY>uD0xA8;l3BlNq`>DyP%30Py#gjMh&JxpeREzxl z)>`_zaFPnjwP%*h(%zno7iGSO_(CH)lZNPJ$`oRQbSdk2-x4I*10@|!u9}PVzy>l> z>+2m|kvb~ba`-IP`sDz_lrUn3VK1xemY#q~-B;z_6wO}pHuJ@u0O8F^F6phGc5^ZP z@QtZ}Q`(}(;Tj^b^asj=5X>D2279jn_pZ3fr zV}5xOHjEDhbdh(Q?DD6V>fe~|B3L&U(>URh_h`OAF~5`QRaE9|+^3ln^7FmPm>85W zbRe1l(K|P{mxfY{X|&9{6$?d27vShFkpMtsj&E7l|Xk!Y{bM~a|)Sn zRBYzu73$AK#8czk8NEbksrmc`Ohn~6Cga}C1dJjC?iG^8m)#1fUI1@4 zJiTC-^&ouVyQ69u-A6pbtCiu$3k}Hl#?9}QtJXd2>)L2Z-iI07EoHXtX*ABqo3pGI zmA_ESr_lrisT}$(*NZd$1PNcW3myw3n z5s03BH0vp>@Kd{J!ytg))I+G>MX{hXRL{QWLRQa)@egNvyRhZ!<$!xf!j8EIv!`r< z4eju@^NK;54aL>=sw7(~+WRRFX#V*Y4(m^66aZ052dza3D-8SiY-SheE8G&0g9Bj6Yu1ev$_Xxt~FS1}791FEh0pgIOF*Vu) zV~wA=zjLB`Ca*;Tx0^Qz5i6LY)sM;U8nI9KC+GL-VG9kl1mFiAOPr;Ti8yLuyls?o zr`&UHP$wn^P7ANL++6UN2$xopj;u1&&Yl-W_A>=10V(h9N1ZkLepBS`!?^iHwDdHG z*PTA-j0}VjZEmE0hW!W*E=NjUP}$E!kjvA%=www13bKYZiO4ZJ-_q97A}Z}S6nC^G zA1UPj7|qRZ%8D_m$tcA4S0>&I`FK;tMDrme#{PC+WOv?n`9$SP@iLI|LQUBPhTnst(JK;{g0wDiHkUX6b5etr84S zHao>Xo%etuB?4kHnF8~}vPs#7QF&Y~cX8*@05EFbht&a@Ci$0|)|QTm6$b9W5jC!w z{siH)P#f^|b_@2|ztQjqtI8p4)ru4~tEyd&O3I4(D?Y-#`R|Ta{ycvC_(69*O84FE zS@`n?I&~Qjje+#DHlf|QT{TC08vr0m*RXsNXnwTK%F*x z(M}In8a;C9AHn@1HB_`zOi#0nnm^FnQPYVP`BrY)v<%>rKYf|u)#7kl8xdEV%tG`t zDn*Wwa}i+1r$zPJSs;D6u~`&#KMHuz?r3{ItM}2A@@DUa=5IgBVyWezE6nV$j{-CZ zNhvJTvff_Q<8JozWAqHY45fb+7^%?TPd)kWf$I_-(}|Vd-S#LT-vjXK;oQ zpCsTW{OVUPr18>mz~pMhDwS<*TiACs`kCC_YyY&C9raEjV@N9rvv&9Wfzv-q*~ypm ze32|~bAnnW$4=sUa<+#QPC&Ke%a{bDZ z{WA29N*{ks{n;-cN$Duo{}-$U3?fH#PFDi1BNWH$)jt|2 z4ZZl@rGE*{yRWw`ydh|iaT=Lb{~IMeG`B2MG`Ya^7!=I7`r^HiN7JEML^KvVV!)RZ zOu5I7M#H~6QP4N{B$q~8Vdu-;0HOl?uJW8~XnBr&QNq=q`aiThhl&(Oz~{@xlTnGv z?`Yn522_Mxc05mHh%gx0`nDY~z)&SL78;kQoev%@y^S-xcwfjQa2^{E@8SCGO;G<& zzkl?*HJWS9Cv9J)vE6mG47zsb-HK-Zgu!P`o<(SO=vI%&GMEnt%Af&ZBWQZq+dl*P zHS+zPls(RNK#6=M|5*)MW?)!&c=4!$fr-llDf9ermL!e|HxR#={@)HQHy6dOzofv-s|Rd5t3iQ@ccv=yI3TYuZ3op;NtcDgXc zw_95Djiietj;Gl81%*e8{d}|fSn?V`e$ly6&8D||;gydFf?q@bBN6}pCCvYkR@;t4 z$g2M{%v+qk$q@OV0Lz^;QImw5xf-2V@2ia*2xmW0d`MHIb2#zR*wwfDO2}BGc!fDo?p5&2{{g0VlEsiS-K#1QOc#zbt`3Spw zC$Yf7x-7&y^k;dk!?cmcVBPeU z^6jsHCK0wJH-qkKe2giPjm#B~zk`3{k`x_h$Hgy#_vd1DNaM*Z!vv;U?XvIZ7qEQM?1&w1pf#Cz!bCabEsRf!$`{1x?@9q)UmOXug@b_nYe_|Hp**Q77ymcM%l zx1YTdde7w=-F%B-Ao%)2K>2jjufQygLgWld3MJa9;WYptGnQv^oTbBt;b5f zYSr8SQ1Qe=uUZ`F!+RDBu&tMzR?&A8&-8AnVHPnHixl`Ly{CcuiSL+y5|fkgM?|HA@&j2&ige~&AV#C|)O`0-2LvYidg7l*kQUqLOrl2h-yF{b=!{Nj3bC7FDr z){lE)*6n1-^MN^+W+s-*#pkwvF@L9mX&u|tL1kLk&qNe;wD`(1olYiBNHK`P_sXLloQ!QGOx_HSSF zVY-iG=Niox1~%dB{#(FWwHa5$*&R17ji#9X&nPn%5ZA{i?32QCqR*FNEd1mvEm2^%_-hO|PVpo&F41~Q2^fu}Go?a`#GX{Sp~%;D@2_&1RTc*Q zI`MNb^DW{Uy-r>frLNeYHnt~!`egHtBdKtHJvDf7G+lUluJGQ%;>R0^GWQE|avnau zFUy-`A91)mCtt_N?s?53K~2&mX>5*(M+Z$LC1Uo~RRNV8A`|CN%#CE;X?J=-UkC?- zXHrW_pk@hLd8QUBjO+=0lhsv|CNXinBf*bMjqy_oWEW>=3yx__m}%Ha7`y0y{Sx9e zKJeTXh4DNsFR}dUiqB;;sdLl)C_3uZ8#=lm92_FcFC{vxDcaQ*f|73(-AGOg3(a>; zx@`KHoe!C<|CCyf{dy@FzC2b;Wo1R#ms9zYihUka@Dp={%+KdNzl`HjVuVdEjXrB| z&!eDbK_%W}(oefpJgv+W?4EqcZrbUB;3%&hC@e0D0EPygzQ4fZ{w|AD;w|<*DE-v zjsA$K9pD5M4E~!>PLUXO5Ml~FY+lYo1k9W$+CWq_*GA)*-sd{ zg;iRFT`>$c{hM~iGCLORdVM0)r#~SNN=qibtiBypI3uFLub~+pWK;Hdye%oY2zmny z>sbhky^ENbm2Djn-koQXBGdV$G4X!gG$4jz>V2YU35f}W^~(><1ati_(fK=y77;wJ z11B0PQUI4^H-gup9U>Cfnb*txJ=T3$VOC`otRG&Da&j&w9WdDO;?<~=ki^#r80$!u zS{5?^)zlgbwi|EV!hwHfn%w+K!C`Dj_5tmd6-BKGnH^_cL%dEaP`_xQ-%oM)%9(;n z2#^gH28)yMczcH=-}!pXal^ov^)#~sGez^=UotPP*mfiJ8n5rWBKe^;v)=K;r+O#U z>KWE@TFCt5`0L=Vvi^Hz6*K*cI!MuRhI0w>FlohBkD)&zP4n?fk}jN$p_ZL1T{FW7 zj3LEeeLw70@k*ro%MsrT^x1k9&o7RKwme`=c?-3@Z|l%&ys^nRGpZi_iNTksCutCe zl-EQCVUm6swQ30lH<{O)$Ybk^xX!+?nRk^F$)WrGVMG+OY71i}cU9=qY|+8RH)rv{ zUzwU{iX%Pc?8JHciV?Xsu(}SM3>yk4C2oI=?YLKllv<^=tf72T%)e?NAfFXqC1qs{ldgZ(17>0~=nZbtf4z83a*=EY(hlEhPu$1|iYa<#E;z`#D**e7 zx9mz9`5*v2@s?j^AuLtu!C-tB-+{yux{v|kC%9xq=F(;=!wX}sxxYxlVFJSL?zZhC zV?X%`7^MWwDga8~giMdhY>Q_fisl|X@obsA;dirXyg62n#w{>=%FuWi778JC)LRiM zHNrPy;Ai*KVLDG{xF9K5NL$OxL^~-sIXJ#3I`gzhz)*Qzhji9%W;=0J)`bvm@4RU=XCk89$(gH@aEL3 ztjS$iX0~PK-bLO?hE9E`RnMupNtQ5EZcd=R@S%7Vn)pIPdSBVf3WlM->iCDt zv9X;oE~fXzkWHO-eb198y#T}%G?bWD2)W-kH|AjALGEseuKBz1RM1@JXzQWKB~$c` z^L*IelrLw2AOM$m(uruYWkjYIG(-=a(n*o4@B4cygC3+7)Z-Bql+V!JXwzS=-Cn5l z#;}*isK_mT_g!7(FBjcReE<39!A0R6T^}UoIT#Xr44qQDT7BXv{>)O(6l*UDlI!B}4$ItGUN~O?gJ^T^u%zMriEq%{N40zT? zAJ1D?olc3^<;0^^yQal4xPT77NiXMb&AtkEz_+G0rj%g(qq>+nq}BT=SGPILEz1k{ zyr1P{a&AL9>Em?Y9J&F9PP<8x;xuToB%rASkcV@E7w@|Sp zmfD$|#E9>{G}BqF*M4OEGe0Y)bMgKrJZ;gA-#v}G#1$wUT&-=t}V{hLX2zYBu2_OY$mF`j6n_E+$}70^t@aD6-efId-! z@9!CN9+MgB- z08XBcL3qngY}(Wx|3K4@9s*4ho{;2!B%?%PDL-y9vBujC-Dd6(Q0hDJyAH?3-uTLJ?2B9-oSyUGyl=iDQ&*|j?D0vevarCswTVe`Kk4jRe@fLJ@zw~tun zCnIn0XPx%q=HqiaOni6bJU$ipCwqhp5J8lps(P%m8ktJ^jV6Zm6bDlCkq&+)FaXkBi z*~U!P%onHfzGI8zcBDSCq{KMV*N%8U-j$T*GeS}t z`xSI(RbFi2SV}jNN9TFz`U4MRpeYY?5m%%`Rpk#`rw@M$&aa# zN}4y|^rmA{%3Y14-}O`_xO*Osfdw5PvDqTW`f-}R|6u{PeM4!Ghiw?M`byf(PTHO5 z82zK8PYK-4#We?_PFI>6jLRP?_}S9@MpozDvbeCNq*F_@7$1Ofvk^`iq#a>(RL(x| zn?2Pg@$SgCF-kdcPT8-zltgWrgP1EUOqW2hIpMGJtX13v!qC45O2^+B+@Tl0J_YB%Br*|9uHzmSCgbPojO$dY;>g9MGkbZ`(&KX z`kv1f z0{rVGw(9$>OFd4SzjHY;ZEyDx>&u1QSoiky{0<5{dOA-hhTYnht8cZA*+$&^smd_z z>Vio@Bxn3j0w>+8VXfab?yjn?eqo9^l#0xXGTHZ+{4n9QQ0IZcTLvkWdIC<-y!*?V4LpCpJau5wfP$M;=qhzW)KH z-2p1k;2%AvR)b-H#(VyQhuXQz^VMLiKAM=mOf3hpZ=@F5wL4)r1=;6B#r2G>KJRP) z$mLz%X$e#|UBNec^G|@6PT;1T!jeL;W{y)u&2Ttj50kXXM0|YB6iG^wU*ba)P5;Rh zw&KGnF}{?m!>!hB;0C?|t zdYI%qg|DW@8#&C*3Ob}2JHH^Q!uUYZA4g5<%Nixd{P#B!Yu^KQ%=v9ATs?I=;>fZ<%j{ykYSlW?CS{)V&upFe(Fd%!*Ef%L!WmACtf_+@^`7|E)L`y3|Pf3IG8{-7__ z^WtxuiL#s<+g&UK+}n9?uW=u7`BUeK);Vj?WyEI0WyHKqpck+$N+FyPT3!@R~-rpd1DFXJkv8eJ#il&ac0w_!;_o$&*FL9_4%v- zf8~X?^!Wi}m+KLj1ErWK72lOjT=@1gBmZ4SG$g&PG5m#QSC8#RSWwMr+LL|t;_pw^ zRs!|1AEmqKg4l;6hyNdSZ~4|%*LHhz)qxgTv_*?M6nAK$xE0rs;vNdYwJq*WaEfct z5Fl8KLvRZaq)388i%X$zuKRiJcmE4}=kq#N){(3^=Q+n5zi|?HHhVs2hU9PiR0L=; z3H?X#{ciX4zlRu?5B0wMkIIVI_4$9LSiC>??tT3CPB@sB@V^@IcfSA1vHv$;_^I4K zPX(>#*U}kbl6pCF(q_G8hHjSb3RuGsE{)Jjr%;WS$mlW!4y$Fo(4NX_`LJp`ac1Vc z_w+?=dSB>=Mq!VV{a@50yYw>ouLMUAvq3^QTP%2~y1Tt;E&q2?!>h^m->$U)wUNJ* z29x{5pK~j=X0*%=6lL{Km)~c7eTajlV;z)F#&*Dl68;fqdh@$>*qmKf^P|#E1Z9w4 zR8Zj?Af4uDSk3L3{6GysGi4CpQ0KP-cs^~-+y|r=nG8=epsTb1jtbI&k{|I7lP9zT z?<}DX8!j!+u7e^nzxSSc3IXl++UJmT;2(u`_60r~w&7;VL{cYfdn~es%O3d_zpcW? z%kVjnK>!vzhf%>Wt(KgU7o$V@sX(eyvGs$$mf`~GVP@oq8F!!2hRw>?2?~;iVn@&S zIV3&qBoz8US6g;-S=qsUEkV|vD+%!E<>~N>+8s>(oZxYLH(Pa=dXp1rLQfo*XBl-` z?qasBqg(&omT2!1t?17yYlItG=QXY(bLRPsH-BjBKV8yklc|QK6C4%nIG?)mR%Cb6 zF)P;+$0MEg-N`*+xVLbek!Wo9s>MUknT9ru`|;(MRx<%6=`Af$2lj>j1LN*b5{|!f zj_3tDR_tECXD1=hTO11l=(GqU=FYrVCQ|+$b>?A6QmWVJI++RD6ghMwF8%m&5F^==4igUOVbsv`*uqYE|nA(9Y zPfe?5=se6K%*C3ysJUM5jsTEF_7ViY8F0S?ZNuApABk9=5DNmjPC)~^N36>%n2dZL zzn%0yfn<2<8sks-bINBODpb6Kuc#sMrd0itr(Q&vz3JP2*2+b*N<0uZKUh}53w~P5 z+nNhja#oTl@724+m%mSkVo(kXy5mv~wa`WZ4q>Ow{s`LJu>;Ihw^4ns|Jp&J*o$VZ zqW1oIEA3LHg2{*|%d_0unf)geG23fS%=gm6Oi|+QfC@TBu0lV*YBVW}F}XL^g@jp< z%X;jIPqE=bP;RsdpB2(Oa7h?qRX|Ti_u>h?ahD$poiT1^@Sc+6_y-%xXWEqtzV5!l z=3z|J{djs`O>%1H2b9T6R*Qluc+#EcuXFX_@r5d;7t@rylj32kR=~fePQ>OIRqvzK z%$JT8^k#mSG=-C=*bLQrA9< zAlO}a7PtJT$j(}x4d~OP`v;e_K!PqM;ut3C>Z|^{c2cFWW&S7O#98x@@-acsyF0DA z092P$M>1=eSr#GN9WxU=61S~z7FxWOv*nKuHML>E;o7Fjg-GTpWHa+DkVdYA;(V11UX&||sA zhK|O@0i6@Amt1P-oYpCma*L{m&AU;UkuWULfrcQPI?U_je1L?O`n#Ev#MPXyMwiNK zGUSxbhI&fvfKIm1=45Oi$|Mza?dlG3`KukIbIHtxqW+gfF3YNIKo8-^q`3SU!!nz8 z7?Xmb(4D~9*|EH!es!Xh4>?(xX`Br_c9o5?R|3+a!Ik<(<5o-9xB}WO@_k1Ne2DAi z*qoke$s@(9-7fv*L>F@_L_k4^w6sU{e*HlWkKomc}7C0b;dCUIxgh&`8Jid?QsM*of3>xkvx4ZW>t zc8w%Zizf7@$VxuqH5Wsc6v&hLrlbO=XSwOt{i$$8E(H@tnJ1BHT!m6M1&DjrY^V}9c2AYR zL;1E&)1<+q_J^zQf7EQTCSMNDd(a`ECYbmF+7N=TWkx#dK=_#h1oN5Id3V+%GMdOe zWUOAjzrEEfV;dK22Xk^J%%#lcwi!u(kBmZ_T_$Mr$ey*wZE@R_cGTAVJyiUWcEWQY z9s9P$8Guc1s%P2-Z)K%!CKneLQ+tbnUe6R0zjG`;f%e!qPU7^+7ZDOBrn#O&S1!wyzr%ozQn$zB8sq!R&nZb*wZ994Mm1s^kqPjOUJh#S$U6OXJ(?z%4 zOsQnlg;9ql_}XqDbqQ0E;G7U=>)r5oF>>X-2F|Q=U?JvKB{&xbj*yV7VK?PW$b2|1 z&KQ8BPLCy*^jCwff$xQ;&AtCn4pj9JoOBN5l_zzUqJj)+p8-3sB?Ss9l&;41AQ7Of zGN0OybKafcG3M1|AU8>dV#_HR8wzZo7_1d(y-)QCr+p2`7lC)LDxhoYy=S;37I@+|!Eh58K2tqYZFWJ3+ zXQ5f>$}`Re6flN0><+r61=Z_y`dZPr>`r@}CJHELCT0b#MxeDiYsiP@tU)5)<{)SB zyWKh=J+u}d@HRs|_+aXaaCTN(+t;ZG`tGpL5Ex)8--jFgonKkIL`2iNs)MnaZ0}D~ zRR;H1Hl}BXpJ|N@6FW%id;W0uRg9QeV@}UJG&xZZN=1`&m>-F9gL8d5fb8bC+gN=Q zOe^78?JZ;b#G>5~56MGLW>sb~v)#$ly@im{F3lCL-stqho zBg6RcSsqINb<|HaN>65?1<9@k{P5k;=x{{)+EMTUFD{Sm8_!k2$Z?>pmvqX8v8BUQ z=ifzSS@`-~F(^og)9mdEnd42zvatH**ryN@W$Svd1HovVYAQaTDBzGrH8m_dT*yV5 zb*;a*ZiQ>6+O1mwxsjy>oP0W@GHm0glH}f^P9c9L#)eNhq!1&N3pscvpmLKNeQpu| zMtD+3+TXUVpS)&tCpnDkpft~DAP52W9M*kPl zJN+dm(FNt6<5DR$Q9B01>G(+CpT5=;RJx?QT`5)yttqQ% zoB7Gy8fq~OHN7r%eZwGGVM7s>zm(NFm3~2?#-1MuEsafJ{ z%EY>115g{vH77w)I8b_FZn8_nWY9)}I@@2qSc`n$I)-u(3w=)aSH*K6)oG*GWj>Fk zG3RmC=31Fp>tP#eI-nFP>zu~KoytN0l-2X>tk*p+77Hai83Z3=&I64y5hllrgsx_X zElFgw@;hvjH`CnHJ!DmNTaS0%>##Zx)vrhJ?97Up_dU{bNFiw&NmBwp*q1GvHD z4=p;lzGf**d~s0HPXu1V+7amRU^p8vme-hkk^Htq&O3O*L!K1wOsXB1>b;2=k-u-o z;YVCHP64alHTKAhJU9%R8ug$jB6xDLP3Y)~t#ALXI+pxthY#XlH&H5!+b5FD)Iq)8 zG%pyNo&L<6gEXw`m-|NRxu>s_GmCu+OFHJ_P3DTtp>)Ki6I{LT`6Xz{h z^2nLBa_`#l<$>CZHAZ5=Xx`fothX)s*i(;UYLfzY=WVD)ue- z5jWp8As1px>`_AJ%U~B&czSKIkfC2i%V^=JLr+H{F&Mi_uejS4XDi80o=BXGV=i}e zkw-4G8BF!Pw+GDg=@5^DDym{;iLBSf%vQxs<|r$WzB>#D?2qpJlpui$>v(j<>CV6| z^pAtiInY%j?+dQj_<)Y0u6JvK73nY~b5okTOvQ?(&?a4(2M_rR?LkVeY*r>Dax3>P zbYmcW{3f2`6A~6;(^d62ijXjKZPudU;dj=K^V^i#S+A+Ru+NI zRSu@T*(aWM^2(7 zG`$_Km6+j{n(vm5ISA+#uT!_EvvIpQi+<-D)d|_+GO2qXb)GX6yPDTXn+wDI&W15= zf<9`lh~EtO&Ai^{r>n5qFFmxj>Zu(PHa^u8^?jQGV!m4&m}lh zcV9M)NcDmg=ZhGXn(Y`Sk$r1h*^(;S(226)k`!)n>rKBlzYLNZpiI5o-pmbXIaf?6 z^Q9=WRBR~)K8qY$Wo>G0jb_*6uLh|?^fJs)!j<5CCKt_`gduynLI=3BD1zZ#6ee3G zIT6ALI&`j`bEpwUE&@{WkHj_=vIA=pKTTTxxIx``TIZLp{Knr~3m=H?t{{|_mM=A` zR6_;g2<}*h^ni`vtbJU&Xh3*JGC31ai zmP6=PuCX$L^dfZLBtYV^nFOy2w^+@LJtPcxD16gfGszhdfLnEL@28+i#T3lBk_KkI^uU zP|jo3EKVqN#N9obiG_NpoXqKt(OShe=$+4U1$axVd`vgS(nh5URWh8u6qRQ?c%Cix z_01QszS%z-1|zXzU)iIXGCb69DMu+v3BVEvGFgCfAT*4yoS|=LnyN7>>%$jGA-BEG z_HtmJOfdEmBbf6h$@y$?rZ}zJ0XQ$XJ3SDzVoSotBArD-POb^gj2C1>tB?J84ROv_ z>mNuyIxR;Hjok?$Pv2lTowIp9r86uH{~fj6s%g7ZCwgGRVaado z9Y>>pI%aeKE{=U6ad^X}f$T-*vmTWa^TtHl~N@uDB zH(lpn7_{-lN?J-vq_8r$+6Fdh214C9#y7XP1Pq^`gps(*LwzhH08JKkWqr~Q#>sSO)iMEZ z%hzA*BCy6&ZY#vpq;DMJ2YK?yGZzx2>@0Mx18C)2_td)mz|AR3g}AKxD8tbYbQ**= zr&gx2B%+bqm}wu1Kr8u zgW{1?z7_@s8WFa`V{-hbrTM7(w&@%*R4sRs=gjbcXzf$)n=CT^r1e#5L%xd)3R#3S z+bH~XzsHcLK&>561S24w5ngKEx1R*q_~1u!fT&iN6|%&JhMJN*8e#);bRe~x9sy-| zvZUYng}ZTtd)0VU2Ien3kunp(qkLZ*Y}ujwvopSYp@|{~GrNmyQq%^&avK0k+95VP zVC<@&jH?d!i?1uTmfcf;an#0*wF}GALxBk>B>kLz20(Y;T zb`JCldZ2BX<0r-XH#3$g;}uVVg@GwKtaOJO61ENgu(=(Lu``zZCQH=%VdUs$?}Nn3LGP>CZE`wMbP}2r>%L;WYcr=j@5Hd64&h;rZoBFR~K|CB4&;4UIxySDa z4fz1YBihuIjW&S#`n8b~LWuhHui}=vsHW!|2B0Tpev+I`9rC3PjWf(hWky=mx-#6B z%1}HYgkPn)Cw=$EKm62opat^v`Hho5+HTDf7k{**)5WSG0Sl#-;0 z8>DTjRc64}XcMbUhtSfxa$HQ=6L5g}_>Q!K7cD?@RFl2ismM;qPYFU%+{)kw@-vRU zSxCrs%p}F0xsVGgMURA9%-F=0{?#rJ-hJ6x(7vcO=@gp2$@Qe{VJY=(kF$-{x#4u8 z0rC>Qo!BR!VuU82oh>M~zhJG2%H zMXH5Fp>9%3SKMmBz0pPDhLU_h>~;@o@sT9sKN*R0TzuvN{5kBCmaB_KnjO1+QOV_M z(R+Rp(-;2~wiI;ty4rqf%Bngr(fPoA`oyzEyTKEg%_X@TR1q6E1#R9;qR!egOB%fJ zrY$HG-b;Vh42IN3<<>qbVQ{N5M8Z@9oh!w1_Rh?}VGU_9+2icvIHONikHHXNv0-eZ zrnTnN+{G-uTGqJ?N8}5_R?g9fC7FSQG;-&W2d>Z#1#vkAX-5s)#x9BN?c%uA4TIb2 z>!u;<4Rwe1BNX?qe0~|ijLHpLXqSR~Q{U4ZeJ<~ip z)~NISEZ0pIG~e&U9B4$(#-PG?{CV?(HvV`HE5X=#^e?BcD~IcH*pfr_v`$QCAw$@( zD~Z1_Hk6Id+AdGU@YD$({XU>clQW)RYrBcoP$IlYFn^fD*s(i%3?NpULE|(XDST%MGFdNU^ZF6oGL%H?~epa@8E(E<%P*}&-%IRn|gOQ zA5+uiS1)cOaXD{6o#$q?3j^d4y`?t1hV->J3vScRhJ@nR1#}up#NKDTI-D%0fvaT- zY67CHogV_%e-R#3C6g#@l5C@3-lrKQl6fYA046LxL_PIt`1erFoWr>n2t|cC@S_|F z8fZ1Y5E0?c+1)uP>2^l3-q>WYYks=37{BgI5P~&Grs~)ueLQLDGLV^k;#?P-`ahbPra*U-5vy2Dv<2E!gDMtCH%v%g* z9&Yp8WRiX!FWwV6l$35Pr)<5Fj<9y>qxP1?jVAz`jV&x!T6#_3$o0E?di82n-;C%S zz0@%6yS+0lH}@32TwnO5IT^^=_<9zXQA(zOP* ze9GROY9|SE5N)9L-HdL$+vl>LXIhI0r_0k!-M@FY8_sr84RHyzx_JgZ*~vItr%bZQ*GHXp6Kf@15LqDSr1K_qgU6cP zml89cX$2?X^#7~lkj;-zDA-&^o;XOLl&+k!Qug3AESckf-c)v;2i!=y0!12ss5%!q zH^tIAM33Gb4q7;l>;DCR$vZf4p6x$+52$Q<#wOgikdK?A;U3ZYBhL(5&UdzU5W9kB z1L*1vys|^D*!$`t?hgIBlIm>ZdbFL&Q{(IU3D(t!U+@GjR^zRlz^`D}Tq#3i&2z2i z6y)U1i&V-ZA6Em7G^T2{b_mP%R=NTZ9bp0W$}Qad9Qr~k4ms50YNek}Hn*IvJ92xP z6n$}eyjFAnkoVFJRkuP6C1AUY<2mB=kesARNcEGOkrp3C*iAcBw^l-kzwBr0ykOZl zP~0#uN%};)5K}d$Sq>b7o=hE_|VCU92M)Tb?E`E<)67fx@~2b6XCk zm)I7(*|qhwg7tEs7xM3x1Q^PS1g+}_OQx&DrK7m{fBl}?MX6SlbvBE;i8SM^7@u1S zU((Z;eFUlF&W#J&c^q%qpYfo*dWw|2awj>_7RH`=8Dpb@>iy zzcs`&LIhx1`L8fflgF*!>H7cpIxaX<|Nq_>Pl|EX#J`_Ec>k{+vH!nd1NcAB_`QIF zv2no~VI!0cN|H^vn)^RJCsGKXKHdBjBA)Z{7zlck-(&oF((?P|rC3v4z;)D^wa|xu zzL@d)V+VmBK0N>5HWewB-GAO4yzfg(0#q_|h!^Lre4j!> zDjr&VdGOt~(ZT-bxHj;TgJdkhY_;%^M#~**UP2qq2kwI_se=H#_PDyn!4}de$hbu(1Dlgg>JYtZ5 z*V4)V^Y}}-%JT|eYyCSYPCMxFvNdQPeE-i)@tR5T+mwGPEN}b^ePK=i>mUJf5kZvx zz5c;v9{sRGfHOBcd*uKATJNLI9fM>$wo;;48hK9}QYYM$;Pke1PH4)4+C&fQqB1%~DI;^{LZweS;nzWhCux^gJZuPB3XaUd*3&ohD0-kDF`AkFR!Vhy|MZZ zIcv=R2@L<@Nm*Hi$HyH*hwpyb1?f_K(9?T;9rmzy9;Ksi$p`*6O)_=Mg(u=6tT*%e z`r&2uYdkNDC{rhwBc?b&G_S4FSLtpXJ~tD>JDr?A8`4I)9~KcV)3lf=OrpBZbeWpZ zxOVgJ8KXJ7salLoM1 znr$-hF*!>c!M1LiB=fodh}2T5$FNlx%b5w2R)%NYOsjSN&b1z3j4km^)#=&ot7K)g zrN?eg;FZpv21GOQ`e^#`p<+vle_x{7Vx~69mO*C&9}5E+iuXJ1SG@U$vT}@C-%Rx8 zv_b&UG628gv$$f54<%l~`l9nCyVExP^Fec7TxJ`<)>TEjN1n4^Ncw10gCCRGJaz=c z+o*zq;8J>Jl~wFcu-q>{uH_>HFtsD)icKH#(s<)e1AZwg|7k700}W^?uXf1h-piol zlVi8#Vpe16{&CGjUReQphnS1LPd>H{N#EK>szmX7&C*KhxN?!$ny3=ZG8-$Ln z7#b|sCm=VD)U0IM%ecDVZSO(xcPe>?OzBiDR8`i$5@d2>?e#zp9jFPfG;D<>x2KwKgLU4wBuc%$8@|KG^(Oq{;-c! zg8Vqrq=zLu<@NP72-{3p<+#&W?GkhDgfxl+)&0Y3NYSEX9L~f6ZraleW+wb+GDI^6 zONl6Zt}_zsj0mkJ+}YY`Exel3lrd_s+?g|tcn(4fbuy@!KU3;e({YbEKl%ri7K8Mdr&34uM`l7_%^XjA3ZrI)IA^%sQ=Q{9ryB*PtwBfgws}OJyNF6F;W*A@ zKkldqCBmVH5 zWV*!Vj=MQ)wQs80|I{^gg_CiNIyaz-ZONLREid@1XdfIPIIbMOS&WAR&T7sQ*h~43 z3i^EK4#q1$obeSWEiLD&Pat#(w5gYhFf9v{A@1@@fmUeMr9Z#eVH}Na~C?+A&8r=mO^aC`KHv~<9mf=#o`12{-9vK5&o<4wSM2y-9D%EH zYIH?K;hfc(#L22WLpd5-%ohwQqYK$b<|%>QXGS^S&N-+@%n9N=<3>5v$_UeYsm597 zQt=J9mju73WLha!2~5xHc)}_t-RBlGnKl=0h_I!8E6PI(#=81elH|-AX;~ejvd_+# zL9!3NgXBmzNf5)@_$DQE#oSFfo`7?LiSASyUqfS;X59SJdkoGWF1hFNRgYxNWlchV zw&rUx#XxAR!L*M4H@a_T?yRZJaNGSYD75>Cf+xIQ+3pQ0AeA#BUupIp_$3e&R~6leE!yqGjKz*2g0EENvPBx%Dk zfDp$wl0UW%t73WjsMlk-n;rH@nOOwwYzqdN(N$t5Mw@w}Hb}omO`El*(>kjerpCUX zN;?W1Ox57@6`wjKUzau3I~!8!USZcf&~((WQI?1C165nm`aGUz3bSecHY*q72S~wX(hF+)V^!t9 zTEK5T3}}l9SB#`Imwdl_UK$JU&yEwnVQxGEO)FFQeJgg8>zI!kRijlZfmgrJ1DYfF zW+ONmB{22vfIgm@DCFcej9I2=Gp%RLpiEFL0*AkLyZ9dBe;-W5AIksA-SN(J)#HQh zYWEkceB1HxQncOyT3efOj3cl_OmL0&$=ATrJx32{4byn)d;%dbBZsxX)VX4+9ON*I zRVBG>-YfO+|4rIJOy^wBcKxGYo=;>L>Iw6N+Kk=%lqdA}r_6wYL{*k#V<+)25<{!P+ww$kL9kws6Wuu-*ub%g^z8vXwzzKFP<1th@ zz9fI>%K|cl95CAO)yi`yU`pZ*es%)+z(L7l+vQ`Y=aLhC)pg(IZ^Lb1pxi1@JhPL&m4;5r{QjQVbi_mgy{nd%w4U%;#7&OlDMjNXlIJL0_TZ^q^JbIgHl|8gk zko0GE24m2sVf|z6$>RI)FwK}|uZsQL=Rr&6=8Gf5YyE|qdt3L7 zs>=Dag_3E5r1K3S&B)Aq3ucZA=9EJv64XB1Gx}i<_4DlJgVvIz{ zu*zw+V~{MCKl=0CtLrolz1-;qd%A5fFcVu3=8RTWj)c!6z!EVND7Z_p62xawosdv? zK+NVM?$H);%3sMzK(KdhOJU_u8O_z6n&WLq%Zck#^+ZuS*-&6;F`Qw?+3L#@9#loUuWZ2Lo@1<#s6@;W&af!wCsVRJdm3B=``%F6(OPD7tQ6WC(gQIFqMckS9=Sk{-?`0i2K_aSA8+-~jUI7i5T zUAWTGQEyBQ`AuI~Vv2)jT$6l^jE1p}VwcNs67`6GcI0ppm?D%0caXQ1pZ8 z`pi*A;5(S#Q?aUgUd@l;qA8hk;Emzt?4K`kuHKNt#bknq_kN~?X}v#8 zexn+M3DHs8i+c=e^F^|aar*JH<-XqxsSK}V>eHW--2P~_psj#7lRm~x+|i*&@uLaK zT)fNq9OP4*fh#{h0)Y?{93m6Hsd4kt13wsZL$oz0chxvdCU~FsLdv`x?dQAMxR*LY zb3~NRX7IrDgIGiv8!glLFr+Nm`UNQmnc}Z`?~p*iaP)lzc%5@yNu_Z%+$!A08YW~1 zjF-|GFd*@gdW0AQg4_8tGxQZ2U{-Z`+#)_Ipc8$u!U`_w&!=mx^>0_`U%b(8h zA|;wDt8nY2`E@b(r5h7YGkTWxOW4wqy2JL{n7wGb5CE&zAe~ay1GRJjJiTVYkX4;) zF+W=~$aaQDUx`TH2-VNdIZP#pY-HnmDB>}ja$>(KdF-0A_~qI!@D9n|L#>(%(D~P+#x1rXeLz5O5^c2d(6W|J7<2c0 zNjaCKwVFLMuY?YSCwE%kLuu#HV>1#VTGcjZv4o?=V6vX4FQ1VeX|ANUN2SUd8fOcZ z*RXTL%kXtTrY5PDz5|0X3}J6miY|r!{#a06U>qNvn|~Bb>ei<9ASvU}6+=Qr z`dmegwS+k@gf$WQp}>~VmI~-WD9Cd`Tv4Lotx&Y_XiCQm#($eO@^ZBnA}*_9_esyr z=SJ9Lwl!j|{W3KtNB#VOcp9Zd07>h=s&w1I)QD*pd${_#oPRVV7e~Q6eyV`gE=m-P zL~)5U&tD87H7QYxyPO`PsH$@oQ>xuM>4urs-mXmdwWT9zW~cNvNx(2TnA3hQ!2nZQ zH=DHOW7RC<-nY*L5yd3}O_>tS1@XM~EdKt&Wr{QrneT-?2giGu2;0&z-%)o)Z*a)ptM5U~e zkh62T(mee36-}#%xtuEJkWL-p+CZpcKeKYOuAsN>w0n3LtbP0AVfBE($CoHodZ|29 zV*Nv7Ev5~%+vnyFe2W+$sw^b#Wmx{e%DHQViQPlxQp{k?+0Gan1)mNpB z0phOYozC^piNOa9vpTc(RXOkT8UctAW!Eja4DD;|nzP-rPr1hv3~_tctJOWK?fc?|!UvNXliO`I-A_%2r-zy+%v?De)xS13lzl=N2U#`;whLvpN~{l$Iv`m z-I5jdwp7TfU=zl?U9Q+*YbsYd_aEVRIq7}@FU3c~rchAg8M1=O1+0HvTMWMub#3_Yc_$;-^d+vN6o2=Gj5~3? ziU%_C`U%n4%{vvqUlnjx8sa^>r=rQe&j+&1W8)qrjJ z@4|nUz2Ddoy|P%D(XUxLshqYImM^){Y@+puDVb{Y-rS<`^fHq-U!3E3BdV=d_>d<%pVegRQ6;P9hhy9=3rNz`M12T=;3~Q9gpV#Lw1l_L(UoV`f*- znXljL-uM0Neo*89wQ zJu}Zqf^q6aypyU3^K2yPpo*#roVoDwB|Y%tRh~T$W$cEjg-OtPsF!y@Cn~Mq?g;7a zbbot)V(J)NihTAZT4iV`w${5{-YWlSfxpw74;-9)93WjOIL_H}*eE6`D`>I4R)p>A zZCl^}J#=6a^xmc;9=3lI=>dPAmrB0qo!8EqIDXq5r8Vxw8zx2WzG=gG(^sXR(xN^k z+Dt9UvAmMcbkbq=Ij+LYc8oRbYy7C%>x4Qcp7>^=eS2oo{Mx*POZ?uQSMbMgWaVDU zCqp;lzDl8GBJueY<#d9Yp=u9$zNsCZrOT}CnsC#~8{hbye59H1gFcf96q#T6IU&#? zW#^h@=iUI=4f%Ja8`~E&!3hXTWqHnz+g`*Ic`Y>8Jwk?iN_q=-+qjeXmTeY4p?2C@ zOs6ZwDVe0Qa-30RWbmc01{K>=tn+kq?GIX65SW4aw&AJDh5TjCw`y!{2NT_)Pat+S zyUIJ(P~qkvBBW670GYj zfoFV+-K(jEJ>p=_#|`OSV(`W770O7^L=$s(X&JP!j~HjXED&hk$}al$Nkr<};CReF z!?^y#`>zuv2CRHvkJQQmAI4#eYlX5y5G%h7qGn3szUfSJH`@JD0B4z~S&xed_#BESbbe&Z z&@L24hI!Khb=Y^^4$&XTsMO+ZXNh- zqE`8K=7-VXkNEc)ohRvv${lchGq4;~G{iC%y8*pj`|`b*&%YL`scgnyC$`m(iJ_?d zdzoo_)Vps3S}`=xZ0dL7hh^s30QG=g|8GpBImB{#djKxE^=+~*TCJ;BG_Ds*{w`Ue z7)=QarqaZ_j588Mq1a$ zKhNK?8Igwe50d7jWi)Z>J2iIPgWd8{B)x9-Oe@iE5(_G=W;nL?4mK~}a|u@(Wht}H zvCwF%C?nR8@u{p3kd>#Cbwj_>2pp<$344~(ye%vS;#F6h?D-vYKsO8?LfboeOTX_l zZRlI6kMx#8p#@r{TU_938bZ;}rWtMhAM8XvfzW!I?#9;LQqp`H{XY473Rb=J=g*%d z?kneOyvB8fP{hGP@A6DVRrIo7Wn?78Zqvvhhap$w;vLC)F3q2Lr^W0b`oP|B8r~!r zvD&)E$$}ls|77x&z?jfXzBNa`adA(^DI_aP6+B(s9VID?i|QF(G?XH6i-xJG?XcU%ZDc0+q{xux=U9t5RGI!$nBS#WQgjHqwGqKiTE zH}Cc8K%NMq7R4@S|D$R%cMLX}Q4L~TF(l%$h--SeDsPu%0mrGFFFHyxzeWL_Uihuj>q=?7X|?$WN?qPzH+L4*~WF2>2{xNf_zF9NnixNAm@0efM?^w zji+V#a`tl9cZO3JjkCT8y=ZKIct4gxp}8m_z!bx@>t%%lvgSx%?eFe_=V(QqdUWX(o_z8V|WcBv#jTX%J~meBeBWukumROI#w~PC2DSN#TGqS zHk~(dB{Jc+`PuIAQAk__(TrN|{e)k(ZZ)_Nur{FTvP%Uc)Bt8eN5vDLY$akcY0IW= zG8$|vs@2Tpq}k*pMIk(a36g)E58#TO2c})ScNifSGEY)wAVmm&O{Dwji`?Ipuw&zt@|`sH_h#69=b;Xm7T97`yBJvg z2$^#_v)m=Jmcz;xVZ{GYF&)!-nl0+K;>n{=%-#b1a8K&R&@bf;+WgpMI1LfUvS;ek zh~#SR(3|n<$Ol(uyAxC0#mom?AXu-~mD8+$kKZ_LlhRn}LR z(0wCHU+=kzgWGa-X)_`;`=alC#!RO$6fXKD-$eR5Z?NW0B0UE#4@r&pvh+fAItM*w z{%dnk{P9D9%3ZU^jBd;Eyq>63OkdJYZGcZ8@7TE0Pui@+bWX2;DG^lFegwqYC#PfY z158NQQ9QM=g=1OaQC0$(1p4n({PDz({`-#|X$%i?#)M^s-lcb1{Z(_#3$7JGx!K3v zU)B}+lV?%r+15~gn8l<|`Y4D0WkB0>3!m!r(sqLqqNd;0&eUNM8A+sT#+OGr_FF|_ zRy$Y0;N5!0N;#*0eNgw)^P+(bC9#VI5t58BQ&ESLo(_l#lg%ldGC;*IeJQ9|_-yR( zpOQ@8w0%#&uz@7z>0>6rWF4aBGPyLQ?mKps$e-imam(JIEy#h7=APN==i#Oe<~6h7 z|Bt)3erxjmC(9(zA@ScjL&&Q^fPzRy5MJxLA!->WqQFmK)2X=u_+&DV@wK@`<@Q zw-wAjcEE&gRlZS+Irgqvc)!vzoc&NrOIfMOt{6h;s9@fa*v?dey*L;?)|&hMUYeG= ziqZo>?Dx6W%HUk%JmYH_`y#US#~V!r)1fgLtPjxNcul&bRf<6=D|2NWS|I8=kf*@5 zL#2{5*XE3#mJu>bpSLxQDfHWf-4&@m(;$-ItQJwuUpRIfhu(dx2YmThv$r<|4RQYl zvyT^<< zh^w%?7Yp<&G;+?4geY@KL|~_78h0w4s_h~5jdH7(mz@3lX8EM4!52QOh zoptE3_0A)=J(6Egw8~IBzVNk5J#i7}Qn22Ln%?iXid-6;tzEx`X@CD-)1tdwVR}&Z1`)_&I_34F9Zc9TPt%{T(IU_goPOEDEq# z$?Y89p9tezmiAWyx2*OJoe3q_rk@vrBR=r^81By@H+5puOGB$u{DWQgWIg4+C@J>k ztxzRhc-=J}QhxN%BtVH#ELZA!JXTw+BbOkmMF3KVpMJNREc`xbW8IO8lObMi6F6?# z?9>63QQl1nx|@a_eV>~>O)**Tl&i>UqqJ@FTL_dl+YCFgVoF~}n%5IDSk3HUT zH6)XFdr9Wt%AE_DL>r#FA8K^Wc~0`&;LpH`|ZZWT9f| zYrnf|+ZhbJ1skmTX(uL13$TFA&u@WU(G}$z88r>Q_dAQ%Hu|Y)O$QP*dAKS{UE(tu zTCV}5if6=l&gzP<20Hb>WkW@7ql(YgrzHe)Vk(e+hR#P}eUSKJ%2EZpmkV!}#>Fo$ zZ3hG~duGMbe^4) zKnhFmlr^tP-QSamqXLroQ&$BZjPXfgn=@+L`cJQ*3oA<~A@I(?Lsn_BFv>vBs*=GI zPwR6^IflRx-J*Wk`9xhkV1j_aO_b;P=Hhnt6ID77%jz35^+h(esSVwePug@L65h=@ zL!z^1C$PS3t-d-fzd#{|Muwtw4nSUZ{`hwl0|=TEj1t1AeAc2@*g2Ra~bEFKJC93;(3RB9ZZb!KxtMj*i))OTHy!fS-hk^A`8hin*!V2PjHSG;a zGf%Hb)tcK(&(7+_afYK0nV!#U-_s|*I<_&3YZb3#Hw>W8UjD&?QM_Iw(dOhC;^~hr zwPRtu`LWC5XvQg9OtxO?uW9bfxIgq1UQ)7dHvB+4OD|=Ws&%MCVpZKI#V}1H>uojk zkc34Lv31%%UoJIQ+lb9M^kN?rZ(0&P#*-pk$u2Qk;h>O@RGN2AT=K%jlbP|2WI`Gl z*A!Dr4jNl7(Hsk}@I`-Bdp{1TXGs$v99Oxp*XGf9#KC|hyBXR&N%I{gU6&G+9OHg7ia!`Tk7MSO=IT?W4&0W+3J5SY!mWlz zDGc7Nb&4uN#{=0}W=qS)Jrry2LkuPi%*|4g8Oi6g3Hcb!xU~oRdCDPRscXQQN%N=$ zeY7T`ixN=KYL%^%r#I)d28scbJYANA%-*U6uVZ$Cj(d%2#8dVLF~P4O zTmP#C%q8Urmsda41DNQV1R~!a)AY|zEatYytIEAu(9g?Hw88@N_*oiT$^-H{zYC(( zI)8atP;p|9`U9P(6d`c8n?;XT>*@MpL8E6^KZD9@v)>}C+k}RjPo3#= zmRtu2N4ROnk6Rb{{5+-wkJWca($H<>j1;Tt_E_+zdTBJ0B|S-+r?CmX{o$$BzE)Gc z*hl}DPY##sA(71XD z|DcLpLdVi+YVR7g(Njv#&Bxn6q?Y_?0pR~yS~a(8%AV_7OKfkO+a+&}TygmQW@;DI z*h76ut_X`-pPtgs$|gR{^M|hL^(wWTL)9Pt!0i-IlD+Jdy}KLDeFBogFg+1YS#0OY zRlin(w&UI5p*P}cA8;iTvRA1(ao#gjkCgmLW6Kp#d>Ztl4)y1DNjHEO#yo!b0 z{2EUbqKS>c!=(fn<}e^-F1VGm_kOsX3row1`Q+DWzneP;tFxNLt~C7WKOb&8rd;sq z-7QMb+QAIL*_t0X8mQi2jy3vztp{A-GLN;5cy$^(HIu1zwZ>i%Q%e!=#=t@|p~=|9 zvE$c1pV8%LcCN0xD#qFC@0gBl;-Az(&HqCA&Z}_zv~ScQ(O2@^_iphk#O3)LNjn~4 z<`y1(&bPkxF5LDr%5B2On8!ic8ehtE_r0bO(k`>Ts=uC3(~wqS2GqnbU{)H?zGCq{ z%U$w4$Im|~F~+M;xD-@30Zz4dw=Lca{hT5@czZS)g>RcajQQfdD=_o>_3VcK(O;m@ z0dK_n>1a3(i!LcE)YIB5k&7&uGMLGCM(2i>;kUe!yzRS%_vjY6WD%^g#9&NZ@lcop z$(n@gKoPUJ&&n+g-Pt+tIolgf-n3C)*!fL`pNe#WGYOtuPt#EUdNxkr_Y%ih`OSk1 za{T#YVJ4acm(-g`kq!>;_O5+wIk!yU%6Wfk`nChp_?cW}Ek5f9uRC!k6p*KOWJ4uLhSZIQyvM9lQ<~OsQJ{aO5a>!>Kv6 zn4K@Gx&0YdiHaL6wDW!nAUYzJ&&x~AWc93G1^=})7HC-Cd{yW0uMzb8+*VZxGb$NR zNL4NIz?qm`BDlwA0_yg>D_3S*(+>q)S_ENqcXrz760SgB;UhlS z>`Q~#NxM6lnN^C%QzjeM@St|sh*0uwZ#w7wvqIr75Uui&qbE-4JBFqR~T3+;_>Kd^lLI)+)q-ZdD?>{Wqz95e*9 z1;$o$0>u=1)Yr=$F%pSialEtcd;Ni#Gu#Fs~AKAlS;>OXtK-xPN+7WFL?as~M=KXv`7S0R4lmJWt3u_6+ zYx#4#8oCdB9x(i$Nt`%e_qczVc5(F~v>9fhr`qaiTagAjHk<(k@3?LJbXM^0$8Aa! zhcN_2)?KzN^;c*XL{Xb(^U^35pRfkX$D%~;XTtKD4 zQ>r8d%wyr79Fw5y7So5P7O+l_PA^kV1XI68!a$hkP}_Aaj!4NlpJuolz{t*2v_G97 z=MzcQaH@HqDF~EZ(7gQ8EUJ6em`SK?DnSm21K{-SmPj$nM&=xN?Nqdfa#r^=+AOcd zL%>1*EM7uvs<$Mk68D=qNzXp0KT(jmtaRkAfX#Dd2Y>L|$!gENcM9Wb%suX|fPYL` zIUZl=o1iU1LH-DDCekyFs1k|JEtWY@fu}CvHk)RT%cw}>CONf65*{%9%~%&175S_2 zaj3@JEX7!-R)f3AZ#_*C27h@!O6=d>xn+n2!EZjET)>q}|7T15`8<6aKkMm!KbIb= zO|8!Sl#FF1XWTHFP2x^BEUV=%OKe`G>)E5f4cATQ7SEY|BVbu~!w=ra0DYZR!`rul z(n#*njn!P|oGMB^751Zz>@KTdFF%J1Iy+n9;1`y2nmn_>HD@1cC17H@Z>ONwV>wwF zsjj?LJJQpkh2d~&G#SopcVF~(Y{7;_ZAmAVS0I`xa)&1Hb$dpODN8cFpbtm$!#Ipm zcmWIZcSd4u5j0xb_m^n zm5ih;Cw*Qik=*@V_v`P~kB;a3B|pSMtIOfyOpAFk)6;ElO0u}^ z+^d)rw|*r#a!6G?&j`?qZ`(qaAJ1FCGsX)E>+0c1T_Dh|Z{frm0H4?!5aR^zOr8x1 zc!`NgszJjzFo30poTa4sY36`o7qu2oz30Fp@F=l8u2aLD+jD5!n3YZWh1`&LfCnDc z^=t@AkqTGV{TR9p@ItjDj8>4P9jg9X=B9{C=qIr=(w9t@5hO%cC6ivvw4J|)HXEP3 z!UmoqQcJo}lpF+*CXz&tS~L;~XYVpPQ!XV1PS2&v*~^?YFf)~wHNcVEt)e~>3t7nX zEbzd|dK_kUybq)FRk}d<19J+vXB<;q#XFQZcm9bvE~2lesHDWmW`a}w6TFz0C1XLv z)>|*$Qfky=E1`AQDH`V{gH^Fr{`p*v?nG^T>)sy!HQyMrlj2y;vE1Zf3?>bV+xPtx zA_Q3NyIgxz0_b5GV8tOsbeg&|nC~E=MAiM7N@0TA%q$ga_y7}-nOP1~yjw74Va`Er z3EvxdMAU;INlY>ZVPD5t8wdF(o*Yl>(`K%Dy#Y@=DseQDFrqy6V?c?FLEs__t#H!A;_q(87rrK4HvXbVT@Al%`+vH@rh&-?)!=KBvh2iFVwY07M*Wm^Iv?@c+Nka z;0$+Wq-98CZJxPaSNCc88I9e!6d))NARy9Eh;8?AK&MvlD!?J+w%7uAYfZ0oIvphw z;eKVgE(R>_)mVl=3Az$xi8sRMrte6}Xi}kB2GVkRKc!twAJ9bEB=HFTH5UQ6w9$tp z9nICrO3(xLLWEl2wHL9cR_ewk`eq_e*-0~s>EW)(mP$z4h2i?!KHJz3p41bTxc*C1 zNI*)bcqQX(Tuh04@EygK72a##wbqy!d|Y~~t~UZ9C?SCk8pdD!UZc9LM5?-P$hix6r$R_W>mnI-L% zF|#TqB{4R7DW~zT%7*>xX%mTsh-rWLFzu2jP3Tj%H0-j(o$Eb?NGN$4V2*Zwxr=z4 z*#qTLzH(F7N~w#_NnJ=%1&=(fFwOx&VogOx>_jAMh!xBm2f~VJw_E7VK7Aa^f(2RK3vs#}iBdIP(tZxX@mw zdS~30wW+gfFEH}~A69w5lg8BVh>4k)Vah7-%UAxp({uf%Jk`S=N`N$T$nwE;pNVyk zm_FND-}dcicG8V}3kaw8DBfqd5AyfL54UE+bvLs-;}SZX$mz!ulT^&Ar?(_}-VKO- zSjg&|Lr^^iErex+Q*778Jy&I3cVO$|Pga)TwT*inb8U4&L?E99r!b;aJ;aQ_)J*(*TJqRkun9&ir^-Aasd|Q|TZktM>^Q z;HD<{zgmC@=W(e+75r^X!sZ?}JwKOb6^kUqbsHjDoe0Z{Q}v-mO!O7L_wXVP zZc+sDe65C@zwB3IPh`{KnQk4cmO7 zFPn-#{E-G|n=jRWlzDB><0@FcEbvR(wQqm#QjtL~X06`&+thmS%Hi(Y(&yzy;oK)t zqyn48vjchf#$XT{oqJS+u%`#Z{Dg-*`?`#OL$lt>r)7<-qJ~|rlOEgc)2od6rMKRa zZWmlj7BOC`29yJbBfdcfmM*xYg5Y@#~r3TIDX}J8% zRyqZPR$p)5(8$P$yYmYf_5bwXc-*%W3s*X~j93ri_Ej-Ksu-@?B}7$V4ZX{EX^v`i^0wzxX>jmD@qqiIoRg+t<9+;s*PL}MMn#|kgUTFQq~?`b z1O?F!Qq@xmZT94jX5@H%yoKBe_HS(b*Or$AwU5loMp>+^X4_5eE5(q0vs<=L((kCx zyaESVO?oGLGdICHN=RO0LD`1xo@}Y4!*gz*Yl`sS{V*I#i?akJ?#HG`RX!Ku0g@Ht zjS&5@EAClJJf`&tq=~i2d=IQ2R$v5YaM(cMbjpxaq^C?a`~ zOF0i%Uu;_Brv#catGIA`pO~{x_9Ecy)xgIJPDM{^1$ED&_B_Ed7r^&n1BrY)21#%0 zdZDi*IJwxPxU>xoLw6rYC^FpTO{D2crpT?HccSku-_1Zn6{SwcGr!3K9&DA3Y63E+ zSyIOeTKbZn{*}npg~BOukUG_TO}!HdmoGIJN83hmS;Scp(b2NX+ts7>i7h1_!KnyN zk%_7C@p;?KloZ0A*AHWf8A`?hF=$wv?nqA{Wn<-{_nxKs=H}4JeuEvu+NXe$p0(eO}nn5M(0v@l{z zOb20T=L9IKZooDs9VaVpK5Jrb@%ADo-60+k$q@F9H>aSzi1F!|8=5TjWhR!_gSj&XBQoz$(-jgG3qxf zAMv7Az2je1dN}sWQWg~=yD`@dTBdsIN&QyPfQ4s?-}kz+NmHg9{AkNQwn*rlQ@Sjj zUB~1nWbK!66gXFTFjwGg5hGeF4(W9L2p-@m^5G~%&Y|GUy3n~Cs4;VEmTixi*05C< zXt>(yCxUByBkg6Yl~TLEz3G& zcxkgA1>PKwL#$>|H7iYg%2XZG>a!org@K|a@Kg0VusQ|*|w z$CjSU$%+g}L{C^)FAs+nc~_rRhPBXvVK{+J4=|3T01i6O2QPIMuN7<4Txjf-B#XD{ zuzG7ax@J0WTMmF`cm2zU_FD-9KX|yLLm6ESm!s?uJVS|CO{ayrb{q|7?gu0`o{4kh z`oH1sQ+8*c^`Atcv-Z4184J*z1PDyg6u@yb7;o(U>Noz1xfN4H7YQqgRvVu4U+l%E z`;ps4_8+y2r-Z4$)eRy*_*SFac<9aGh5^-fL z*~Td|tu?&P&Sn5-IuRk}p!71Z%$L}a;gKBp4!0bGr+IL7`y3G38fb1IJ?F1*_mX>ISFTF=}x2YiIg&+F0VF@L1`la2Qa-=u+ne8qR_0s=S?) zdd97CF)J6W98*Ek9!=wJE~!Upz~f^Dk~Ki%LbMwmsvz$)ck{Pdgo$M2688|XHb#M* zmTK8EMdt9o^=vc4t-Ke4{;oLKj;=xUq=BJ`{9jq(%ncnTrplT~pB(%HVjSccCoS9V zOblYz9N^%ralQWjD>$=}hM6|sC;$g5%hE*t1RLvPaO9n-Qiw;HO%Ip-QstmFNg&KH z4+yxXGm4op=u8~1(nx=yp0Q(wncJEZOpPnv{8D4y?~$_fwx(QIjAc=VwGda$9}7Ml zYV9M5yG5i5*6DNP}_Ck5tL52g+(gee#1;tKTY@EigW`79tH1Szez z(qZ%@^`KJL*wp4QPLk0qFVPqjvXctQm(*G@*18N_Hv?2=6kmdC+^ed z%*iC*{<;zL9yjK0`PRKVI&$C16A={^^;^}}HUC(0K#6}^ph>+4n8Dlv}F^+C$m5=Ox@DQeiA zi+jgDWlgnJ2=#@1!HQaO8Ra;NSGYgF^$3?H^2gFNt7{c1ISg_!-w1OzwGuS{lBIh4 zLIy`66=tzt@|5WFBl=shs3+QL zRyDo&r?A3K?@US$%idz4n7?dl5$7Gxd*x#$V7iP3O}U@~GwL?G+*Pwp4{j;qCzeO7=N42@1f$h<5un3At-A38j+(z0El(#EsYx&Dd&}zf(IcmrVfa z=CBCTHz^;_vM@Ef(VitjyHSJ*2jrpPv={oRF%%d-@HAI7uvYhk}!KuA{k z-*x?g!MT;*4-lx&w|Lt&IhN^Re747<;6$&+hRKAzl@p$+I}%r`(H!Xi6jbjLGIJ{P z8#wPwzIhI}>6ln5IRLOGFKQ^N0@8a-WoHh~IucfFE(spzHk@W2Mm5Q7RxV1KX|2nh zggNwo5E`#>+#KoTq)=IZ(!Y-Eod*d=ABa0IWEsaf|-Y_B)orB z&s5-z$h3-PscT(!iSmfKoLW=2m*<^*N+0>tl7qQ^8y99e)vN5iUb1=JkzO;G#1T!d z6A+}*>m1DX-+($Hy!`{OL5Ddh;f}Vul@+)5)|<^#Iy=Qe3zZ2ID^EPn}-O@id*QFe4wGd^?ww%|)B&9Y31d*_mRvmSg>LMvV_Q1>^DfFZ+ zMk_?G1X?L-vQ`DB2c+V^xR-mXa6f7cmMipM{c#kGQL=PBNgcKXA03NiW>16-rlPNu zY}ph(t!2jB_w|xzNAR|tO`QCEB5EhJ;1GOSI%Mf6c#@4y@flRD5V&sD6ME_s+M7g}3fZKMkMLDlB( zWIi%LkuB_4$Z^id%!`Y~6UN@peCt178Cf}(dgJKs&Y-awjtmB+{dvP^jO1EMD&UpC zbxZrKr!^&Pi7fGetn*cofWezSr(DB^nAaNF5h;ge<4QFl&=*2a!rT76A?KWUUu9n` zkCZd9)$~*^fqrqn?q@ z2P%V`C@NEJtccprFm{m2Cxy7i^2oFrZ~apdTwLBs^#mkI*o{R)X}(xX5v{;j>$+ zuV3jmsf4sOs3(h}k=< zm=J44_Vm#WC4~PpaiJIVAGV^(vg_x^SZ61vjhak{`HQ3npcpARED4GF4aVn?alz?i zZtZEV3#s*%&H(WA*<*M8FIpKWr`-sIlc;o^cWVOG0i~!v=HBp%NVbsSLr1?7p!QARH;&!=-&TsNsaZm^5ej0FQUj0pnzf#j`%b*}C%v8J0%pq=%=-0#=_9eC zHo!&IN-Eso1*R$E1_wPbqYEz3#595&Dp~)A>qQvZuSbN16X4~{@?-fzf4B`lh#Fx{ zsUS;% z^ypPu?+Imc#IdiIo2J3vqTV$6K zN|dVna#>1gNR#3k<-Q+BUyhAhG!K03p?ETl+eB;}ayWZN%KX>zz0GtD z9v-i!Wn0|1f9#gw8;baW2ACf*TkTL zvLeAx8AAm6^^wVWsQQX_f3dU6PLnEIRM7KO+&s90P}9^m_^sy@&Rgg2SEVyrwZBKN zT8z;vo-u2-EVPw3E|VHR*|n}|be}m~X#KWMm{jPcD_rX9;1EW7RZp@Ld9BQTTeFDX z;qR%x3nZAkr5#V5*JKIw3OR{N9@?Rf=@S;5#7w`LnO2StL47K8P@9>M6WmYHV>~*H zRQMS^3FPXuirUvk@^YxvpyvB@eD4$Eb&tnv+*Cq7Y~Vmgsu;N-MLSRql0j?9=lHc= zAUy}KhyXoDcCde)@}}*0BDGBJjBqRHtk(3)bUA9;+KHoTx8-6N>4Sipj_Cuhj<@L! z;0>h4bxqq!*EQL^X4Wmj-M@dV4ahlJra@s3?IowEV$t;{OuNSpL=v?M>DsN>V1*tB zGVjxUyD{`snieW!*gP#gAI+cv;+Z@Lb9NB@ND z`J3QEYs14i7kY~*yrCIBvD{sAjwGH__D>?Gjg9q3{@2^qak}A-j*IVeSDta&^mUi| zX2#`?R7) z2=eBmnfmzW=yH(df#Sc9wM*mwUHZe6V~8z&^mjT01_)E|o&v_=9|i5W@5Bi`K6T(2 z!?#z)5orD%darH~E@nieu!Z=bXIdOC(}v(%%|h*KN;N}#Aoc&VaK#6H{_mbez@yI( zg#-ToM6vw8@s+skM|q9iCcLZiVYYXiE1@YHlG~`oZwi+-$h$;~h1>L9DX7uf>d-GV z*mMn}Z-d+FxXh3cW6k{cS+u6R1*bLx=@7|^JS(Dzw&^T|KxCCE(grif6ZmARL949| zM^`oE_Sy7#BRy@_1n!%=TP?YxMd={p{`0lM4CLtyjV9`gr0vj{wfByc2RAEBeI~$S zKM4Vgx~l)4mxr^H^u*=4X+r*alG2PGLKMr&*+;hlU=~#=B3#(&#SAq_CDHJI;?;8At%0w|J&-h3I1~-p((Sk zdqbNtZ`Dq6lijsJzRt%MhpkeLRpwo??^V(HXl8})Qu*Y{&VP2Gx$kpjKKf;ZuZiV7xW@T9NR#K9WcE=*flt@t?X0bTx0 zr`HsarrcpKoAu1!SPSE*JJu+9UnSN2~8XYdOM72^)1&-qc*=qkIdAhe%GZh6jFgGl01;0r6OM{nrMIFj- zX1HBanKiY=l~wuk>n`;L^8j)4_DNFbC4>1Gza6u0>IuCiNe{lDR6`=fNoSA30gf$o zI3bD3h5({vI#aq;xMoC&CQm;^zm~si&eQ7ByW{)4e5NXnVR2d-w|6-6bN`kCGadG+62WMfM8Zu79mr4UsQ1E zI!iAL(J(f=uIBRfG7>SsovIs$K(D8JgO4j*_8%h2my>|mXE|B>ytGL8*N@4FHZ_` zA%#XrpMiR1YLJt3g`>Z=elqOS&Cu+W+fNKnr3#fPVjDwpFjeB!Pcq_C#~W8wJBs2+ ztI(`G%Mo|~nss5|KkZ>EG|HjtVgkN9dNl-Cluh=g<@|BNgyy=!#Oy+8M3Hc{G5 zl#aRX{jUeJeB|8=A3djZBUINdiSP9`5|6Gi)nXGIK*Vb1M1!!GXO%D4oo*vd-(};! z^i+K3k@^|QQs#0Gj12`ZQH-XN>IB^D)g~x?oH*GUq2=^qxbfxhTT%qw{?;+;vxk}A zOF>0XT<;IABjV_%5DJCT z$OZhI?IY06ujR3He*q93908~L)u6@!tX;>P)lub-Bi2%eRaWnbrXIqWFT-%{g2RKE zWsCK-Lk}cX)!0!CKXu~4B{^THjwZR=kq`GBJ&Rja{Gv9z+>-e^p^FPJwW%JRpy1Io z&Lhfm$5@@YB9bANQ(A1tG=+XqITLl?`iVTXG_UYztj9f>Lm~xCe4fLUzQ8tQ5@=|h z;30MjBkVo~P*0r(%!g+VL^Av9eY8Xza8^);=|9R8>rV9Xj<%cc}8& zw~QJu$1hvciai+Ju_sXyZy*GRdj*8KWbg&SB2r8sH>+6cP8Fz1^XD@-d#+6O>f5vqgoceskh-Bu5&3@M2JXSyPmTFiA+?V!d*#Dzq z$A7vtX1J)uS)#!j>8K-Ske#UyP+EAFrf&aG-e(j&q(o5qQ?dfB&!8v7S{-da0U^M$ zlwHKx9VH4trnXJrd@vR6I}l;?pPlccvObk{usQ;_exs3!np3ayem*@VICE9A-n$~9 zyVU3v-m1Ppe#aDR^gW6@zsA={jq|J|aWW&Ax?YF}2flM22Dr7zni5Rbl zLG#5>Z&${4=-~!&U&)6}TAyZl1m|$s!)yiTWETV5hJeSU-Q5)Xi6-w2z5PCESRdbm z`vhvZJRaO86OZ8HD6#m{LXuoSEFw!XTF#ZJ!Vbx1x0<=jiqL4<%FlRM_{npntE?xD zH-*0<&&Ic8=NF8dQ;m1Iwyxou;GvLR`|pI491YWSu=_$dJV|f6`ruItH@*28wmbUQ zDT|O1@OE3m5ByBZrPEvCp3-Byh75M{-+FYh{N?L!1e$sATs<=NkyU#A;X`-0p-8}f z2Sv%5{MSBAi&1y0Macs~Wdut{7%X!D&-n?!DbI|bR9AMCzJi*|zIXUT{?5v+)oe@B zOVa5N9*IL9Dx^aRk29m0$=(QOuX1)AYn4;1Qt&~i(#S{@nfar<4CEzj%^qw`72*|( zh2`xqy!$n7F)Lp0CiBt?(rf7{#???dl=z#mpX$w27|rR5KCnDW!}iUaehEkcT%gv% zfB>yjDF5)=mJ}kA_E}Ot6QcFqq$n{V#`)4)aAbu^CBA3usb#aNB5Vi%Tvpn%J|it? zY~mY*zZInM($-3yHV7w6^cWBF5e%i?+_*zp{`C@&w$4@N=)>Jke%rggmH4}uF1~8D zZNRrMkU;-FUi{LtU7e5S4JDIll#{pg&$?APpB8(XLB*IY73i)YHD`21mz$&CNwtntQ#lG50ZN0A?@HFV6`S zFIodsT~KEktUbtLptcL^d2rQ^V5t`uodV3x`iW-^XHSAH@24&0cgL!qCRVCy_w}$U zd~%$y{Q%DZwPbupETZYMe==1Z354*23mRiCQ8YWMnW#(D)gcoacJG-1Oc1;)@(o%0 zhVMeHJT&4>Gt84cYkYw~ zTD`k{dO}gZlJN7@4Cw0^ri#A0&vI6lc7b2;GD99#-y!CVrlU-J4&x{tHbHwp&mzCs zAV>9zeyec0I=t3gF1G#VOuhuk%GPEpEv&1ueV*B76(Etq(47tg-nU>Co&wV&x+L3_ zpil?3IJO7E*8Bi<${|O5CJ8XqMMZZ?PtQ88OGl}hKXg;CKt;>i)U^5u;i%%!WSJ0< z0>D?Y^MkiavQou?Vh3eA`D<2RFpFbnbSadYa#7#NU^i{1nB_&&!6T_4>IeSuJMWG+bkz+{wh?b5$guJJ>w_F#D<--n`;^guXMSdy0!*jAldxo= zbi+z;Vd>F$SqM+2P;%~08(RFO`2&Y3LD~4z(9M47EO_GTkd0gDi?AgrR|Gff4TYY^ zNzy%_)?qPLaZHzB%)_%4q2~NRW~yk>1c<-cPI<()9y5_d6K}xP&^Sc7rnqAnq4vxa zo1&qrEBxyF^KfvT8C?OnFZij{gF8TK5l?^B27Fc}BUu?lT48#HZ1E2T_et{DjVjWB zAPHKKhGq9x#N0)DajEV&QAm4>l>ylsWbycYa=TsEa_Z41inH>DSgyYN2G8$QwgqrO zAu0`)22$}pNdBPIA40s%@rjk;IKecPv4MR8-m-22Drvfqg?UlKLs z(5f%h%>4tu-@70COvCVQXu|5$(wG_~bJg7h16S6L7#JJ66m0xNi!HnO?Uv>N6SYgz z*w_XIR~XHPi_97&?-?-xB8S#prkn5!ysvWb86K}w=JTcJ#^8~V*M;obXZmY=GkKFi zRu63$9AQ?vLBMK#%ca(nK36~TWM!ZLpM*c^ODUSJ;%trl^iu8x9{O=Zu}IZQJ*BYk z$Bl|NW<#IDnJD3BezH8jSby;yqM# zNW@bSGpS@LS17^Rby^9lFJkNbp2n2LmQxNOm@;9CYzhU#PFBIO#C+?I~x5Q3I66cfvz%S3HXkM(naL^T;3aikg%zBq?+r5%~n3a*E9 zqrKJQ)PrQv@{>L#wRu)`3>|(a!a^+07Njf!TtoKFhsBI#MA7Uvf+cDt3BxI*Om;$= z`dBs5R$V~DFxlzd83$!ygjGQ~`(#oy%Bqyt*n|d`cI#ghFjBfWu*;yGBQ|Js{#Jtt z!SGW*o~qqH=ybq?WvXoS{iH(wCw#levszDp{sh&thYbd-4U&qh_eHX%M>d@_J!B$_ zK0Q`cRDH@NE;^i6QK7HWv=_I2(fuy6K&`QrR;M81 z<4QDXd}SDaNyR4lkFHO#gW1lHbDnU!x^3?7sF`_Wlgwmtcu7&YqdaJ@|;~D zQ2<%0xO^pfWut93f%k-70uh+(+Z4JzujBv^W)(q=dZ7=#XW(QI6oDJu7WbNHQMIjN zIYuLCW!#^-4_D00Df<#;yLMdf#RxxcgxpdBFT$I`iuy!_iFzKPIW#&g!+)&lG~JNl zMFnq4#C508D(c^!CqMGQMhZ z84#4}7f|%+FkD!bPYM4BhhH>@Z4?!sN@}v_45f{N%ty4;l=6&Fyyt<^41wGq2aCsI zj$LUm8|VilNQWQeXh5V*W#^@pCH+aH*xEbNR`aEOv)(3Nu_Xd%S2W8nz*BfmE*XieM9vwl7h%r;j;~)gr?oOLV^yTlNabv8 zuknMB9i%_xr@LUmh=-djVdJ4s*h(jvNsTXg-{O#pJKk8OK&8}s|8Ud)X)7Q4#5G)l}GLdCt2$Wm&E`bnvDlXvw-Qrw9Fipm4 z@$tRzM&2lg(dpdF*1J=6qB#(=D}z0aDC?G|q?f^ppo&&G)nMT#0nVZsVN)8F64V^b zw)XUt!8Hqwep+F1xa#6|pypF6QCW|@;0K6vqoomKnZvCP{#3gTVC7IPY8dSgk;FJ* z31rn+tNWtjp*HM5SKzt2+(+SY&^rHChmdr`vU@INaaAyJIRnIpDtpMJi}sCQgo4#b zRas}j;Q=|*9{=>cjV%mcEyfk+a~12|<-Lh~B_J#B!%b^~+QOLaLq;<{@9w2#`YUI` z@U&(<*pbmj@OGi7nw%Sle_JiGkZodztz_-dxqVE;?GgtimmXXkST~;CDz5Wg)ibX{ zC*selm8J;dJTUBjzVQOINgMGpbJTA4>LribI%ocSVje==&tsQpNU%iC-`IEw-RjYc zmXxcf?3I#A&)Fo60am4sp$?>>J1#D^!;rU*{C6~^Vq5k@n zz2b@cv5og3$Jb#hKgq7KUh(qjJuH?wE_nIZs|bR<((~OB*}hZ! zK4y@FEZug3`Q5ya@!7+#AGe{J3Nos+G3JcyAN2fd+jF{a!#PQ#4)6x?H^mik@OgtU zjfPtTG%cvCV{@+VOKe#xheMjQ7d6XOZ;av*uA#sNhnf2;)w=-g!~%|NG6Fh=kmTd#0+o|O=8)y0sYFs&8O7x0;IC2 zyEQbRvgVGszLbKWOIO(~Q-QlLRO9sD^GHtNrgK+v8mYJ7*-j(;S*BSRNdmVW!J&Cf zi|Xop%XBZQGfiu5ijLr4eVM%7ur0+b;VrBcSE80Vw>(~Ii2 zxCOH2u0-A?eRP6|At@8__y%`L7qU_X5xX=^)AZ(;2|Uulss!i0UXo=D;=MZTR98&W zJJz%?D3+@aaI_n;fHPy(!*HGm!AqQRlPl&^RvipM6y!|rQ>Wg2<{zyfcQiS^l{uoG z#e!DKQ*WpdpBx!SlL*)MPh%I8r{UuOH>|`#=y>f43CVq4F2*2U2A)2s- z+Tm0dLZn8vDqFobIBlFIz6=GrwKPiWG> zg)Atxoe9>BLK@8jV^O@9D{(;N!&ZjEQ^>66Opu`TdpO z%`UtRDrKZ70*o(7rIu=4ltAM{lktpJEFq6-EKi?!v!!d#i_42KIOhe;VK-)~h`m>8 z*3|ztFBj+SBVADpmIkdZYrGLk6QP(7Wh#E-htgw54j#0_Wg97rg%Yi z%Gi}j7sf$1-fymU@=D&miPMIS^i^Q%`*A_%w%T!DsoX89={HVao2cm1jiuPLfIIbd z93c#n(x&;^Bz?pzv@_Ae^MmNFGpGl-=)1Uv*#w{^OfR=HnZFKiRi(%68B>lml-BMA%_g;4avaI`#CjKK_|7JX*q8P zx5LL8kn^u;dGS%h66D}MEN&lk8T@M3DfX=kQDGH3dX(6a`%XTMeWeF`(e9eL^{>et z_Q*13cS2laT>z$e4_L-SZ}G2vgs}%+!D`d6yhUno7M6_j-)o?;;zsnNa`!~HzB8_^ zYwxtWD}{3fgxK4P^rp%0y$PctjRtSKqIUIx#pO|FZ8S#|bfFwg>y>ECX>y{t&dYrQ z7;|o&y3+AQfpLSqs0{>|PT+ZVIUQD_oyO|E;&i^Gmxgb#_$li*bX2ZwI^gZX#4h~m zR|LRjA`FY>K^Hkk#1nnxhE#%z#ess!tk7pc`^Gfoy=^^SY{lJ?mSS({ST;~q2HO^O z{&{BEqk3>*zC0zj2xsNl+Hzhr^x}sPKgm$M5=sM)@)Wb0S|7_3Mn)f9a4n~T{qsD1 z_i`L^k~ac&mj&R2gPo`i3{aLe#6gtPc_jy46;5A2IyYuWBrnxVC2O3ko72b8prJQEqKejjC%WUn{$v7sh$QDKnpyK zt=T>p0H_r;{fGBIe5c!wDVqNCQ^M|pH(mj2SZI|-4O75k8PN$MJf|^yPA5)xvf)wx zYvZ~)h@%=aRruTTRl+z$4Wa+uvpl#TukOA8_r%ndRisEqPSx$93ndd>IR`g>U9`?8@6ZwWWZDwNe+vnzn z61J9_1kB{`k`wlePl7kyXSncLFPd#+g_>%O;PCOr=-QVrXv2og{Q~>K^DkP^x!MbB zXo1k|y9w`K#*fW}6RElj4nL)Lt?Uxy>Y5u&mt`zi@4cqBci*X2 z@5>7mIvFFqOlYxXO6$YVB4LYYFljLQ?X;sllml#d(q9oZPk1v`xu*Q6A9azZ&+iGI zX7_O&g3nZeKF{-t#Div91}H58dy>4bDdx6bGjE5jC^#3FB}D5D7)Fv zSbTWlt7L1}Zgu;Di$hB?Ls^i)Z1u8ImG7OCZ+lM-CH-iD z^oIl2Qjy>5LwM*Wn90I~XWti+*;RO-bFR^4!rnk80&Iu#4C?*a8IouD4;m!bMpB|# z^$h2{I`Scl6yj$fjv}5k7C|@#pK)=IC(CfOz8`@GL>^Nq z(3aOF-5iBDKganj1rV);%9H;%ea1+gE@JfN0XU+LrZUtlr1rgE{C4E+tnbd~#Bszu zu&*~U)AOgqc0gC~;2{<>5lIe18QCTfyY4Z_gOWKlZwRTgMPKM>G$F*+mL#svHWQD| zRb7I{UiF*5>1*UhWc$DFux*Rs(W(4)=MFIg{^4k6;~43k{KNnh=*fYmUqkkhm8d6S ziudt=aXXXJWA`{gK8@w?yOo7$hqiJsZzx1SSbuS~=Ax+dN+F4lA#aZNXKX5HhxhO z)t3$i9A|yMetmWp3XA&i@Y@sL@#*ev^9$h@c@)jB0lrB<-aeD@dT{4S`{1QC&GOB1#Ym}7OCQX(r@u^kgZPqMr=z@8-M6NKA)iXUQuh^Y zs@tFa$at<;`-WX_?bX{CnEz2)i1+IQ3Y37(s5-=f{`;DJ{+j6D&(HYZent8x^#QSt z45j<|fB5fT8(_Ws_D|l!UrVoFIDP#O=Rz!eMS9NP{ny&RU)=%E$c+B^jL4D}dxpjS z-zBH_h~xS1(*J*VoqZ6qs#tO%UhEOA{;tcBy@B!*_y-SJjw62eZ9AH_Ozv~Bl~)=D zo>}}pvkeA=w<(;Y`UcTkUstT#al9 zPM1gpK^4)3K06((A;E|`MnhJzwN-|cvPgsuen>8?B6j_tu_#c(8kfV*<2;FPUH2V) zdbu=HSSn1~)MkHLGY~Hx=0hxY0=OUUuQ4^%YP+`c)jRTCB#XSbqW_fRJHb4X-E+GF zt&S>`NeJnPxh;uV6#Ek(n!Kn_AD81sQ|yl7%K=Imw}n-9=RCvuK^_{dtja9`a7zC{ zm>LuMD_=5a$OGt2y&GqWT%MC`e8=9bC&8609c$`~o*MJ=X-nZq=@82~(ZmW!2@M~( zE?`RQ!JGuc8+dZ%>YBh^hO?bX!}P4JR64~YVKmLHc^bniZAEeewraa*q!&J>QnSap zI=Z?U#bA-|gZMOM6g&aXH5{~^G)j=cF=&!opY#bkw^Xf(0PeP5Ygy@=A8HFgCE8ZevL{l0;TI|7f^vLQ`ldAV<=HcbchxV}q-nc8!#OCWNhm}< zyPRf~(#pzUhzsk)*b52lhd0U?jq3uHsT`h#^CewdKVNh6*3qWi;@NUw-o|F@1`t}% z9R}OY^LSh?sU*Wthv04rj`Een!aC?NSCRx%5!i|i3@tV-<&;W8DlLmq;KoSnQMZ3% z0U4iI(X<9C3a?X>?m5dM->j(8itdQQuy?<>6-YGe(~=sxWtF3zE=A1L<#_FsNGqjG zX_=PCW@r7NS$#nfB{!wBrK7%b6@@51Ix^Ns)K0;OULzp!&aDJd7U9c_y+)KZjQoD+1N7%n8>W)Z@^>}B z5M&R{pgX!0Y93mV-xmX)9Gi$3ju7N#CTZvx)6rSp&iJl`1qybDros{i&3UOn{FIbh zW+E*jSm`p^S@P@@GP-u(umBwdbIs8Tp=q95F)V@`DIEEV6e4?(C};a=kZaS*+vgwK zOsa;ann)DVZ6rTkrdxr4^(96zu{^zE11R3ycuw$3mW&=yqmQOe7#1H>N^g>099m76 zc)0+*w!yqfIRPQ6I;7o!xO`|)#Ct8ZXf1r%c+W(dNk)IG2* z483AeWb$<{@E=n%m#|V~@%8q(`G`-kclwJ6U>~Pq9ya6RPAGThP=5DTT%lfziQp)| za-GQ}^OdM?H=ks?M>m=i`W|MNJ*WBt=->t6Jlcz$S{?3!k07SL$dk&55oM*~rdBrP zT0g&KM^dKC#ndvjC#z?|e~;M{+`R%#9&nA!`=oHG;%M6b6z?T9v+!F)!kfGZCS&4Z zWo#gPp)|Qa!Fm3QNy?~MPtp3PGu%Vv=yEZ2`ZMDiBxspxAi+8)ah2DPY27El`gZ|NvmxyN?7KDA*p;lzCD|dboLPaGzgcmBpTw{PM@(eQ_oeFsDyLo7aT2 zj(&QF>$$Z4WU$1>NW?4vrp3IrXiR?wOL`N`^=4Q%j*d}E6zNb5-Q_>NCE$q%b4LrzGPTorY4;r@a}a4fGQ5R^R{_#wwxceR_b5Ef2 zlX3ER2pE6Vv1;|X*{fZmsoNRB5!rfui1saqZ{#$3)5ztB)3k_y21qyiT}q*G(BrAu zOTNj8R}88Qnkjqb{{F=bn)VUAlP~w-!$=q*C3KNYvNnNO>PzOUMVT7JFoU4COzl>2 zyJ+oYw$i#J^0c@&OS3F7#lBqX?hXTcG5@h$RQNKWRE)>$B(-*<<6Xp+f&Qgbl9%0t zL!X6(#e`t3elWP#CvZ>0;;GT$qa3N#00@x4m_G7R^QC8z5)Y8^kJLuH(|`;vS=kyozS)Wf50gw^EAJW zJQMg>Nn6WA6T8|t&vhRz%SfQ}-fi}QRd;|O-jOVZFaM{U+jAJ(Z6htO4-eeA-}Et= zrf^N|J=N7&*QgnDk_uCovpG3onA|qDUEhbFD zp)ISO5-M}N{Q9CLxNorFZu~Jiz52uMsc_jTHz?)iwDDo43I9%Y@i+dAMF8q6y>2j^0bq{-b2H7Ubwf#}W~@LeNJnqH5&^e@F0Q)n@%&t6ffI zF~b%t*kgmQ9G4`9pTSPB8*);}@G9T{j>k1?#V1(DYZWJ{!^Ojl)ud(>qh(6*eb-J4 zjhNsj)=GWhr#TXfxKnh~c|iLAHZrzYJc!5W`718cALcUl`Fr(8iAu}5C~(XFAdolz zK_JpxQu=orb+A(_P=)V<7cU9WDf;Tch9{R!1V%!7N6=aly_F2_Fd|@*WbCIfQ24Q8 z(Q@-I_nCP!Fuy&3=b+b0!LAWTjXakQ!c_j-kO00Ob1EmqjT<=hXOfH)aPf!|#F|-1 zlh9@S%@(#g{=*hb|1vGf6^Wlhs03o%-5UTOk_<}IN!&}=N8IFemSANn+x$v1t=P^# z-WPA^LNMOjvu2K%LKfW?EX}GjxB>V514h!6^Oh5PJoA}StL-jR?e6x8i9}+rS8|fd z!-xSNzXeAY$dsj5RacOGf;+~m5NwKDjBi~=zYTSlX_gdX)9t@QX`Me~iS+x&qih(^ zfTfiR*6bRP{2P==MC`O4T?_^5(|V%=Y#U}6W>M~!%=&ZLtI{-HrLaJ+145R4t0F}yzw*B7*cRXYIIUlUuSRwSP`e#;Q**r(%;*0ki-Rp9xQ#bz$-O zeYZcFH72tLdMT~92U!d;i6g=1G=)J+pszQg(IS-L}tz#hS#d70WS%^=^uod1^r)ZG3@G{YI{jA5c0y2tm0}WQh5-Nioplaxrch@l8{w#MtYF6A zVZq-hhQ#!VFkQM-<6?PUI$!kiJ%c{i2OvlWw^#v|CK9a7gg(HXBC-nvDmsOj@RZfe z0*7kv6uJU0ziNIuv|#4TAbdA-O~PzLR6?0dMf!;l4+E5J&Dey^qE@P1=>g75a0b`9 z)naa)e%xyQW@_>+X1|`V4~%wi!A}1dw78^Gw}LQ52hV(Qwd3q#3~h+98&&Uv~TyM}q9^oDJTe zd%}lKcN%$O(@ZrN}%M;rvWI>@f7F`pQ+)vkB$0Gk~Sqi9kD?bC~g| zI?!~-4mF8!dblv&X_<{anMtkd}y%CSsl=q9>H8})a!V9K%h z$*rOkhg~(fg7jt&$}N&J*>#18$YIZ#0PS30Rf#l&xa_l6Rie4ckvrV<7Ljp1{b2)O#I|a-9tc_ zbLQk5o2;`DOjHed6pIk$MqSdt!we)dIb~gIYvzI*hBMjs_?^*-Ou_VFy=R0dI8Pgj z#k9xadLkwnQh%6HsDV}X06dHm1uX?M0njh0a~*Hrc+N2CNFt>Kk&?*9#r0p+K7_}T zZ#$Se{sV84OK?%ui@VV{QmH{;%VOWTjWNwZt(RkYiA}pnOBN-o_IXRI8m;p_-+@&m zuNl0@|BVGG=cC)UW621H3aWIFc=Bds{{>y@iYZ*{N3iW(Q%X1b@U~BJl|EGmfc|L8QN37 z)T6`mls{6zJ+In)8l18(1g7(6?eSZ`7P&ibd=O?T#`lC3Zs4oP+lR3tRfi!uaG?qU z{}&%)z;608ewoivygt7)8@_crKVySp{_3w!&uaqee+S>C-)+WbiK}IPbfn4Y zS@KfK@5npjn)x3Q&k(K36ytQk>lug;!?ND3~5Mx-|RZYu818o2W6_mZu*GOVA&WQukY zoTfRzjE08Ubi0t!5rR>FUfSEakx9kbBI%A8C*ShQTQa?yg#hySIA1;6S0RY2_fvwi z4G3fN_>O?sI<3PbP3mfFL{hl+GzY|1fv8_c35_AQ$yPAd)-F6|(I_b~^U4o9vzh4R zuarv3_kL$MPW1|kiEVzIa3s%H!Un!Nfm+e*Hf2x1)_%2iIz6{M!VZh62#itGEdM6LBw7jr2iwDVq$7rk7sp?q0jMO!K_J%6&aFbqTJ~k&|pL+ z`8O|hDXce%!WPguY3u!{kZV1N)9kB+E;h5_a@UohOlhfta`?EaU?RYpSw7%?Yh`=e zry!lM-S)2*9y%sDHZ6$ArL`)tT|QSk@_ot5;NdGR5W6Y}8$o?tf<4<=M#IdCov#2; z+()=88GuHb<^(N{wXj+@^ceZuhKAfOxSKrevxFV>F@1 z92d|`3(-ys;@MSKLfDHnG@B~i5v{c3=FHMRzmkNQrgDJPp+-hzXsWI7Q{~z2kMu!N^?0jyN<)0uQECXEFP>nP?G(yE8GZmjRCS0}c zPt`|jy$v2XWK5X)8$p!BP%hi2+dS$qe02h@Ir}ZK$|6}RRh&SFGHR6cz#?@&nuKv3 zs7>go9aT#Nv@A0m(K!xiLHMsl1V@)V;sovDjr__sE)ua(c1ghae;qf9P1PoNQvO&B?HVn<_X^J3r3_;& zW`SVso|io0sJ?Br-~<~sZASB19jw(yHq&dU=kmhJa(cZv5a?-vwW(0D%}fHYB0?&3 zdha|Qef`ibpWDv!-PSSDrsb{4AYsO+{-kBCi1bj0yOA>Bp26jdH|#DWE_#Ko1M35A zjw9s_i_3g4Y}AAs8xM<+v{~d#`DFTZ(8*Whx>_GL4CXFIDK0olRMBVAF4fRiqF=L1DL<6$P{NI@HaB-Kd`KCO2Z69h>g|FgH|SPb=+y0)Yhp_77(xYH z{GP;$a$YQNM21ugN&zzahPgz*b^67R0^MMs6rF8Hsp_aXI?>0ZUcIj9M(wn4p;OFb zt^G_#7P^p_S+u8isO9DANo5GjanalDH`MobP);hsIXvFu!X6EWfXFVVt#}fdvpG~~^Fy6SChX1I}_3Od8w0ay2%_Co402n=zTxp0)O2WR-gadcV z$?rtDnMyK@%2Q!`s1;mKuEWLhRl1RDTqTOOwSvQ(E zIz=T(9GZ>CFf|{#!1inVL?I)?K>(GiG_cL&09<@3s<*8FuIVa4!4L(U*j?MZ5xnB{ zA|~i0#elBn&GA&@j7zSA{DLhCCE@~W?)aLt`}cD!rzA9A_&)G0C@BCZ_O}@|Auer5 zjtX@UfKSL0Cu!qi&bn@(s2GnwRZ$Yx+r`0}0+WMbE=z#(sA0Lr8$AZ3&YP_O#uUw! zW0Cx=_OWURS4D3c5Ooy4h|6R=TbenuR!{P#Dy+~snkLxw3}WM|%0&dy`R&M-tcr)8lPpOxNZL zqF4%jP@k{zbj;Bs5W>>F=s}8M#vI@hHLfpnpGIDFM6WsTUEQ)0;dY8MQX$<>Kf#>g zA9RM@3Zuy@%jhe~>&8i`2hlVcMPfIpw6K6>Y=MA525lHucO&N~#^jatMnAu{m>=|?98X)^GOv8Z7&UODoMqKz|8yj^ zw~r20w!)=WOfJYUn?FO-x<>EhdRip*EOb9ZoIv(>(7yqSG+VD_J;c1$xTwr3LMr@; z^}qf^*4%R(?AAnnkh*rNXYt#a@uCgXS&94dON+fs1cH`X8}_&S&h6{X^g4fSf&V zovNRo(tmr#_YqgTKJb$yo8YeyoDw1vj7g31VjIA2UmX+Q{O3gzVJpJed>ZcP4ZE4e zTU|yOf=ZZme5z5VpIp+PQ+pQ+Dd8o4@GHEK8-FnBe>z^g#03E*GYjTKyTX_9`E5`-cx3a z1#<#_c95oURYaC2swA3i)AElQ?%EJv5)qlxBJtBo*~N<6;cgAKy>>k(PS>iXF-I8l z&_ECGK5S3saE!Ld1(HFQXhi=JKh>9WyzmH!DHnT~9C$$(`*?#O9U9Ko9ei4iStXG9 ziPvisj!t&NIuj{V*|$GwrALQl_A6m;u~IjG2IIm8IW$X?emv5Ce@^kW^QQCF$ZQHW z02nfmNI4%=C|#J}z{P}4aA7B*o;%012sTI^6D7v62ndq}meL@PB7)cvm(A6?9xXv? z@2)S?fVLgqxDDLuM9ikuUKgnu_gRTPduNzYMe&D$0yUe$m0yn=U+e^XeY2oQR=AEr zdP6pVIvz3}z*Anc()yFLEn#w)$XaI!ykIX^mU(7lh>d%E89Mv@AB}=P+S1C-!dkQi zycXm+|d^oxeXi{jvKE{D4`Lp&1^X6qt# zb5pp^65!y!P>ZCX%G`RK8z-qGB{^r;!$#P&ig^xQbNmi+$5 zTJf{*mrI|*_-AIPbVp;&cHrv|c|DpdhzL`gr|x!?FDB(f<93esa$yg0b=TV6ae0-A zCrefPCGaTh&m)WDm)9QC3{`D|bcJSlk204wc!dXptR`2BZ1QQ_(h;#rbTSBO?&iBU z_u|=f?%z=5U2a#6S!g_?^=^W>tC?bXkYoOafUlk+d}`K$_d9|0Z&PO%&LZt* z=YjS&#+;8b0!KvIz*#0fR*h_l{JTcW(khtf%IvedTm6=x#OpUkpP=Bl*kVZw#|OS+ho=g$t6= zN825=n{>sx=gCC{d|?9n36mYnCr5UdVegrQ!){~mJ~J&_@sA`WJH5mOd7v9c<1yIg z-AaLhqS%q9pf*5Ekaa^-ZwY=77%Y|GJoGNB@r*&i_Q zY2cYH9JzMD*|@0w56kg9N+T?^jC)6}Z{~UCaIW&1{eF0D_Qiw`S;DF9-V6CeIgZc2 z`xB^Tlmr*XeB(33Xy2vtd)S>GQ>3&d8g?BE@^ScV6OA6%?9j{5PqNXM`((xC;D5H; zS(2pL6sfrkJ(#~xnHp?7wO2e|8kup;VQBNsW}{1pj?0bd-JSbgr*+n(HoJ^)6B@7M zVp$!l6C!qe%lCzltQSWzX77f9w7HUsD0{yVhywS3u#j~9RdSq?oxLi;^yp`NOpjq@ zlLo1k|0Q<53)*kKE{9KMzlW^1*CcibdQ`+Ey8CkH>KU}RZd{tZv;MB**vZD|$Tss>ipQK87?_b6O}VR-JRq3{YQ&ha1@`?@(BlHe@G)um?b$+4*GId; zc~Cccbs<&7lEAvDeYAo3jU>vk2U3QQm0AvEMUEbm4n*9xEy*;+agPR`6X5-Ym57n- zNmS&S1S{WLOGD|ZMJ(A=DVq5`Nx-Ufr+2u(pomt9Fxu{(kJ1b(GLeif4_b6i~T|8sqNs6AaIc*LoW$LhXpe-bx;NY>a(tOK0kY zK^r>UAt#=J=xEvFai$Qr)*_;rMDp(riZ+s#oYogJBa&tvMl?N0okH;m`|^w9OB-ri zm#<>;#x?8mdCxT_4ZUG8*4`q!aVCSrrh;k5p9w*&Skf+NJF|&XG~-0pJle)w?LI7ZB_psPD#ASSAR(V}ynV6$j`GKzHuaCv%$3$^ki;0N7Gj0)XZ2`ua#zXK0z~T9 zJcmk0IE9F3gRYqVUl^s><+L9fakWmZ%rsDRP~k-FvwS~bma++|cW|r-4Nyc>t;-V8 z7&}`YFsrfsB_%-W4j&7_0U59@xcInlFV)-{0cfgc3Ww-Cu%*L7%c5dk;fv%_RYE5b zd^qJHG2T>T2evic^z_0b3*8ByIhTJonsHA+uen_3KnMpe*CdsHEvE?iZX??N5Niix z=uGQ8PUCl1Xg`f?qR)<_KGF)3i^~;kYu-@&HQ>gd)pMBsO8yb2RYAax6Z3nwZq;rg zRG6b6mG>rQ$E6;5fs_&T3%V}HZ&7E`BUG~MN+gJ8#+9G}mB&Zxzf zYmu9b#A^2Gw}J6a;IdJq*o0+T7q94Lrdlg2Jsq|55m5w@xGEV?FUhKSUb&R3RB!<~ zZk^D+4WEK6UDSb%@x;)K?>0G7&C5)V>yMThJF2(z+${M$GUX~+fgJpw>&=J0q$B=U zkL%rgkp8t-lv`92Ik(VmOfu$G9f)?rma;WjuBIJmYf^TBla@70Y~9{na@iK;g%`Le zY9$Z;8U0w#04`){jGLlYd6Y3Bv}w}tukIYYKXoy?$byiN=h!PsN3ROM+YCocIPXK- zV<26(7YPY1q>rUoFA(UcIMIxcj42=y)>`eE?eN5HwB)zJy#6^-V6w7Kqwn2k_A(5;7@sb z7vz)|O33m8^rb06Zg2OB9#4x>HPQ}Vl-n`|cylTK$bQ_sZ2e*aNK3Fic+rXOt#&!yaV1G}wDY80kDCRc5~HoJLo6xSQH+)vP(qPvNj z*`9NpQzv1CjM177|AD7l0c|ZL-!xCZ_53~`kDr_2MhB>;t*+l~$a|1Bv2p*^61}+} zX}n@>*ln+BA)$tQ-dg)UeMLH?$eruZxKwV^hn~KjyonQB2X%Wscj%rWf(9?!T~O08 zkzC#U152(u!S4EyNNptoON4W7ND;FaJ2>=2UJq{(j;f5v=vOx2>|EIZ#)$EF?eICAE zN#A*oR2T=zO?S?@r3>j=aniV;EpCESaKk#{i?C6j%^3PF@2gsHZ(C};FSQhTy8SH0 zflNgw7!If1jQ%*_s+YQUJ@*{yCibDiyR-?{4j`Xy!fwTwGVGKRwl*HbqTkqT8))$9D7LLc8j1 zf2%Tc!ZOQZ@S3<5+YvH8KE)on!Iu(cm(mBuTSobn43$+4z^@gk92@guJ^P)vFY8}F zJMbwPih&-8$3Eee2LQj4Xn-0O zPRw)Cz?XX#ua>WcR%^5KD^M-WGVrzzD{LZG-P3R5fSYkSZvwmgptH&y79edD8v%71 zXm?|IZ}<6drVY&Zt5NPwurd=J1=wX|j)#v`ej1Wjv?`Y#iAXo0%f_$5uRCG3@d!~U zd*B-?(NUOCZXmp^$Z-GOPg9E>4S~|Ri`r#Ydx~-wS;lQfs`^rXo5x85emB4dQnZY+^Ic&7pS+u;gH^wC1MPSXwxd>VskO6CSKsQ+vz8O6hDb8~SuC5Ab5fP#~I zfevGjGlH$FuLaDBEPpES=h*HxrbYIn1A;=1*fBSo$mRH)MQExlrXehZpSa8ORkh>H zy+&z58}H86R|KEZ4Rg8G^aK-aoE4H1@MO|s+?v+etfCKOf2Q=0$Sw_!KO@gXs~xrRcE5~nGCyUY(UA2D z(y^dO52UY}n10*0iHQ=B^6XeIRrM4=E4(J^Kq_^Z%N)ngf@`@gK{sTU>Z)6XaCwPrUFBOKG$idOgbcAWKTy!sAt z%~BM6x~fM==yf-nGJ;`5nwL;zn$jA?47uSwWpulgiZOy}F=J1gvR2umrH4>JNcPO~ zh%CFY4yWVtyqZ!Nfm#}e(^)N%U^q^Jium8fUg*G}Iwc(shI_~Kx6ypBf?BPK%>`9$#>NAdWYT9z zjSisWYT|I}sIW8yEcuBqaR_Z|B;RSrF~ zZlqy4!xJ!p?C^4YwNaR==5NX+#X;?!fQrO0Z*zpcXmhJBZ!F7!7|oG`r5I)XQ<)~D z^qXSMnNCaIVW=*1pVKs^7!=-|1nNFKo7&Y#Zn=>d1funrgX)sD5qKdG5Fj zUl{N29~@7VxxP9VQw~~^bEXoCrmG!mHD-=Wc?`P-iS`vZ_)AU}VvCkeMb3Q(`>|Cl$(R2N%rujF6C31i_KQNCfBk;ef~uDPGrOHjttssl zvo_B4+@kYG*po2qWnm|SL-lI>V3O1d+x@|$MZ&i+3j#7>4^d2dpGw@?w0%J$2OfFF ztF@M&Yf?X3EH!=duIryhlNvaGJ;7|yFAgCu7zLVCKQVW; ztahr8D!_(gFRa^6xJnEzC~M!gKC2Ip=UJZQly4%Ij*mpvAnXsrE16w75(XnEl&AOf zGfVE$Fl2&-13k=;c6zqjh6;B=H}qTbwJDyQRQMYZGW=9OOBSRM?_hdH^VNzsx-M-0 zxT;8)0fb{%=A5S*KAkdx7BBTvGp|1ztTbLzoCStk5wl`RvRO9nAr=T!|F>oQ1MhNr)(ajsWYSuqm2(5Pu=A_uKltqAxf%W$F$$3A2(3x)4E7H(i-uHem((Wwg}HyyHJ{ayE#{p&Ezx@lleI);4XY zGZd?Vw{t}hWDjx>I*Ix>HO6iAmKvCRvc$}Da{0V3gu4|&ngsr$>$uy!5aeeFJ066< zehiTr z-hgQNpD+3g8{nL*0 zWO2rW0UwSDGT?S7O03E`X7}$g1~9B3J7mMC`Vd6X7Efwd4qg(#eSy`jSD!D2G-1|~ z23sjlh%FhH$cv5N6#EOUnQcvb_WGq7gMgf`4f#0ey2lhdOBq@7cp*GfyNFs{~{?mX0}Q=tC>5dt29u&l~-bCuY=2r}a9g!vE;u(q6|pp-<~NqDbj02oc9n zDpC2{=jUQEq?mlrIi8)uC3~~N{DHfeJcdt6@NfV_Y9_|nk~?li{^u%Vl%`{tqmaVT zk9ibzQ&VcUZ*Mubvr2xxQ?7mng%T^)oA$BDuqouBh!+ArJuG--&mdBp;7i3aF8OmM z*4gJQLCHM4M?9phZ%a#?u4|Dg%SrH%g+Ih^bY>$#cpK@2C4E`5uxyh1=ga9qN*}t2 z_C_yRVAz8$N!MnP!tp}hwSHDwCozMMhi6o{*v)z{Nz{)FE2JDq@pkT$B)5ZRksJ!! z!cmPsp{$HXG4|X~EDfE6qj6`7KJ=gd77qT&cD_BL9(LB@2TCQI8g{hCCZ{H3d{D~X zc|@pq=sd|n@W}rmckwH#iVsJvRd<=nh~DV*vP;zsyJJ)@++zLSo2BcvNfq8jb-`Hg zpe5x;)L535CcoQOm*2Q|-CWRVDUidW29aRtHHRUSP{U>$OjDD@8jIyDrc=3(u?8a{ zA0HCi#-jCEg`}XwOIr&}xMtJPsRT)U6v)h$gbC%3F*M##vHCS3|4C--_(ZekAEwTf zDT^yZ!Wk!I>4sXpc$cHB-BuyV(Gnci!&;Sv{f)LuT%V0)17`BIo_e{Hse8~?vH`RD)%mP6gG61B{PU0C|;3&CTB*96t%8#P>weG;CCvObzb)j^_eLo z++L_0N-1KdZYi5k`ZA<~tMz7te4WZ=Xp_ySxNxXFVmBBM2il(71X(1aZh5&R_rNkt z@!x!=CdwRaEr#&IdxzWobL*^l5zu5p#W=TvcVSy)b9xR7P4*WGMokLGTcW+Xl%AU6 zO>|7YMyXwBmeCvN065NNRZ;|L=ByDZ|5ej68H-y_c*==Qi>$;ZXNH`*@-Ih8zaap$t!^f#huIJX+oZOUW@4r}xM_4J~ zla$STobO%vQtAk@b0af#`aotm^rmlkzSC zA?VFik}smfZqNpM@-K?v7=3s}9)CW-ro)kBQ=iba=~YSFjvsHXb$EDbTGo@9C{)tVgccXx4G(wxa;j@a$iUoD zu|cvhown9Lxgc@m>oSX;1jV&s2&$O!pAxjiEEl3K-{k5h2WvWg)PeFOGxx|}9^NmY zRZ%+eJ|Pe0PU`c>$lB$~`eg zj^X!rbvyDMlINO5)2?O=Atz<^^;T{5}<$Yk~8g{ zJb%4Mov5UOwB@PPwkdNhVKCVw`_S15VBR}lAqw2g_pVY%rjU}XEgmyJ4ILEw;+@e~ zIvHOPZXKLn5b8WvrL(ny?U)PtWtE+1TTa zo4VzR+VdzRorF=IghBNMQXt~@J-kTr{^5X`#g6Q=b_yVFK#Z&xDf`uu_yyx)wt7dxe|X1J@2TAqs}#MeA76 zNIgu4c{IYKki|88V#f_d1?wsZO^cEE;kSNsXPhR4?^<)`Yj+WYw)A2N`|BSSf-C z``8A!`8W?myat9SbNE&3`Lr8f8f54iCYk0xTychpmfV#bjXHhk`oL_&aFR*4Wcy;Di;*qN?Gpl?F0A(}ns<5D!%8%bcpGn~ zh-kJme@k=`7i_*RSx+()c<%zB>A1SKyOGu5l4exMe71A#WmH`wei zav>)tLKIBXgZ3GZN(E9WTiCH*^S#9cU{=P@qJ;8w%S&u9KtAX81iz=swv!eeJmL0TEu&^wb2XH%NI^~uX?n2aDwm}<-crstV`|4*;`F$`~WB+JD zR?FIxJBK_fH(E=Ef0$^^$u;bt$C)-=e^uvv+|QgZ!O+x**j+^&$eCA}JsWCj2?Uuk ze0rf|yh;>4K4i`nzY$2|Dlc$}?AV+q&SrXnkBf*ioApzIu7 z87Vyp>PusakUP?c zsaLXe-5KSC)UnGP?imqwUn2sz_xf$$#Puv6S7PoT7t({s=nJmMr6{n1deH}beUq$G zuK+o#QUUJnRC{fEqL^%hCaWbR`L8<$lVi$^+tY^6(*p7t--s2-+DSv8vPy)hA6Xfc z4&{WrN!wq<|G*;j#aMtjF5P=MC>GEuSoQL=e)OzOw&6F&QBv~Ot%51T5HSf#Yr2#l z=18Qe}K;IIaFYU3tTu5*0R& zJFNvWTmUw`W|aP;6KW8wEVM&c1 zK3XpI5p_T@;F~+^-V40-54dAzS8wu-yawQR(evkQY^a1N5{$~cr=%woB5&mbE`EK!YS!5#{akQ$<)-HA(-HV z@gRC?7QS~o7Fe2=Q7`LUvCOJJ24-uUTrUMhDLpNY)BDL~ArDJ$4C@I1D!HfQR`!D9a{p|qw8z@_C z=J?7(h5q-`iCr65#0kUt74?PlCm0niCph>>Lo2MabwEg{SdzhPEZN%xnGx+L>68?&Rj8Bk{G)| zqi*O@Ct`x(swAA$(5Vcn`svY)XPHw3;My`b*_5k=AiS4BA7>l|jisMdA0UbJ^=+Pl zUh}NEfrgErhyIf_#m^2^N*>76UXxNCctrAUY*B-&@2GnsO zAqpvdjy?I{DFk)d88*h6VD2>AoRyXK<*>d-+|SX{X(Ke;EcNfb0NVGl;hp$VJANGn zm^`01ZHYR*;g4kep~o~1?i?(Db|uz0E-3VqxO8|oJ@k#b0lz<4k`_%3e^J@oC086G{Jbq;G%*i~ISRbDcw z{9#mxoRtrWqF`tTguvspyhury)LbXPrs=tbDy=_^RWc=Z2MVLb@K`GxA03X|4~fb0 zjZ^_G2aheUOD^D)mh&9TMq7WOf%E)vu>VAeLZV107!i_zv zPRi$SbQYBurkA5&Bp|*FBPhC1KRqou(c*+uF5Mf$3UKR51lQhD3nu zsd6V8jyh-cPu=|su}W=@ajRg>X}jSKIO(tip^+N(PhMCmCq%x=MH&rl`RA^JauxUk z?-dYC-Wi5iju&=_^ZY7K2Wo+i;zF6}?q>VU1<=|Lm}fw=uT)#o#%mZv4HI6rbfG#f zb#}sjQ{R=(Tq3p*mk$#e4D1v1HViqP`Ql%I?zP6OW)8Z#1p7N6;lym3_4c*__0ciB-I| zqxKInSEA^XaW%cd)Q!C52fV$Tw@pV2n$DHXq64 z*wy5ufd4&-e}90gY4+%5b2xlh^Wr?cXMlJbH+$AV?W~xtsT!msa9s^<5a(qjiD)GM zPNrWIcy*$rV{~gkWWf(oXji)lz>ncaRKQBG)SkT=DxChjBxpHJ$I-kJhZ!@?kvk8a zXZ=>GA(!BE2On`V{2{)&V%q@cd(@55WQ*`z8%1mNsubIpBJxlT!KXTnNL;{s3fIT< zDV&sXp}yTebaa=kq|xXbPFkglVt;5Y^(wOnh;09#ph=bWit|0^6Ok`z!xL|EF)=1_ z;WtNdON??=L%%*Q7q;rRwsA=Dr?h#X#q9RIuBu2SK2@s9sa+Tti2S6g6MPS?S$k{1%VB zN0iXZ!333dwq&>N272s-i6-_?%ENrzg)bWK!4h#BL30K`S)Z{L8oqBRi@n4(j}LR{ zWDl#&7Bo_*03@|4~2|V*2BtM&}?TYcl%Dw|6OBCqp5ZB_*49^k=vtA z9w?|*_C&~u!(taQEx0u084TAthqD4!RqiiGgaRNnpeesE#}FErgMAR+efu>vJ}WK|7eh9dKTYQ#eCb< zj0&^x{qpYa$VM@tuX)bP=(|E|&Btp8k*eC>XH^b~ps$eqcK5xrtXA)~r4^ccq2 zGRYZWA1bt=%Mc@vHlr*PD~NxN+22a2=x_BtUtK5AhYQO_(P@ihqmx_XKGMyNORACd zRdK%7~XtpE?+2#u!LX#fiz;}fKFGs7%-S?tWp=c z3{pTX7p4862*Ux)q*dBvI+?;D{&Bq5oly>Y5*yiHC)fEQ)vAF23c=`M-b}A9C`PXS zD4nKd9xya(YkOU6CeY&98AYSK<(V)ySHerc$?oXs(yGdjt;R+F7LS0};pw2)3>S00 zKdz3};Y&y`YN zH>LfnX#WzMMhv3kpy~AT9&wdwWeG%scR}T@oXu>m2uh-~q}+t;ZjwJZC6&JcWeue9 zIC+rwaVN>`QyvxePv#`28s1Zzo4Iz)&3b>X3JC`^kzDS&hQk?C zF%fQ+LtE1rL0+nbyX+i{Di6i}$d9WO1{JYyd_2a}HX36=u*5PB7AKIL_K%+Txu?PU z>V%XKLU#NWVE=7hr22-3NJNH~@FEFSNaWJa z_3SX*J89Y6oa}HJws=mV#y<#F0@MpTrleG}Iye?D@=z|mPZ!TVeZ*6VIUM2^&<;6N z;okjds^t1Ojm3!7laE!mkXourpT6y?2*ZaNyPZ0oD>sCOvucwy0r##bDn^qlb#vc@ zdWD-VGZDd6-u5!pfAxHE1M1q}l6!%GRx8eeCAcloK8+*z^~$GY2&pzkBr5C}cThtz zn}#`52()2Gp>fT(!-(r3IqfJ&R8@=h3(=O2)lAbEPH=1EWd?j0623_m%j+h$&3R=H zQOx^vvi+h!?wUNaN_%Zt&<&Ks#18>KW=Q;5??PS%<;aMGo84OYxs1nOF(t|di`*uM zYy_K-!jV48OaJ!4=(*1RYCWJ@0vlc=M6)5G%-l8=3avc%8sq5_8f>OJW2UJ0dP|d^ zw-i#eROPa(#M$X|)K}X(%$7p0uTdhKYWAdl7-wRavvw%8u0e_{w)l z0R5X~%7~A4O8mZ&hb8s1#-=fEd z%?lU!VmC^Qj+#VQuMWUgP*DBWf9xm^msjHjpfeU7tl^~?GO!31J(O{6ng%FZQzneG zVV%~n)(z9ige`Wu)SA#${`~2EMUpZaZ%Q{hoy#PbMN46(4X+eF-)H`gzT#F%4w2sp zE$(V4Wvyi&mom`8!glY)U(Qd^$}gpv!VG-t>{gYJ_oIJ4JAU=DU`cBv2!Swa8#=1Sj*0a&>8BDsN?wG#tpFg-{A#Nx zN|5g`h))Jw80fz;oGzU^DISYZeElW)>ZfRwy9Bilc3O6#;pL$w(vpCVFu+x z)w8ZlW4IH8y?z*zA_<!E9C-Va9--WyPr9A>}Bh9`?iBXx%`zeypX)l z_vwefN%uI);=QZ1-+9sd%H_34Fcey-OKvREWB`ZY#bB6Oex=3Y1wFq z0n5IK=u#pzmR@aGO(X?f#c*(n>_o}mdXZXIIptelHFwn@VgK|Hfa~K zKVwtKS^3S6>k8}f`{Nf;$&-9$&QL|jp{5o^_$nv)7KgC*4W>eX#9M=ml9}j9y9A73 zU%XiI+q@4N34#EcArV7*)=oOeLMI7_5MG3liR7KqY5dRRY)bZYA_{fZ?A~1O*`#=d z#8oGQ0nIWf+8wMEg!-`IKjk6|pZ_HnQITgZgRpYwKn~4*eQ3k}{%UfF;zN&;U#AJB zcBM>NlqG4kB{zEW4qqs+U@hq`@*5YUnTQS{sUHhsct5)zeTI)oSC$HQtJXq^jv`+} zR{+sZVOQTQ7jj3VrDz`aeNIu(_s>9kyC$v#`kT=*Q~VC)FG!0R(8{A|CBk7&nrZSyra(STW8=Nt~6wJb{qkx`3T2r2GC|lM4$dZP zveW2W*FJBUC_7|g6t*~|NO8n=-(|Cxz&z0xRAI@P@rSLP%G4VN{cS_G(|eQfnf)8> zWMoViLLSjs3(hqG1o6ihPxPtIwb5xa?drt{2?hsdb_9X=czk$vR^Nysso#S@nOeUd zJ8DSfYt(VEC~8RbLoFlfzH!EVotJ}4@{z18CrI9dz49F~qAbiR`m2d><8=lY3yrh#;$8pKf*Kl zw(etvTu{%OJp>hzP_n9Z@yU~cF4|#k_Mb$zIB5XP$TvPotbSO<;gX5Tq$nsv@+;i$2j+v9Oohfi3Y-*8$)wr_4OQhya*@y= z$t}f;hb-vl^Nm0JGLaWoJQgBOLz%UA)rtEMNB|@E7#?J*$Tqn?wThrZwXIQO)JJLM zra&Ass+U{G9+jCpK8|M==G%j=c*$6fq14!}SMi3;XZG<>B9>90>;v2MPimGgAB<6} zOUnA?bBSqr(e;y6wex0JW@pFE5p(vDH8od%I3GaA5wc&L6sh_Q?W!wR)-T~{vSe4# z%MGIKtr*(|lBe)eSeHjuQ2Hk#W_=-;dBlz}an;)oj_I|VI55@q4|5j$^2^uH+2_SR z6(MXtMTiyukiW&&=xf7NoloNSQ`@<61sjb0uP}1h;0BBX3M9V@(&lYpOB;ML!&U!K z5UEB}MH^Q4-6BDFtlR8?kE!h8)1(yP!=WCp#eQfgVsO^Z`TG%&I1hB6p};)JvDL5R5GWl9L+ryzk&o$0^py zg{>H*iDA(p7-U+hbyaoOpdWQ88v-tM`T#1vbZR@S`bLjdm%^xcA~-d(uYQ`&rP_|! zO0ryikcEbx+vbllT9#Bw5+@l-1=;`CjIp?DOa3!dKp30}rm>`fl+5etO-%cuvuhVN z9}CL0b=y#!3c1O_q>6-?fXagbn}cPx?Hb$TY5$T9i26hk#z15P?jdhanRkxQ&~tJ9 z#HE=XzVj8;N_;0ebKGgqt<8sQ4eS>s)(H9srm|WM-)P}thESRP5+dItTPqAd9#)zPbLFgjxdH*P+{M3=xf#iWu=d^|7asY&FSkaQF) zi6FR{i?{3--OeQWhN3rOH>gOeG@00E!gh}g={_3lprD7lse)<*oCAc6Lvgn_7*55&z3c1EAx2FQMqzi7}FePA4p8S&U+;5WU1zP3#;n6 zP*Pl-BpKRlFDE_ILg|$SC6K9?UTY2XYNo%AF!W~33SsDqRx`~lhfsIr`Mqe8m_mO% zRa7^p9u48WIM;v1d09%i9g><7!6eWox! zudPu=7rVR~ws_FQc^(BsU*WA=SerA(u+H5?pfe316zJA0ebb$2FE@zP_`}Y{%Gr!9 zJOHnCbS;)rRJ=z7Wgs=KxLh=DLC6+WL5;FwWf6BS6V?{*)(yC=9WN?<;E*iqM@zjc zsnwU$2%(ddpGFU5-+qm4tga}|{VM_Lkh_Hvp*bQOEK3#o)_EHbM|ALCIlVnF93fY9 z?aBbeTGSTXA1R*d8G}KJdNkZG3Y5(tGKp3l5`thJMqvAMc*S3TDe>pG9V=0S>wKZz zwHYs28ZAK%$3{ju=KJt@&TVi{EWWRBma{2elm8)1coDtygGHPaxsbuv2~v$>*3xGm zl|>SkgqSW8Qb$fcJDgCe`0!aLPe*^*7;&1BU+krI%bF!9NF#(eNW|YerrY3d^ z_8fgqj^1X(BqNleA1296^oS?lFJhy}Fe=ci=2b?GUchnxgtAov;^9G1i>)*)sEJcC z(`{vl!Oa36Txwo&%Y#rD5=Jt`P1G;p)MxBro0}>|P_u$46G$Y>Bqgq9^*f_fJgsO@ z=u4~Fj%R0P)&0*5{{(E1xM}}f4GMX9FKLBVsyJh*Yek#=Y zI30^4LE6bMSlDSpCKjck5Xm&F<}pcN-w~`GLKHOJ2tVXBW zrV~i14ZjT#a_Gqa!@;7+rAdMAz`^9#us%rX7y5+8N#!jPEsFMd#DaMNyvA1C)_FML999%Fz|KE;~007;8NZ$r<T z)@~o)VVnFs5c~{wVP&vFD;XgCdQTS;V(hOhq4%^StA40|CP1}k-5n{C(|LnH#$=K8 zO&j=nOkHY5uu@)i#j|d#BWp)!TZhuvRlgxHMs;;KcP@nX#hh()_FGksxc?sQAd1+v z=X!xloWNUFNs|>KKD=N3Ge%n^Qauf`q*~>&D8C$sVIq-xdsNrYv*`q!-D~-;G;_E- zswNM5M3wDfwACE-N-HYnHLVev!3@RnqM5*1}= z{DJ3=yZ&YkcZp78mDLa=KL!OwgbXQf^ewrvW4cH*V^kH`swQrAo0;3^)4J~;CL=sm zOU1je-NP<3=qPF0vrKKH!YkXPcE;dV*g%OegJ26r&GFg$MK32EI!~KaTSZuM(=^m7 z52l??HSg2oMgPgMaQn@Yq6w;hU&uDIG$z41O#O_Tj3WZC?H5o5L#TbgQ5jt%<%0{i zxbseAxr*rGy`MsIAFU(_yB_YRbPCw2@l6?skF8=Bp2&W(0wy}$SpL)(hrT!t=Jk{+ z-3g&?^o!YWOM&8TgyFex_;@6l3QY({mJX;7W1!6mIw9>&g1iX$RJ2!ko)w)XaUzz z@-4fho@SHFf?vWyn7weXt`=20UPC}59;OAM(B{X0P&;jj?zHZc&j%bQwlV>7?20(i zcoUTM&HDXNf7zJ4oLL;dTlU9ZotUp{44jn3ai4o>+xMly+LgXo_%O6_QwrtvYSs*_ zGUe}tm@+)A-3!K}`62O0x!HEOU28wz(btR_IK4QD8B7YCH6|@*u=xYCBjs#ct&OHQ zM6lcR5Anf>D%Ov%^@Tgt(yIz)nLF2zd7+$|a+*>E0%ffm9n-#(^Zuc4!D98jqQXaP zrW{c+ak$=Giz>T+Cp1%aEuXOp%PCg8*V1_VU2$ZMU0ZBgGlA^4p~JW*@rv}^%XxME zeqB>P6en~I+t=Pe!s+DGiQDyzN>y{bindGMRTmf(Uk`Y-ggbaxJ~6P}Klm==#8NBZ z%}vBVS(_E?YP2|a{ezkir&U$%DN5Ov-}V?fSlEhbz})5ipre^023{VoZv*a_V;jrY zKW5fm^3}c z@qbnD;r=cGy|U_yl^9WimE%-I;D~hOyR_tfLQLh~V78n@9&k14JqD8u^ZZpld@#>j zet&+(Gu((?KhTYG{5}AgCP4rHwzK&E%8UGOaL@Q(a5`(4SFV>ALlte0j5mYSoxIN$ zDq+h`gpOd)UIq{mzZ3DesrU4S&k;1y_DXd<<8$T!^6|E4r>Lg(g_bW`hChL(>ZJGd zd2+d)rS0g895`7@a`KVqd&y77@l!tZ_g(;YWtuWE38pl8m-a1(x%CNt+0qNQyuv@f z4r=@jjL*q%30Fkx-6r>5U?xiIUAAl!f5z6mir16fnJ3x#AhoD6C+bCOkpri0K``83 z?YO<)#Fw=M&t{(7JB%i1qbTD{z@@}0iEob*S0HGv@gw`YuYE^?(`yB>y;rY)^;TZ- zuZDZjrBLssE9kKEK8XOX8r-NZVmP@}6M>6sSbe-;TEwLn@@VLPT@@)5qBUyGAgMv?i9h{Q z2l%cP0E7iED*#x}=XBf=n*|{!26FbZG+h;}oosl*a=N*dm#qlC#P-%$YpQ8*N_Vls z7N6ocfj~7Mdvti*LVyK(+l^ksGbi8y6_uxRw^Igi7jL7=uvKT3TVmVa_a+Yo-7w$* zxbyeB47|(m+yw?ka6i0#0^aYQ)fW+To=A#=&*A_cCt)Il2h{_>85Mtdr&qMiD@-q4 z-W3s8F24~|huq8eQ@sd04=ifXq1`+uT5xgokcv1x9>;|%UoJL){1;OAxz&|d)gyWT6;z7nXbkAkW>V|kUrX<;Z19?->aX?_dJw4+LxdP z+=61LGvqThwC`?spH>feJ)U%Qlv^Xz?qZ+1N%rbB^1Q^o9u#!$fv3tpz-L1M5apIt z%OyWC%L#M_So2CI+y7M8>al%05Oefhkvcb?{q@BNZy4|8@h-#Biy41vLNI*X1kQ&r{#&eMiRQ z1m@EPq30lP=|k8WXz!z!L&)5$99q4t*KHoJ8YrRSX-KB3p7+6Qm*;UQzaDurEu-}+ z!V65#>+zy19BX)EjH~>Be1LrBkz(~rZ2FV-4w)wCoR|42fP(d834FI8f`tTx+j>Tjrd9|>*%tC)S2PM@M?BJkYw>@V<7SyM{xu+ZA+RaA!4S#5_Ejz$H z_1e?m=Lv|*pw$?UBMLA9@EDkZ??QMva2Wxpd|=H8d#bz|&jDN)=>U&!Lx%d7W={Rn z4?s!8Z@@7Xn&BRf$4OR~R(B9jS5L5$*A5nOH&NJoa}c7XSe9sue`dfHUbxjQ--A9P{4nNBzY0I#C#P$!UDHyY_z9b5FRmx>;uO^9#MA9{ z3QgwjhTe8pR(s{NdYKi$n+&F^E0I6dBmxB6UfXWycwG?Edp%CN5q72n>t!;+xIwE^ z)LyrHf@4oxJ!6m88C;Cl1Gk^;MjbGEhUoQ>(m259YhGx;(S)|EeTfMY@QZsb-p3^g z@ZEA?=)_P&@tOF^LPAh^gw+83pv*q6_QM?^Kqo##_$UGLG!ulG>CHVK9!E}F#u{$0 zSrS6oJx?pntFE0I(}TvALW1Wtv0euIO?3hIdiUvy(e-6!S zv)}3EP65XB!m9TA^=^X~N1*Krehu7V7elCXpQ>J%Q^8HE|CE>Eey%V_#{=B!+=)na z-tMXJI{39)6~%Xz5JAYU_;6!4FUT27{8#5H`br>EV-G(_yak*yP~b^#tmtv40JsdJ z2mR_>y&UoZ*nyT5yoeeI?{Fi)&}timp0chR&}**J=VraE+_zyUx64Rv*R8BAhrBKP zng_A?gy3Zx$dSYp1MD78OPrcKD^K}>;brV>4?=uIN5S3B{bJpZ!LPg8Wqt>xU*Y% zV8e3W`sk$np7CZ32@kk^%H?^~pCTRVb%z=OzPdEVZw6J-C9S20f!<$y?;Fbi*H=h+ zY;s48hK#<_+Jgz5hyDh2 zAHXrMO!iN}aW|VssMiT6{qjMnr>e~LuMFVe8t7_%0SVme<}cz2bc*0U3$yZ+xLP1| z1%4xBDolyq$N&z>fO>jPc~6?JqEN5*gD|!4U~f?#ZuNRN*Je56ac_QGmNmas_BMkN zIl98pvjg9(NvePkT+RXCGJw8!r+|kUult%&JkatM+|gOoZOc30GLwuKaQya%h}W@7 zRRKNs`kZCW}(9(M_XQApfQ zJ0@S3-F@5dFh2#6d0o!{Pns*X$jl2~B0KMG6kmFU0H0*w)@W5%!7^b5gswVyJ!3~S za0D@NZT6Sd)H2{Lz++9*+lTU7rB9@jmn1SeP3+fCFe>n(Jk#grlXI5IxL<>CqHu58 zyM8tWI>7W%(Vx-Vjww}&9Oy0G;fC|L|M0qbLtv)Gc@pjNm{4bslK`Ck675kF?sjk) z6SHrn0{-N+Nb&?MIc>f7;Z1}TihF4Z_W7A()`cL(=#7YXoI&d&agi$gs3v7|+54c*3 z@wyr);IRTcj(?UKc-1OfD?KHaN~l`@%1D?%f~XgAqX!PP!uZ-Md@#ml5e) z!MzXJCG{5U$~XNaR?fQ(F4st2MGohYUN=&~kZ~C|VXTJ!e8sitJfmTg#Eb1ZinqmI znH;>0Wa;U6JrQ?lOm>q~Te3DZ|Fp3Hhyb7K%vgbo@29}?3p%FpEh!3BxIQ)3iOzRf zIe2Q1{+wc6++pL3M`9Ti)A=v)$EV*FB>QUP$Lg{Z#6FIv_D8{Z(_H z+Kge&$dbV8agKvGy!OW%w{s1AMsnxSc{{S2UnTt5TV6MZp=5Bdv?6q&|cXP(lKzAS4fV%bd%nnD51)Ra<^ml^z zGe}*oMYnbR)4T5{S$_}65XymN*4o(v#_f^as#%uV$vR|vjG zAMO%fcHpYxW>khJ@y!%u?%_v7a34p)3vz!f2)=D8bJIWi-Y41j!|QG`!=vos&74M_ z6)%uEa3g{MSlj1yk&w`KZ_gr>NbPZ0R3`)R0Qr^iv`R~?e}!+w8La$Bz%d;kMshXD z`#1sMCVRZ3_qyFc;(DBgk6P1VxK&R*k~`3X&3)73w&u2(=XD=5V^l(ju?a{3&sNjd zX`a%+g?eGTtxNSm3`_}J-n-rG13bhLHg~)(t`vCrBsQ_mdvmP3x&-gCpwH+cB>2wn zn%DffFB8Owxlf9`9+!;J30*QO2_DCn2;KJ^cZ)m5)0ozXaa*-(;E7e*E{`z@T^_^k z;PVO^S@GR~-xJX|f~8+-%~S-sZbhU%j^hGQM_|_Ob|iGP+}^s4HAgt{3>}O|-FmQ{ zH3wHbZq)Lkf1S2MPaoW6>p14Q7_H~_CG0%cMzviBz5H`fd+z2moL3GjRkZhQS})QH zw27X&Qed_pxo*d+M3xK!0UPsMR?h21fzn)5uagNpB3^jIFnZ*Jyi)NnUP&=2yDA z0vK(K*Xvax29LL1XL#ZHT%W}3G1AaDiq}%kv=2P)=C>=x0PlfU6;J$-X1q^Y8)ubt z3hx7z2pQkr0cyc|uff9=_}~Kig^wA?m*l`W*vnHueS+JXV8CCK38FBdc56yRyvt6U zia77%nw1NXvyyuQ6X1Nk%iD*Db=&%Mt)&(6iZT)e<=5ioI`IC_h7Gijd%!iNmg}`O zFR&J#2m2A{ znVKka2?_@L&&z?jc`^Tg*YNazaLcAc>lA9u2@C?<_0a$0rmDNfXNhSGDQ8Y?Zi5O$ z#P__PmH5Y9wbH7^J%snFscT+q6w(}U;_xp6*CYD=W7icuYi}KeljhU5IeZTHLyU;O z_oSeJy=5Bo_#9VIwjGttNzI;b?#}cc<5aXe{`%n{kJ95+qgMZm-V@uC2lREpK%^Yg z^}(@kfB(ImryX>4FBnM3H;P#b1?bI$b3R++wm-~E(B7o}*HsprJ%-S)x$bw&@!HqB z0p?pbpdhaT2z-*o3cBj!?fm--y}5S^#=v`P$W{WDbKL7tYk$&H*$ZKwe-+D>&Blz_ z)vGfNf_B30e;Td$%zAn~Y<)Nv?%C)G z&f_K~{o1BZ+w~;m=WD$vw*FOp)WN!}1Ks?w!3j@SGSt7E{te*jVyJ!`AonI4?2O(P z^Vb#{6odf@JOL2W-n2=po^mUK7NuvdTcJN>;4Uj5ej-Jaqd0Z)jwk6 z76W`cHdqgFPF@2ABEho+KDn$MY6t$S^?eV$r<{gROAiU}`3udP(^aCr6WS9>Xsj8P z`;U2Df#-qSR{s$iaTy|`m5)+`ZYKQat2W*`knO?@9&i_Hn_3V#)xX|MrZ;c+CYpn99%?+qUr(?)zg=;ne{K6LyZ++?NdeWvv+F>5 zjg@1LY_huqt5*BFGj7`te+N)|8mw(|%)g@ocCb(dVCDv@+xG=7cXn7ZU&O zbf^OnxBBm!mQ=h?A7t2D9|ox_+*S_%b(6n4G(0w*-&?v+|My*~|9MpZQzqE!pj<3& zw@1-5)bMM@n??BnZG6tf{_&zOb-pWt%RYI}2-z?^e0+`3RfU&*O+)V1BlNvvwOlql zYNf5-*QuuB)|;kJ+A&1dxGrH*-K}NAkb0Q`;r;NmuwNy-YfEX*Hs01w|Bbr0Zi=Jp z`h}wqJb~aAJh(&f;O;)i;O_1u!QI{6A-KEi;O-8C!{9JyuIs*^r`~!$!8!fUOm%g4 z&Fr;h?bSbV`1Jlbo|D&bVAJHZDko(T@}Td&V?lwRf>&SEw48-!c`_h0YD@>inlEP- z>!?LktvBT>8+2tV3|9^IR2y+<4eehC2!#yV3FRmhO9E^gk|DiPxNvpK|A;_y&eeZZ zbV6h|t{F>(d<{OUeP77*t;r!TZ}w*NUc8L8^q+A38#wC4lVey zl2$0lrLO+G5+*B6oB^P%dlou`QJI)a8VkNxw+cGC6cxdUx9?TSq^F050Lb|S|8&1I z7^B99RGl@Rrb!b_;)vUzf}6-0n5pfOVQo)^XjORXPz_-bjEw#Ock(vDYud6lfJKX! zE0Y#;QlMGJVjQU!<-H>InhEzlaSelxJ>Kl*2Vy�+~Kynd@!hA9<6w`by^TtM3ik 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

aF~o75;> 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 From 944f4581752d72729a69deb982e73c17f8183c50 Mon Sep 17 00:00:00 2001 From: Peter Amiri Date: Mon, 22 Jun 2026 08:05:22 -0700 Subject: [PATCH 015/140] refactor(public): extract cli.cfm command handlers into CliBridge service (#3242) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The dev-UI / CLI dispatcher vendor/wheels/public/views/cli.cfm was a 935-line god template with a 44-case cfswitch whose command handlers could not be unit-tested (the template only runs under a full HTTP request context). This was the remaining open item of issue #2959 (review finding P2) — the recursive-dispatch + envelope defects shipped in #2966 and the ~1MB inline-asset defect in #3012. Extract every command into wheels.public.CliBridge — a plain, stateless component with one method per command and an explicit command->method allowlist. cli.cfm (now ~112 lines) builds the response envelope preamble (security gate, lazy migration discovery), constructs a context, checks handles(), and calls dispatch(); the result is merged into the envelope. Behavior-preserving: handlers are the exact former case bodies with request.wheels.params -> arguments.params, preamble reads -> context.*, and framework primitives (model(), get(), $cliFormatMigrationStatus(), $cliResolveDumpPath()) reached through context.host. An unknown command stays a silent no-op, matching the former default-less switch. Security: dispatch() only ever invoke()s a method named in the allowlist, and params is passed as a single named argument (never spread), so a query-string key cannot become an arbitrary function argument. The bridge is stateless, so one instance is cached on application.wheels (via $cliBridge()) and shared across requests; ?reload=true re-creates it. Verified: cli/security/migrator suites green on Lucee 7; live dispatch of read-only + POST write-path commands + the SEC-4 mutation gate + unknown no-op + reload all confirmed against a running server; cross-engine matrix (Lucee 7 + Adobe 2023, SQLite) shows the cli bundle 126/126 pass with only pre-existing unrelated failures. Refs #2959 Signed-off-by: Peter Amiri Co-authored-by: Peter Amiri Co-authored-by: Claude Opus 4.8 --- vendor/wheels/Public.cfc | 23 + vendor/wheels/public/CliBridge.cfc | 931 ++++++++++++++++++ vendor/wheels/public/views/cli.cfm | 875 +--------------- .../wheels/tests/specs/cli/CliBridgeSpec.cfc | 100 ++ 4 files changed, 1080 insertions(+), 849 deletions(-) create mode 100644 vendor/wheels/public/CliBridge.cfc create mode 100644 vendor/wheels/tests/specs/cli/CliBridgeSpec.cfc diff --git a/vendor/wheels/Public.cfc b/vendor/wheels/Public.cfc index 57cb7eaeb9..c3d45f7146 100644 --- a/vendor/wheels/Public.cfc +++ b/vendor/wheels/Public.cfc @@ -192,6 +192,29 @@ component output="false" displayName="Internal GUI" extends="wheels.Global" { return application.wheels.$cliDbTypeCache[local.dsName]; } + /** + * Returns the shared CliBridge instance — the dev-UI / CLI command + * handlers extracted from cli.cfm (issue #2959). CliBridge is stateless + * (only an immutable command->method allowlist lives in its `variables`), + * so one instance is cached on `application.wheels` and shared across + * concurrent requests; `?reload=true` rebuilds `application.wheels` and + * re-creates it. Falls back to a fresh instance during early bootstrap + * (before `application.wheels` exists), mirroring `$componentIntegrationPlan`. + */ + public any function $cliBridge() { + if (!StructKeyExists(application, "wheels")) { + return CreateObject("component", "wheels.public.CliBridge").init(); + } + if (!StructKeyExists(application.wheels, "cliBridge")) { + lock name="wheels.cliBridge.#application.applicationName#" type="exclusive" timeout="10" { + if (!StructKeyExists(application.wheels, "cliBridge")) { + application.wheels.cliBridge = CreateObject("component", "wheels.public.CliBridge").init(); + } + } + } + return application.wheels.cliBridge; + } + /** * Formats the migrator's discovery list for the /wheels/cli dbStatus * command, mapping the migrator's own status field ("migrated" or "") diff --git a/vendor/wheels/public/CliBridge.cfc b/vendor/wheels/public/CliBridge.cfc new file mode 100644 index 0000000000..eb1d898283 --- /dev/null +++ b/vendor/wheels/public/CliBridge.cfc @@ -0,0 +1,931 @@ +/** + * CliBridge — dev-UI / CLI command handlers, extracted from the former + * 935-line `vendor/wheels/public/views/cli.cfm` god template (issue #2959, + * review finding P2). + * + * cli.cfm is now a thin dispatcher: it builds the response envelope preamble + * (security gate, lazy migration discovery, version/db-type), constructs a + * `context` struct, then asks this service to run the command. Each command + * is one method here, so the handlers are individually unit-testable — the + * regression net the template never had. + * + * Dispatch is allowlist-gated: `variables.commandMap` maps a command name to + * a handler method name, and `dispatch()` only ever `invoke()`s a method that + * appears in that map. `params` is passed to handlers as a single named + * argument (never spread), so a query-string key cannot become an arbitrary + * function argument (the remote arg-injection risk flagged in the #2959 + * cross-framework research). + * + * The component is stateless (only the immutable `commandMap` lives in + * `variables`), so a single instance is cached on `application.wheels` and + * shared across concurrent requests; `?reload=true` rebuilds `application` + * and re-creates it. Framework primitives the handlers need (`model()`, + * `get()`, `$cliFormatMigrationStatus()`, `$cliResolveDumpPath()`) are reached + * through `context.host` — the `wheels.Public` instance that includes cli.cfm. + * + * Context shape (built by cli.cfm): + * { host, migrator, datasource, databaseType, currentVersion, + * lastVersion, migrations } + * + * Each handler returns a partial struct that the dispatcher merges into the + * response envelope via `StructAppend(data, result, true)`. + */ +component output="false" displayName="CLI Bridge" { + + public any function init() { + // Allowlist: command name -> handler method name. Command names match + // method names, but the explicit map (not a name-equality shortcut) is + // what prevents `init`, `dispatch`, `handles`, or any other component + // method from being reachable as a command. + variables.commandMap = { + // Migration commands + "createMigration" = "createMigration", + "migrateTo" = "migrateTo", + "migrateToLatest" = "migrateToLatest", + "migrateUp" = "migrateUp", + "migrateDown" = "migrateDown", + "renameSystemTables" = "renameSystemTables", + "diff" = "diff", + "redoMigration" = "redoMigration", + "info" = "info", + "doctor" = "doctor", + "forgetVersion" = "forgetVersion", + "pretendVersion" = "pretendVersion", + // Database commands + "dbStatus" = "dbStatus", + "dbVersion" = "dbVersion", + "dbRollback" = "dbRollback", + "dbSchema" = "dbSchema", + "introspect" = "introspect", + "dbSeed" = "dbSeed", + "routes" = "routes", + "dbCreate" = "dbCreate", + "dbDrop" = "dbDrop", + "dbReset" = "dbReset", + "dbSetup" = "dbSetup", + "dbDump" = "dbDump", + "dbRestore" = "dbRestore", + "dbShell" = "dbShell", + // Job worker commands + "jobsProcessNext" = "jobsProcessNext", + "jobsStatus" = "jobsStatus", + "jobsRetry" = "jobsRetry", + "jobsPurge" = "jobsPurge", + "jobsMonitor" = "jobsMonitor" + }; + return this; + } + + /** + * Whether `command` is a declared, dispatchable command. + */ + public boolean function handles(required string command) { + return Len(arguments.command) && StructKeyExists(variables.commandMap, arguments.command); + } + + /** + * Run a command. Throws `Wheels.UnknownCliCommand` if the command is not on + * the allowlist — callers gate on `handles()` first to preserve the legacy + * "unknown command is a silent no-op" envelope behaviour. + */ + public struct function dispatch(required string command, required struct context, required struct params) { + if (!handles(arguments.command)) { + Throw( + type = "Wheels.UnknownCliCommand", + message = "Unknown CLI command: " & arguments.command + ); + } + local.method = variables.commandMap[arguments.command]; + return invoke(this, local.method, {context = arguments.context, params = arguments.params}); + } + + // ── Migration commands ────────────────────────────────────────────── + + public struct function createMigration(required struct context, required struct params) { + local.rv = {}; + if (StructKeyExists(arguments.params, "migrationPrefix") && Len(arguments.params.migrationPrefix)) { + local.rv.message = arguments.context.migrator.createMigration( + arguments.params.migrationName, + arguments.params.templateName, + arguments.params.migrationPrefix + ); + } else { + local.rv.message = arguments.context.migrator.createMigration( + arguments.params.migrationName, + arguments.params.templateName + ); + } + return local.rv; + } + + public struct function migrateTo(required struct context, required struct params) { + local.rv = {}; + if (StructKeyExists(arguments.params, "version")) { + local.rv.message = arguments.context.migrator.migrateTo(arguments.params.version); + } + return local.rv; + } + + public struct function migrateToLatest(required struct context, required struct params) { + return {message = arguments.context.migrator.migrateToLatest()}; + } + + public struct function migrateUp(required struct context, required struct params) { + // Walk the migration list (sorted ascending by version) and migrate to + // the first pending version after the current one. + local.rv = {}; + local.targetVersion = ""; + for (local.m in arguments.context.migrations) { + if (local.m.status != "migrated" && local.m.version > arguments.context.currentVersion) { + local.targetVersion = local.m.version; + break; + } + } + if (Len(local.targetVersion)) { + local.rv.message = arguments.context.migrator.migrateTo(local.targetVersion); + } else { + local.rv.message = "No pending migrations. Database is at version #arguments.context.currentVersion#."; + } + return local.rv; + } + + public struct function migrateDown(required struct context, required struct params) { + // Walk the list in reverse to find the migration immediately below the + // current version, then migrate down to it. + local.rv = {}; + local.targetVersion = "0"; + for (local.i = ArrayLen(arguments.context.migrations); local.i >= 1; local.i--) { + local.m = arguments.context.migrations[local.i]; + if (local.m.version < arguments.context.currentVersion && local.m.status == "migrated") { + local.targetVersion = local.m.version; + break; + } + } + if (arguments.context.currentVersion == "0") { + local.rv.message = "Database is at version 0; nothing to roll back."; + } else { + local.rv.message = arguments.context.migrator.migrateTo(local.targetVersion); + } + return local.rv; + } + + public struct function renameSystemTables(required struct context, required struct params) { + // F15 Phase 2: opt-in rename of legacy c_o_r_e_* system tables. + local.rv = {}; + local.dryRun = (StructKeyExists(arguments.params, "dryRun") && arguments.params.dryRun == "true"); + local.rv.renameResult = arguments.context.migrator.renameSystemTables(dryRun = local.dryRun); + local.rv.success = local.rv.renameResult.success; + if (Len(local.rv.renameResult.skipped)) { + local.rv.message = local.rv.renameResult.skipped; + } else if (ArrayLen(local.rv.renameResult.renamed)) { + local.rv.message = "Renamed: " & ArrayToList(local.rv.renameResult.renamed, "; "); + } else if (local.dryRun && ArrayLen(local.rv.renameResult.sql)) { + local.rv.message = "Dry run — SQL that would execute:" & Chr(10) & ArrayToList(local.rv.renameResult.sql, ";" & Chr(10)) & ";"; + } + return local.rv; + } + + public struct function diff(required struct context, required struct params) { + local.rv = {}; + try { + local.autoMigrator = CreateObject("component", "wheels.migrator.AutoMigrator"); + local.options = {}; + + // Parse hints from URL: hints={"renames":{"old":"new"}} as JSON. + if (StructKeyExists(arguments.params, "hints") && Len(arguments.params.hints)) { + local.decodedHints = DeserializeJSON(arguments.params.hints); + if (IsStruct(local.decodedHints)) { + StructAppend(local.options, local.decodedHints, true); + } + } + if (StructKeyExists(arguments.params, "threshold") && Len(arguments.params.threshold) && IsNumeric(arguments.params.threshold)) { + local.options.heuristicThreshold = arguments.params.threshold; + } + + if (StructKeyExists(arguments.params, "modelName") && Len(arguments.params.modelName)) { + local.diffResult = local.autoMigrator.diff(arguments.params.modelName, local.options); + + // Optionally write the migration file. + local.migrationWritten = ""; + if (StructKeyExists(arguments.params, "write") && arguments.params.write == "true") { + local.migName = StructKeyExists(arguments.params, "name") && Len(arguments.params.name) ? arguments.params.name : ""; + local.autoMigrator.writeMigration(local.diffResult, local.migName); + local.migrationWritten = "written"; + } + + local.rv.success = true; + local.rv.model = local.diffResult; + local.rv.migrationWritten = local.migrationWritten; + } else { + // diffAll path + local.diffAllResult = local.autoMigrator.diffAll(local.options); + + local.written = []; + if (StructKeyExists(arguments.params, "write") && arguments.params.write == "true") { + for (local.m in local.diffAllResult) { + local.autoMigrator.writeMigration(local.diffAllResult[local.m], ""); + ArrayAppend(local.written, local.m); + } + } + + local.rv.success = true; + local.rv.models = local.diffAllResult; + local.rv.migrationsWritten = local.written; + } + } catch (any e) { + local.rv.success = false; + local.rv.error = e.type; + local.rv.message = e.message; + } + return local.rv; + } + + public struct function redoMigration(required struct context, required struct params) { + local.rv = {}; + if (StructKeyExists(arguments.params, "version")) { + local.redoVersion = arguments.params.version; + } else { + local.redoVersion = arguments.context.lastVersion; + } + local.rv.message = arguments.context.migrator.redoMigration(local.redoVersion); + return local.rv; + } + + public struct function info(required struct context, required struct params) { + // Build a human-readable status block; the migrations list is rendered + // by Migrator.$buildInfoOutput() so the logic is unit-testable. + local.rv = {}; + local.lines = []; + ArrayAppend(local.lines, "Datasource: " & arguments.context.datasource); + ArrayAppend(local.lines, "Database type: " & arguments.context.databaseType); + for (local.line in arguments.context.migrator.$buildInfoOutput()) { + ArrayAppend(local.lines, local.line); + } + local.rv.message = ArrayToList(local.lines, Chr(10)); + return local.rv; + } + + public struct function doctor(required struct context, required struct params) { + // Comprehensive migrator health diagnostic (#2780). + local.rv = {}; + local.report = arguments.context.migrator.doctor(); + local.rv.healthy = local.report.healthy; + local.rv.currentVersion = local.report.currentVersion; + local.rv.orphans = local.report.orphans; + local.rv.orphansWithMeta = local.report.orphansWithMeta; + local.rv.pending = local.report.pending; + local.rv.summary = local.report.summary; + local.docLines = []; + ArrayAppend(local.docLines, local.report.message); + ArrayAppend(local.docLines, ""); + ArrayAppend(local.docLines, " Datasource: " & arguments.context.datasource); + ArrayAppend(local.docLines, " Database type: " & arguments.context.databaseType); + ArrayAppend(local.docLines, " Current version: " & (Len(local.report.currentVersion) ? local.report.currentVersion : "0")); + ArrayAppend(local.docLines, " Total migrations: " & local.report.summary.total); + ArrayAppend(local.docLines, " applied: " & local.report.summary.applied); + ArrayAppend(local.docLines, " pending: " & local.report.summary.pending); + if (local.report.summary.orphan > 0) { + ArrayAppend(local.docLines, " orphan: " & local.report.summary.orphan & " (" & ArrayToList(local.report.orphans, ", ") & ")"); + } + if (ArrayLen(local.report.pending) > 0) { + ArrayAppend(local.docLines, ""); + ArrayAppend(local.docLines, "Pending local migrations:"); + for (local.v in local.report.pending) { + ArrayAppend(local.docLines, " [ ] " & local.v); + } + } + if (ArrayLen(local.report.orphansWithMeta) > 0) { + ArrayAppend(local.docLines, ""); + ArrayAppend(local.docLines, "Orphan versions (no matching file):"); + for (local.o in local.report.orphansWithMeta) { + local.orphanLine = " [?] " & local.o.version; + if (Len(local.o.name)) { + local.orphanLine &= " " & local.o.name; + } + if (Len(local.o.appliedAt)) { + local.orphanLine &= " (applied " & local.o.appliedAt & ")"; + } + ArrayAppend(local.docLines, local.orphanLine); + } + ArrayAppend(local.docLines, ""); + ArrayAppend(local.docLines, "Resolve: `wheels migrate forget --yes` to remove an orphan row,"); + ArrayAppend(local.docLines, " or pull the peer's migration file via git."); + } + local.rv.message = ArrayToList(local.docLines, Chr(10)); + return local.rv; + } + + public struct function forgetVersion(required struct context, required struct params) { + // Remove a row from wheels_migrator_versions without running down(). + local.rv = {}; + local.versionArg = arguments.params.version ?: ""; + if (!Len(local.versionArg)) { + local.rv.success = false; + local.rv.message = "Missing required argument: version. Usage: wheels migrate forget "; + return local.rv; + } + local.forgetResult = arguments.context.migrator.forgetVersion(local.versionArg); + local.rv.success = local.forgetResult.success; + local.rv.removed = local.forgetResult.removed; + local.rv.message = local.forgetResult.message; + return local.rv; + } + + public struct function pretendVersion(required struct context, required struct params) { + // Record a version as applied without running up(). + local.rv = {}; + local.pretendArg = arguments.params.version ?: ""; + if (!Len(local.pretendArg)) { + local.rv.success = false; + local.rv.message = "Missing required argument: version. Usage: wheels migrate pretend "; + return local.rv; + } + local.pretendResult = arguments.context.migrator.pretendVersion(local.pretendArg); + local.rv.success = local.pretendResult.success; + local.rv.recorded = local.pretendResult.recorded; + local.rv.message = local.pretendResult.message; + return local.rv; + } + + // ── Database commands ─────────────────────────────────────────────── + + public struct function dbStatus(required struct context, required struct params) { + // Return migration status straight from the migrator's own status field. + local.rv = {}; + local.statusReport = arguments.context.host.$cliFormatMigrationStatus(arguments.context.migrations); + local.rv.success = true; + local.rv.migrations = local.statusReport.migrations; + local.rv.summary = local.statusReport.summary; + return local.rv; + } + + public struct function dbVersion(required struct context, required struct params) { + return { + success = true, + version = arguments.context.currentVersion, + message = "Current database version: " & arguments.context.currentVersion + }; + } + + public struct function dbRollback(required struct context, required struct params) { + local.rv = {}; + local.steps = structKeyExists(arguments.params, "steps") ? arguments.params.steps : 1; + local.targetVersion = ""; + + // Filter on tracked status, not version <= current (shared dev DB; #2947/#2977). + local.appliedMigrations = []; + for (local.migration in arguments.context.migrations) { + if (local.migration.status == "migrated") { + arrayAppend(local.appliedMigrations, local.migration); + } + } + + if (arrayLen(local.appliedMigrations) >= local.steps) { + local.targetIndex = arrayLen(local.appliedMigrations) - local.steps; + if (local.targetIndex > 0) { + local.targetVersion = local.appliedMigrations[local.targetIndex].version; + } else { + local.targetVersion = "0"; + } + } + + if (len(local.targetVersion)) { + local.rv.message = arguments.context.migrator.migrateTo(local.targetVersion); + local.rv.success = true; + } else { + local.rv.success = false; + local.rv.message = "No migrations to rollback"; + } + return local.rv; + } + + public struct function dbSchema(required struct context, required struct params) { + local.rv = {success = true, schema = {}}; + + try { + local.adapter = application.wheels.dataAdapter; + local.rv.schema.databaseType = arguments.context.databaseType; + local.rv.schema.tables = []; + + // Get all tables + local.tables = []; + if (arguments.context.databaseType == "H2") { + local.tablesQuery = new Query(); + local.tablesQuery.setDatasource(application.wheels.dataSourceName); + local.tablesQuery.setSQL("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'TABLE' AND TABLE_SCHEMA = 'PUBLIC'"); + local.tables = local.tablesQuery.execute().getResult(); + } else { + local.tablesQuery = new Query(); + local.tablesQuery.setDatasource(application.wheels.dataSourceName); + local.tablesQuery.setSQL("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'"); + local.tables = local.tablesQuery.execute().getResult(); + } + + for (local.table in local.tables) { + local.tableInfo = { + name = local.table.TABLE_NAME, + columns = [] + }; + + local.columns = new Query(); + local.columns.setDatasource(application.wheels.dataSourceName); + if (arguments.context.databaseType == "H2") { + local.columns.setSQL("SELECT COLUMN_NAME, TYPE_NAME as DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = :tableName AND TABLE_SCHEMA = 'PUBLIC'"); + } else { + local.columns.setSQL("SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = :tableName"); + } + local.columns.addParam(name = "tableName", value = local.table.TABLE_NAME, cfsqltype = "cf_sql_varchar"); + local.columnResult = local.columns.execute().getResult(); + + for (local.column in local.columnResult) { + arrayAppend(local.tableInfo.columns, { + name = local.column.COLUMN_NAME, + type = local.column.DATA_TYPE, + nullable = local.column.IS_NULLABLE, + default = local.column.COLUMN_DEFAULT ?: "" + }); + } + + arrayAppend(local.rv.schema.tables, local.tableInfo); + } + } catch (any e) { + local.rv.success = false; + local.rv.message = "Error retrieving schema: " & e.message; + } + return local.rv; + } + + public struct function introspect(required struct context, required struct params) { + local.rv = {success = false}; + if (!structKeyExists(arguments.params, "model") || !len(arguments.params.model)) { + local.rv.message = "Missing required parameter: model"; + return local.rv; + } + + try { + local.modelName = arguments.params.model; + local.modelInstance = arguments.context.host.model(local.modelName); + local.classData = local.modelInstance.$classData(); + + local.rv.model = local.modelName; + local.rv.tableName = local.classData.tableName ?: lCase(local.modelName) & "s"; + local.rv.primaryKey = local.classData.keys ?: "id"; + + local.rv.columns = []; + if (structKeyExists(local.classData, "properties")) { + for (local.propName in local.classData.properties) { + local.prop = local.classData.properties[local.propName]; + local.colInfo = { + name: local.propName, + type: local.prop.type ?: "string", + primaryKey: listFindNoCase(local.rv.primaryKey, local.propName) > 0 + }; + if (structKeyExists(local.prop, "maxLength") && val(local.prop.maxLength) > 0) { + local.colInfo.maxLength = local.prop.maxLength; + } + if (right(local.propName, 2) == "Id" && len(local.propName) > 2) { + local.colInfo.foreignKey = true; + local.refName = left(local.propName, len(local.propName) - 2); + local.colInfo.referencedModel = uCase(left(local.refName, 1)) & mid(local.refName, 2, len(local.refName) - 1); + } + arrayAppend(local.rv.columns, local.colInfo); + } + } + + local.rv.associations = []; + if (structKeyExists(local.classData, "associations")) { + for (local.assocName in local.classData.associations) { + local.assoc = local.classData.associations[local.assocName]; + local.assocModelName = local.assoc.modelName ?: local.assocName; + local.assocModelName = uCase(left(local.assocModelName, 1)) & mid(local.assocModelName, 2, len(local.assocModelName) - 1); + arrayAppend(local.rv.associations, { + type: local.assoc.type ?: "belongsTo", + name: local.assocName, + modelName: local.assocModelName + }); + } + } + + local.rv.success = true; + local.rv.message = "Model introspected successfully"; + } catch (any e) { + local.rv.message = "Error introspecting model: " & e.message; + } + return local.rv; + } + + public struct function dbSeed(required struct context, required struct params) { + // Seed orchestration; `dbSetup` composes through the same private + // helper instead of re-entering the dispatcher (issue #2959). + return $runDbSeed(params = arguments.params, context = arguments.context); + } + + public struct function routes(required struct context, required struct params) { + // Routes live at application.wheels.routes. + local.rv = {success = true, routes = []}; + if (structKeyExists(application, "wheels") && structKeyExists(application.wheels, "routes")) { + for (local.route in application.wheels.routes) { + local.routeInfo = { + name = structKeyExists(local.route, "name") ? local.route.name : "", + pattern = structKeyExists(local.route, "pattern") ? local.route.pattern : "", + controller = structKeyExists(local.route, "controller") ? local.route.controller : "", + action = structKeyExists(local.route, "action") ? local.route.action : "", + methods = structKeyExists(local.route, "methods") ? local.route.methods : "GET" + }; + arrayAppend(local.rv.routes, local.routeInfo); + } + } + return local.rv; + } + + public struct function dbCreate(required struct context, required struct params) { + local.rv = {success = false}; + + // For H2, we can provide helpful info and ensure schema table exists. + if (arguments.context.databaseType == "H2") { + try { + local.checkQuery = new Query(); + local.checkQuery.setDatasource(application.wheels.dataSourceName); + local.checkQuery.setSQL("SELECT COUNT(*) as cnt FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'SCHEMAINFO'"); + local.checkResult = local.checkQuery.execute().getResult(); + + if (local.checkResult.cnt == 0) { + local.createQuery = new Query(); + local.createQuery.setDatasource(application.wheels.dataSourceName); + local.createQuery.setSQL("CREATE TABLE IF NOT EXISTS schemainfo (version VARCHAR(25) DEFAULT '0')"); + local.createQuery.execute(); + + local.insertQuery = new Query(); + local.insertQuery.setDatasource(application.wheels.dataSourceName); + local.insertQuery.setSQL("INSERT INTO schemainfo (version) VALUES ('0')"); + local.insertQuery.execute(); + + local.rv.message = "H2 database initialized successfully with schema tracking table."; + } else { + local.rv.message = "H2 database already exists and is properly configured."; + } + local.rv.success = true; + } catch (any e) { + local.rv.message = "H2 database exists but error checking schema: " & e.message; + local.rv.success = true; // Still mark as success since H2 auto-creates + } + } else { + local.rv.message = "Database creation must be done through your database management system or hosting control panel."; + + switch (arguments.context.databaseType) { + case "MySQL": + local.rv.message &= chr(10) & chr(10) & "MySQL: CREATE DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"; + break; + case "PostgreSQL": + local.rv.message &= chr(10) & chr(10) & "PostgreSQL: CREATE DATABASE dbname WITH ENCODING='UTF8';"; + break; + case "SQLServer": + local.rv.message &= chr(10) & chr(10) & "SQL Server: CREATE DATABASE dbname;"; + break; + } + } + return local.rv; + } + + public struct function dbDrop(required struct context, required struct params) { + return { + success = false, + message = "Database dropping must be done through your database management system or hosting control panel for safety reasons." + }; + } + + public struct function dbReset(required struct context, required struct params) { + local.rv = {}; + try { + // Get all tables + local.tables = []; + if (arguments.context.databaseType == "H2") { + local.tablesQuery = new Query(); + local.tablesQuery.setDatasource(application.wheels.dataSourceName); + local.tablesQuery.setSQL("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'TABLE' AND TABLE_SCHEMA = 'PUBLIC' AND TABLE_NAME != 'SCHEMAINFO'"); + local.tables = local.tablesQuery.execute().getResult(); + } else { + local.tablesQuery = new Query(); + local.tablesQuery.setDatasource(application.wheels.dataSourceName); + local.tablesQuery.setSQL("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME != 'schemainfo'"); + local.tables = local.tablesQuery.execute().getResult(); + } + + // Drop all tables except schemainfo + for (local.table in local.tables) { + local.dropQuery = new Query(); + local.dropQuery.setDatasource(application.wheels.dataSourceName); + local.dropQuery.setSQL("DROP TABLE #local.table.TABLE_NAME#"); + local.dropQuery.execute(); + } + + // Reset migration version to 0 + local.resetQuery = new Query(); + local.resetQuery.setDatasource(application.wheels.dataSourceName); + local.resetQuery.setSQL("UPDATE schemainfo SET version = '0'"); + local.resetQuery.execute(); + + local.rv.success = true; + local.rv.message = "Database reset successfully. All tables dropped and migration version reset to 0."; + } catch (any e) { + local.rv.success = false; + local.rv.message = "Error resetting database: " & e.message; + } + return local.rv; + } + + public struct function dbSetup(required struct context, required struct params) { + // Setup database (migrate + optional seed). Composes seeding through a + // direct helper call — never by re-entering the dispatcher (issue #2959). + local.rv = {success = true, message = "Database setup: "}; + + try { + local.migrateResult = arguments.context.migrator.migrateToLatest(); + local.rv.message &= "Migrations completed. "; + + if (structKeyExists(arguments.params, "seed") && arguments.params.seed) { + local.seedParams = Duplicate(arguments.params); + local.seedParams.count = StructKeyExists(arguments.params, "seedCount") + ? val(arguments.params.seedCount) : 10; + local.seedResult = $runDbSeed(params = local.seedParams, context = arguments.context); + local.setupMessage = local.rv.message; + StructAppend(local.rv, local.seedResult, true); + local.rv.message = local.setupMessage & local.seedResult.message; + if (!local.seedResult.success) { + local.rv.success = false; + } + } + } catch (any e) { + local.rv.success = false; + local.rv.message &= "Migration failed: " & e.message & ". "; + } + return local.rv; + } + + public struct function dbDump(required struct context, required struct params) { + local.rv = {success = false, dump = ""}; + + // For H2, generate a dump directly. + if (arguments.context.databaseType == "H2") { + try { + local.dumpQuery = new Query(); + local.dumpQuery.setDatasource(application.wheels.dataSourceName); + local.dumpQuery.setSQL("SCRIPT SIMPLE"); + local.dumpResult = local.dumpQuery.execute().getResult(); + + local.sqlDump = ""; + for (local.row in local.dumpResult) { + local.sqlDump &= local.row.SCRIPT & ";" & chr(10); + } + + local.rv.success = true; + local.rv.dump = local.sqlDump; + local.rv.message = "Database dump generated successfully. Use --output parameter to save to file."; + + // If output file specified, save it. The path is canonicalized + // and confined to the application root (SEC-5). + if (structKeyExists(arguments.params, "output")) { + local.outputFile = arguments.context.host.$cliResolveDumpPath(arguments.params.output); + if (Len(local.outputFile)) { + fileWrite(local.outputFile, local.sqlDump); + local.rv.message = "Database dump saved to: " & arguments.params.output; + } else { + local.rv.success = false; + local.rv.message = "Invalid output path: the dump file must resolve inside the application root."; + } + } + } catch (any e) { + local.rv.message = "Error generating dump: " & e.message; + } + } else { + local.rv.message = "Database dump functionality requires command-line tools specific to your database system."; + switch (arguments.context.databaseType) { + case "MySQL": + local.rv.message &= " Use: mysqldump -u [username] -p [database] > backup.sql"; + break; + case "PostgreSQL": + local.rv.message &= " Use: pg_dump -U [username] [database] > backup.sql"; + break; + case "SQLServer": + local.rv.message &= " Use SQL Server Management Studio or: sqlcmd -S [server] -d [database] -Q 'BACKUP DATABASE...'"; + break; + } + } + return local.rv; + } + + public struct function dbRestore(required struct context, required struct params) { + local.rv = { + success = false, + message = "Database restore functionality requires command-line tools specific to your database system." + }; + + switch (arguments.context.databaseType) { + case "MySQL": + local.rv.message &= " Use: mysql -u [username] -p [database] < backup.sql"; + break; + case "PostgreSQL": + local.rv.message &= " Use: psql -U [username] [database] < backup.sql"; + break; + case "SQLServer": + local.rv.message &= " Use SQL Server Management Studio or: sqlcmd -S [server] -d [database] -i backup.sql"; + break; + case "H2": + local.rv.message &= " Use: RUNSCRIPT FROM 'backup.sql' in H2 console"; + break; + } + return local.rv; + } + + public struct function dbShell(required struct context, required struct params) { + local.rv = {success = false}; + + // For H2, provide specific information about accessing the console. + if (arguments.context.databaseType == "H2") { + local.rv.message = "H2 Database Console Access:" & chr(10); + local.rv.message &= chr(10) & "Option 1: Web Console" & chr(10); + local.rv.message &= "The H2 web console may be available at the /h2-console path of your application." & chr(10); + local.rv.message &= "URL: http://localhost:[your-port]/h2-console" & chr(10); + local.rv.message &= "JDBC URL: " & application.wheels.dataSourceName & chr(10); + + try { + local.dbinfo = new Query(); + local.dbinfo.setDatasource(application.wheels.dataSourceName); + local.dbinfo.setSQL("SELECT DATABASE() as dbname, USER() as dbuser"); + local.dbResult = local.dbinfo.execute().getResult(); + if (local.dbResult.recordCount) { + local.rv.message &= "Database: " & local.dbResult.dbname & chr(10); + local.rv.message &= "User: " & local.dbResult.dbuser & chr(10); + } + } catch (any e) { + // Ignore errors getting extra info + } + + local.rv.message &= chr(10) & "Option 2: Command Line" & chr(10); + local.rv.message &= "java -cp [path-to-h2.jar] org.h2.tools.Shell" & chr(10); + } else { + local.rv.message = "Database shell access requires command-line tools. "; + switch (arguments.context.databaseType) { + case "MySQL": + local.rv.message &= "Use: mysql -u [username] -p [database]"; + break; + case "PostgreSQL": + local.rv.message &= "Use: psql -U [username] [database]"; + break; + case "SQLServer": + local.rv.message &= "Use: sqlcmd -S [server] -d [database] -U [username]"; + break; + } + } + return local.rv; + } + + // ── Job worker commands ───────────────────────────────────────────── + + public struct function jobsProcessNext(required struct context, required struct params) { + local.rv = {}; + try { + local.worker = new wheels.JobWorker(); + local.jobQueues = structKeyExists(arguments.params, "queues") ? arguments.params.queues : ""; + local.jobTimeout = structKeyExists(arguments.params, "timeout") ? val(arguments.params.timeout) : 300; + local.jobResult = local.worker.processNext(queues = local.jobQueues, timeout = local.jobTimeout); + local.rv.success = true; + local.rv.jobResult = local.jobResult; + local.rv.message = local.jobResult.skipped ? "No jobs available" : "Processed job #local.jobResult.jobId#"; + } catch (any e) { + local.rv.success = false; + local.rv.message = "Error processing job: " & e.message; + } + return local.rv; + } + + public struct function jobsStatus(required struct context, required struct params) { + local.rv = {}; + try { + local.worker = new wheels.JobWorker(); + local.jobQueue = structKeyExists(arguments.params, "queue") ? arguments.params.queue : ""; + local.rv.success = true; + local.rv.stats = local.worker.getStats(queue = local.jobQueue); + local.rv.message = "Queue statistics retrieved"; + } catch (any e) { + local.rv.success = false; + local.rv.message = "Error getting status: " & e.message; + } + return local.rv; + } + + public struct function jobsRetry(required struct context, required struct params) { + local.rv = {}; + try { + local.worker = new wheels.JobWorker(); + local.jobQueue = structKeyExists(arguments.params, "queue") ? arguments.params.queue : ""; + local.jobLimit = structKeyExists(arguments.params, "limit") ? val(arguments.params.limit) : 0; + local.retryCount = local.worker.retryFailed(queue = local.jobQueue, limit = local.jobLimit); + local.rv.success = true; + local.rv.retried = local.retryCount; + local.rv.message = "Retried #local.retryCount# failed job(s)"; + } catch (any e) { + local.rv.success = false; + local.rv.message = "Error retrying jobs: " & e.message; + } + return local.rv; + } + + public struct function jobsPurge(required struct context, required struct params) { + local.rv = {}; + try { + local.worker = new wheels.JobWorker(); + local.jobQueue = structKeyExists(arguments.params, "queue") ? arguments.params.queue : ""; + local.purgeStatus = structKeyExists(arguments.params, "status") ? arguments.params.status : "completed"; + local.purgeDays = structKeyExists(arguments.params, "days") ? val(arguments.params.days) : 7; + local.purgeCount = local.worker.purge(status = local.purgeStatus, days = local.purgeDays, queue = local.jobQueue); + local.rv.success = true; + local.rv.purged = local.purgeCount; + local.rv.message = "Purged #local.purgeCount# #local.purgeStatus# job(s)"; + } catch (any e) { + local.rv.success = false; + local.rv.message = "Error purging jobs: " & e.message; + } + return local.rv; + } + + public struct function jobsMonitor(required struct context, required struct params) { + local.rv = {}; + try { + local.worker = new wheels.JobWorker(); + local.jobQueue = structKeyExists(arguments.params, "queue") ? arguments.params.queue : ""; + local.minutes = structKeyExists(arguments.params, "minutes") ? val(arguments.params.minutes) : 60; + local.rv.success = true; + local.rv.monitor = local.worker.getMonitorData(queue = local.jobQueue, minutes = local.minutes); + local.rv.stats = local.worker.getStats(queue = local.jobQueue); + local.timeouts = local.worker.checkTimeouts(); + if (local.timeouts > 0) { + local.rv.timeoutsRecovered = local.timeouts; + } + local.rv.message = "Monitor data retrieved"; + } catch (any e) { + local.rv.success = false; + local.rv.message = "Error getting monitor data: " & e.message; + } + return local.rv; + } + + // ── Internal ──────────────────────────────────────────────────────── + + /** + * Seed orchestration, shared by `dbSeed` and `dbSetup`. Returns a struct + * with {success, mode, message, ...mode-specific fields} merged into the + * response envelope by the caller. + */ + private struct function $runDbSeed(required struct params, required struct context) { + var result = {success = true, mode = "auto", message = ""}; + var sp = arguments.params; + var requestedMode = structKeyExists(sp, "mode") ? sp.mode : "auto"; + var environment = structKeyExists(sp, "environment") ? sp.environment : arguments.context.host.get("environment"); + result.mode = requestedMode; + + try { + var useConvention = false; + if (requestedMode == "convention") { + useConvention = true; + } else if (requestedMode == "generate") { + useConvention = false; + } else if (structKeyExists(application.wheels, "seeder") && application.wheels.seeder.hasSeedFiles()) { + useConvention = true; + } + + if (useConvention) { + result.mode = "convention"; + var seeder = application.wheels.seeder; + var conventionResult = seeder.runSeeds(environment = environment); + result.success = conventionResult.success; + result.message = conventionResult.message; + result.environment = environment; + result.totalCreated = conventionResult.totalCreated; + result.totalSkipped = conventionResult.totalSkipped; + if (structKeyExists(conventionResult, "totalFailed")) { + result.totalFailed = conventionResult.totalFailed; + } + result.results = conventionResult.results; + if (structKeyExists(conventionResult, "detail")) { + result.detail = conventionResult.detail; + } + } else { + // Generate mode delegates to Seeder.generateSeeds() (#3082). + var count = structKeyExists(sp, "count") ? val(sp.count) : 10; + var modelsArg = structKeyExists(sp, "models") ? sp.models : ""; + var generateSeeder = structKeyExists(application.wheels, "seeder") + ? application.wheels.seeder + : CreateObject("component", "wheels.Seeder").init(); + var generateResult = generateSeeder.generateSeeds(models = modelsArg, count = count); + StructAppend(result, generateResult, true); + } + } catch (any e) { + result.success = false; + result.message = "Error during database seeding: " & e.message; + } + + return result; + } + +} diff --git a/vendor/wheels/public/views/cli.cfm b/vendor/wheels/public/views/cli.cfm index 2b063c909e..de28b1b28f 100644 --- a/vendor/wheels/public/views/cli.cfm +++ b/vendor/wheels/public/views/cli.cfm @@ -67,794 +67,33 @@ try { if (Len(local.cliCommand)) { data.command = local.cliCommand; - switch (local.cliCommand) { - case "createMigration": - if (StructKeyExists(request.wheels.params, "migrationPrefix") && Len(request.wheels.params.migrationPrefix)) { - data.message = migrator.createMigration( - request.wheels.params.migrationName, - request.wheels.params.templateName, - request.wheels.params.migrationPrefix - ); - } else { - data.message = migrator.createMigration( - request.wheels.params.migrationName, - request.wheels.params.templateName - ); - } - break; - case "migrateTo": - if (StructKeyExists(request.wheels.params, "version")) { - data.message = migrator.migrateTo(request.wheels.params.version); - } - break; - case "migrateToLatest": - data.message = migrator.migrateToLatest(); - break; - case "migrateUp": - // Walk the migration list (sorted ascending by version) and - // migrate to the first pending version after the current one. - // `migrateTo` handles the actual transaction + status update. - local.targetVersion = ""; - for (local.m in data.migrations) { - if (local.m.status != "migrated" && local.m.version > data.currentVersion) { - local.targetVersion = local.m.version; - break; - } - } - if (Len(local.targetVersion)) { - data.message = migrator.migrateTo(local.targetVersion); - } else { - data.message = "No pending migrations. Database is at version #data.currentVersion#."; - } - break; - case "migrateDown": - // Walk the list in reverse to find the migration immediately - // below the current version, then migrate down to it. If the - // current version is the first applied migration, target "0" - // (rolls back the only migration). - local.targetVersion = "0"; - for (local.i = ArrayLen(data.migrations); local.i >= 1; local.i--) { - local.m = data.migrations[local.i]; - if (local.m.version < data.currentVersion && local.m.status == "migrated") { - local.targetVersion = local.m.version; - break; - } - } - if (data.currentVersion == "0") { - data.message = "Database is at version 0; nothing to roll back."; - } else { - data.message = migrator.migrateTo(local.targetVersion); - } - break; - case "renameSystemTables": - // F15 Phase 2: opt-in rename of legacy c_o_r_e_* system tables. - // Returns the full result struct (success/renamed/skipped/errors/sql) - // rather than a flat message — the CLI decodes and prints each field. - local.dryRun = (StructKeyExists(request.wheels.params, "dryRun") && request.wheels.params.dryRun == "true"); - data.renameResult = migrator.renameSystemTables(dryRun = local.dryRun); - data.success = data.renameResult.success; - if (Len(data.renameResult.skipped)) { - data.message = data.renameResult.skipped; - } else if (ArrayLen(data.renameResult.renamed)) { - data.message = "Renamed: " & ArrayToList(data.renameResult.renamed, "; "); - } else if (local.dryRun && ArrayLen(data.renameResult.sql)) { - data.message = "Dry run — SQL that would execute:" & Chr(10) & ArrayToList(data.renameResult.sql, ";" & Chr(10)) & ";"; - } - break; - case "diff": - try { - local.autoMigrator = CreateObject("component", "wheels.migrator.AutoMigrator"); - local.options = {}; - - // Parse hints from URL: hints={"renames":{"old":"new"}} as JSON-encoded string - if (StructKeyExists(request.wheels.params, "hints") && Len(request.wheels.params.hints)) { - local.decodedHints = DeserializeJSON(request.wheels.params.hints); - if (IsStruct(local.decodedHints)) { - StructAppend(local.options, local.decodedHints, true); - } - } - if (StructKeyExists(request.wheels.params, "threshold") && Len(request.wheels.params.threshold) && IsNumeric(request.wheels.params.threshold)) { - local.options.heuristicThreshold = request.wheels.params.threshold; - } - - if (StructKeyExists(request.wheels.params, "modelName") && Len(request.wheels.params.modelName)) { - local.diffResult = local.autoMigrator.diff(request.wheels.params.modelName, local.options); - - // Optionally write the migration file - local.migrationWritten = ""; - if (StructKeyExists(request.wheels.params, "write") && request.wheels.params.write == "true") { - local.migName = StructKeyExists(request.wheels.params, "name") && Len(request.wheels.params.name) ? request.wheels.params.name : ""; - local.autoMigrator.writeMigration(local.diffResult, local.migName); - local.migrationWritten = "written"; - } - - data.success = true; - data.model = local.diffResult; - data.migrationWritten = local.migrationWritten; - } else { - // diffAll path - local.diffAllResult = local.autoMigrator.diffAll(local.options); - - local.written = []; - if (StructKeyExists(request.wheels.params, "write") && request.wheels.params.write == "true") { - for (local.m in local.diffAllResult) { - local.autoMigrator.writeMigration(local.diffAllResult[local.m], ""); - ArrayAppend(local.written, local.m); - } - } - - data.success = true; - data.models = local.diffAllResult; - data.migrationsWritten = local.written; - } - } catch (any e) { - data.success = false; - data.error = e.type; - data.message = e.message; - } - break; - case "redoMigration": - if (StructKeyExists(request.wheels.params, "version")) { - local.redoVersion = request.wheels.params.version; - } else { - local.redoVersion = data.lastVersion; - } - data.message = migrator.redoMigration(local.redoVersion); - break; - case "info": - // Build a human-readable status block. The migrations list - // is rendered by Migrator.$buildInfoOutput() so the logic - // is unit-testable without exercising the HTTP dispatcher. - // Issue #2780 surfaced orphan versions (DB rows with no - // matching file) — those are rendered with a [?] marker - // and an explanatory footer. - local.lines = []; - ArrayAppend(local.lines, "Datasource: " & data.datasource); - ArrayAppend(local.lines, "Database type: " & data.databaseType); - for (local.line in migrator.$buildInfoOutput()) { - ArrayAppend(local.lines, local.line); - } - data.message = ArrayToList(local.lines, Chr(10)); - break; - case "doctor": - // Comprehensive migrator health diagnostic. Returns a struct - // describing orphans, pending, and applied counts. See #2780. - // Plan 3: orphansWithMeta exposes the peer's migration name - // + apply timestamp when the schema is enriched. - local.report = migrator.doctor(); - data.healthy = local.report.healthy; - data.currentVersion = local.report.currentVersion; - data.orphans = local.report.orphans; - data.orphansWithMeta = local.report.orphansWithMeta; - data.pending = local.report.pending; - data.summary = local.report.summary; - local.docLines = []; - ArrayAppend(local.docLines, local.report.message); - ArrayAppend(local.docLines, ""); - ArrayAppend(local.docLines, " Datasource: " & data.datasource); - ArrayAppend(local.docLines, " Database type: " & data.databaseType); - ArrayAppend(local.docLines, " Current version: " & (Len(local.report.currentVersion) ? local.report.currentVersion : "0")); - ArrayAppend(local.docLines, " Total migrations: " & local.report.summary.total); - ArrayAppend(local.docLines, " applied: " & local.report.summary.applied); - ArrayAppend(local.docLines, " pending: " & local.report.summary.pending); - if (local.report.summary.orphan > 0) { - ArrayAppend(local.docLines, " orphan: " & local.report.summary.orphan & " (" & ArrayToList(local.report.orphans, ", ") & ")"); - } - if (ArrayLen(local.report.pending) > 0) { - ArrayAppend(local.docLines, ""); - ArrayAppend(local.docLines, "Pending local migrations:"); - for (local.v in local.report.pending) { - ArrayAppend(local.docLines, " [ ] " & local.v); - } - } - if (ArrayLen(local.report.orphansWithMeta) > 0) { - ArrayAppend(local.docLines, ""); - ArrayAppend(local.docLines, "Orphan versions (no matching file):"); - for (local.o in local.report.orphansWithMeta) { - local.orphanLine = " [?] " & local.o.version; - if (Len(local.o.name)) { - local.orphanLine &= " " & local.o.name; - } - if (Len(local.o.appliedAt)) { - local.orphanLine &= " (applied " & local.o.appliedAt & ")"; - } - ArrayAppend(local.docLines, local.orphanLine); - } - ArrayAppend(local.docLines, ""); - ArrayAppend(local.docLines, "Resolve: `wheels migrate forget --yes` to remove an orphan row,"); - ArrayAppend(local.docLines, " or pull the peer's migration file via git."); - } - data.message = ArrayToList(local.docLines, Chr(10)); - break; - case "forgetVersion": - // Remove a row from wheels_migrator_versions without running - // down(). Refuses if the version has a matching local file. - local.versionArg = request.wheels.params.version ?: ""; - if (!Len(local.versionArg)) { - data.success = false; - data.message = "Missing required argument: version. Usage: wheels migrate forget "; - break; - } - local.forgetResult = migrator.forgetVersion(local.versionArg); - data.success = local.forgetResult.success; - data.removed = local.forgetResult.removed; - data.message = local.forgetResult.message; - break; - case "pretendVersion": - // Record a version as applied without running up(). Refuses - // if already applied or if no local file matches. - local.pretendArg = request.wheels.params.version ?: ""; - if (!Len(local.pretendArg)) { - data.success = false; - data.message = "Missing required argument: version. Usage: wheels migrate pretend "; - break; - } - local.pretendResult = migrator.pretendVersion(local.pretendArg); - data.success = local.pretendResult.success; - data.recorded = local.pretendResult.recorded; - data.message = local.pretendResult.message; - break; - - // Database commands - case "dbStatus": - // Return migration status straight from the migrator's own - // status field — see Public.cfc::$cliFormatMigrationStatus() - // for why the old version-comparison heuristic was wrong. - // Reuses the list discovered in the preamble instead of - // running discovery a second time. - local.statusReport = $cliFormatMigrationStatus(data.migrations); - data.success = true; - data.migrations = local.statusReport.migrations; - data.summary = local.statusReport.summary; - break; - - case "dbVersion": - // Return current database version - data.success = true; - data.version = data.currentVersion; - data.message = "Current database version: " & data.currentVersion; - break; - - case "dbRollback": - // Rollback database - local.steps = structKeyExists(request.wheels.params, "steps") ? request.wheels.params.steps : 1; - local.targetVersion = ""; - - // Find target version based on steps. Reuses the list - // discovered in the preamble instead of re-discovering. - // Filter on tracked status, not version <= current: on a shared - // dev DB a peer-applied version above your latest local file - // made the version heuristic count pending/orphan rows as - // applied, so `steps=N` rolled back fewer real migrations - // (same P3 fix dbStatus got in #2947; #2977). - local.appliedMigrations = []; - for (local.migration in data.migrations) { - if (local.migration.status == "migrated") { - arrayAppend(local.appliedMigrations, local.migration); - } - } - - if (arrayLen(local.appliedMigrations) >= local.steps) { - local.targetIndex = arrayLen(local.appliedMigrations) - local.steps; - if (local.targetIndex > 0) { - local.targetVersion = local.appliedMigrations[local.targetIndex].version; - } else { - local.targetVersion = "0"; - } - } - - if (len(local.targetVersion)) { - data.message = migrator.migrateTo(local.targetVersion); - data.success = true; - } else { - data.success = false; - data.message = "No migrations to rollback"; - } - break; - - case "dbSchema": - // Export database schema - data.success = true; - data.schema = {}; - - try { - // Use database adapter to get schema information - local.adapter = application.wheels.dataAdapter; - data.schema.databaseType = data.databaseType; - data.schema.tables = []; - - // Get all tables - local.tables = []; - if (data.databaseType == "H2") { - // H2 specific query - local.tablesQuery = new Query(); - local.tablesQuery.setDatasource(application.wheels.dataSourceName); - local.tablesQuery.setSQL("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'TABLE' AND TABLE_SCHEMA = 'PUBLIC'"); - local.tables = local.tablesQuery.execute().getResult(); - } else { - // Generic INFORMATION_SCHEMA query - local.tablesQuery = new Query(); - local.tablesQuery.setDatasource(application.wheels.dataSourceName); - local.tablesQuery.setSQL("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'"); - local.tables = local.tablesQuery.execute().getResult(); - } - - for (local.table in local.tables) { - local.tableInfo = { - name = local.table.TABLE_NAME, - columns = [] - }; - - // Get columns for each table - local.columns = new Query(); - local.columns.setDatasource(application.wheels.dataSourceName); - if (data.databaseType == "H2") { - local.columns.setSQL("SELECT COLUMN_NAME, TYPE_NAME as DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = :tableName AND TABLE_SCHEMA = 'PUBLIC'"); - } else { - local.columns.setSQL("SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = :tableName"); - } - local.columns.addParam(name="tableName", value=local.table.TABLE_NAME, cfsqltype="cf_sql_varchar"); - local.columnResult = local.columns.execute().getResult(); - - for (local.column in local.columnResult) { - arrayAppend(local.tableInfo.columns, { - name = local.column.COLUMN_NAME, - type = local.column.DATA_TYPE, - nullable = local.column.IS_NULLABLE, - default = local.column.COLUMN_DEFAULT ?: "" - }); - } - - arrayAppend(data.schema.tables, local.tableInfo); - } - } catch (any e) { - data.success = false; - data.message = "Error retrieving schema: " & e.message; - } - break; - - case "introspect": - data.success = false; - if (!structKeyExists(request.wheels.params, "model") || !len(request.wheels.params.model)) { - data.message = "Missing required parameter: model"; - break; - } - - try { - local.modelName = request.wheels.params.model; - local.modelInstance = model(local.modelName); - local.classData = local.modelInstance.$classData(); - - data.model = local.modelName; - data.tableName = local.classData.tableName ?: lCase(local.modelName) & "s"; - data.primaryKey = local.classData.keys ?: "id"; - - data.columns = []; - if (structKeyExists(local.classData, "properties")) { - for (local.propName in local.classData.properties) { - local.prop = local.classData.properties[local.propName]; - local.colInfo = { - name: local.propName, - type: local.prop.type ?: "string", - primaryKey: listFindNoCase(data.primaryKey, local.propName) > 0 - }; - if (structKeyExists(local.prop, "maxLength") && val(local.prop.maxLength) > 0) { - local.colInfo.maxLength = local.prop.maxLength; - } - if (right(local.propName, 2) == "Id" && len(local.propName) > 2) { - local.colInfo.foreignKey = true; - local.refName = left(local.propName, len(local.propName) - 2); - local.colInfo.referencedModel = uCase(left(local.refName, 1)) & mid(local.refName, 2, len(local.refName) - 1); - } - arrayAppend(data.columns, local.colInfo); - } - } - - data.associations = []; - if (structKeyExists(local.classData, "associations")) { - for (local.assocName in local.classData.associations) { - local.assoc = local.classData.associations[local.assocName]; - local.assocModelName = local.assoc.modelName ?: local.assocName; - local.assocModelName = uCase(left(local.assocModelName, 1)) & mid(local.assocModelName, 2, len(local.assocModelName) - 1); - arrayAppend(data.associations, { - type: local.assoc.type ?: "belongsTo", - name: local.assocName, - modelName: local.assocModelName - }); - } - } - - data.success = true; - data.message = "Model introspected successfully"; - } catch (any e) { - data.message = "Error introspecting model: " & e.message; - } - break; - - case "dbSeed": - // The seed orchestration lives in the page-level - // runDbSeed() UDF below. Generate mode delegates to - // wheels.Seeder.generateSeeds(). Extracted so `dbSetup` - // can compose seeding without re-entering the dispatcher - // (issue ##2959). - local.seedResult = runDbSeed(request.wheels.params); - StructAppend(data, local.seedResult, true); - break; - - case "routes": - // Return application routes. Routes live at application.wheels.routes - // (the convention every other case in this file uses); the previous - // `application[application.wheels.appKey]` indirection was broken - // because `appKey` is a function, not a property. - data.success = true; - data.routes = []; - if (structKeyExists(application, "wheels") && structKeyExists(application.wheels, "routes")) { - for (local.route in application.wheels.routes) { - local.routeInfo = { - name = structKeyExists(local.route, "name") ? local.route.name : "", - pattern = structKeyExists(local.route, "pattern") ? local.route.pattern : "", - controller = structKeyExists(local.route, "controller") ? local.route.controller : "", - action = structKeyExists(local.route, "action") ? local.route.action : "", - methods = structKeyExists(local.route, "methods") ? local.route.methods : "GET" - }; - arrayAppend(data.routes, local.routeInfo); - } - } - break; - - case "dbCreate": - // Create database - data.success = false; - - // For H2, we can provide helpful info and ensure schema table exists - if (data.databaseType == "H2") { - try { - // Check if schemainfo table exists - local.checkQuery = new Query(); - local.checkQuery.setDatasource(application.wheels.dataSourceName); - local.checkQuery.setSQL("SELECT COUNT(*) as cnt FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'SCHEMAINFO'"); - local.checkResult = local.checkQuery.execute().getResult(); - - if (local.checkResult.cnt == 0) { - // Create schemainfo table - local.createQuery = new Query(); - local.createQuery.setDatasource(application.wheels.dataSourceName); - local.createQuery.setSQL("CREATE TABLE IF NOT EXISTS schemainfo (version VARCHAR(25) DEFAULT '0')"); - local.createQuery.execute(); - - // Insert initial version - local.insertQuery = new Query(); - local.insertQuery.setDatasource(application.wheels.dataSourceName); - local.insertQuery.setSQL("INSERT INTO schemainfo (version) VALUES ('0')"); - local.insertQuery.execute(); - - data.message = "H2 database initialized successfully with schema tracking table."; - } else { - data.message = "H2 database already exists and is properly configured."; - } - data.success = true; - } catch (any e) { - data.message = "H2 database exists but error checking schema: " & e.message; - data.success = true; // Still mark as success since H2 auto-creates - } - } else { - data.message = "Database creation must be done through your database management system or hosting control panel."; - - // Provide helpful commands for common databases - switch(data.databaseType) { - case "MySQL": - data.message &= chr(10) & chr(10) & "MySQL: CREATE DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"; - break; - case "PostgreSQL": - data.message &= chr(10) & chr(10) & "PostgreSQL: CREATE DATABASE dbname WITH ENCODING='UTF8';"; - break; - case "SQLServer": - data.message &= chr(10) & chr(10) & "SQL Server: CREATE DATABASE dbname;"; - break; - } - } - break; - - case "dbDrop": - // Drop database - data.success = false; - data.message = "Database dropping must be done through your database management system or hosting control panel for safety reasons."; - break; - - case "dbReset": - // Reset database (drop all tables and re-run migrations) - try { - // Get all tables - local.tables = []; - if (data.databaseType == "H2") { - local.tablesQuery = new Query(); - local.tablesQuery.setDatasource(application.wheels.dataSourceName); - local.tablesQuery.setSQL("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'TABLE' AND TABLE_SCHEMA = 'PUBLIC' AND TABLE_NAME != 'SCHEMAINFO'"); - local.tables = local.tablesQuery.execute().getResult(); - } else { - local.tablesQuery = new Query(); - local.tablesQuery.setDatasource(application.wheels.dataSourceName); - local.tablesQuery.setSQL("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME != 'schemainfo'"); - local.tables = local.tablesQuery.execute().getResult(); - } - - // Drop all tables except schemainfo - for (local.table in local.tables) { - local.dropQuery = new Query(); - local.dropQuery.setDatasource(application.wheels.dataSourceName); - local.dropQuery.setSQL("DROP TABLE #local.table.TABLE_NAME#"); - local.dropQuery.execute(); - } - - // Reset migration version to 0 - local.resetQuery = new Query(); - local.resetQuery.setDatasource(application.wheels.dataSourceName); - local.resetQuery.setSQL("UPDATE schemainfo SET version = '0'"); - local.resetQuery.execute(); - - data.success = true; - data.message = "Database reset successfully. All tables dropped and migration version reset to 0."; - } catch (any e) { - data.success = false; - data.message = "Error resetting database: " & e.message; - } - break; - - case "dbSetup": - // Setup database (create + migrate + seed) - data.success = true; - data.message = "Database setup: "; - - try { - local.migrateResult = migrator.migrateToLatest(); - data.message &= "Migrations completed. "; - - if (structKeyExists(request.wheels.params, "seed") && request.wheels.params.seed) { - // Compose seeding through a direct UDF call — - // the legacy path mutated `request.wheels.params` - // and re-included `cli.cfm`, which rebuilt the - // envelope from scratch and silently discarded - // the "Migrations completed." string we just set - // (issue ##2959). Merge the seed result on top - // of `data` while preserving the dbSetup envelope - // (command, prefixed message, combined success). - local.seedParams = Duplicate(request.wheels.params); - local.seedParams.count = StructKeyExists(request.wheels.params, "seedCount") - ? val(request.wheels.params.seedCount) : 10; - local.seedResult = runDbSeed(local.seedParams); - local.setupMessage = data.message; - StructAppend(data, local.seedResult, true); - data.command = "dbSetup"; - data.message = local.setupMessage & local.seedResult.message; - if (!local.seedResult.success) { - data.success = false; - } - } - } catch (any e) { - data.success = false; - data.message &= "Migration failed: " & e.message & ". "; - } - break; - - case "dbDump": - // Dump database - data.success = false; - data.dump = ""; - - // For H2, we can generate a dump directly - if (data.databaseType == "H2") { - try { - local.dumpQuery = new Query(); - local.dumpQuery.setDatasource(application.wheels.dataSourceName); - local.dumpQuery.setSQL("SCRIPT SIMPLE"); - local.dumpResult = local.dumpQuery.execute().getResult(); - - // Build SQL dump - local.sqlDump = ""; - for (local.row in local.dumpResult) { - local.sqlDump &= local.row.SCRIPT & ";" & chr(10); - } - - data.success = true; - data.dump = local.sqlDump; - data.message = "Database dump generated successfully. Use --output parameter to save to file."; - - // If output file specified, save it. The path is - // canonicalized and confined to the application root - // (2026-06-09 review SEC-5) — `../` traversal would - // otherwise make this an arbitrary-location file write. - if (structKeyExists(request.wheels.params, "output")) { - local.outputFile = $cliResolveDumpPath(request.wheels.params.output); - if (Len(local.outputFile)) { - fileWrite(local.outputFile, local.sqlDump); - data.message = "Database dump saved to: " & request.wheels.params.output; - } else { - data.success = false; - data.message = "Invalid output path: the dump file must resolve inside the application root."; - } - } - - } catch (any e) { - data.message = "Error generating dump: " & e.message; - } - } else { - // Provide database-specific guidance for other systems - data.message = "Database dump functionality requires command-line tools specific to your database system."; - switch(data.databaseType) { - case "MySQL": - data.message &= " Use: mysqldump -u [username] -p [database] > backup.sql"; - break; - case "PostgreSQL": - data.message &= " Use: pg_dump -U [username] [database] > backup.sql"; - break; - case "SQLServer": - data.message &= " Use SQL Server Management Studio or: sqlcmd -S [server] -d [database] -Q 'BACKUP DATABASE...'"; - break; - } - } - break; - - case "dbRestore": - // Restore database - data.success = false; - data.message = "Database restore functionality requires command-line tools specific to your database system."; - - // Provide database-specific guidance - switch(data.databaseType) { - case "MySQL": - data.message &= " Use: mysql -u [username] -p [database] < backup.sql"; - break; - case "PostgreSQL": - data.message &= " Use: psql -U [username] [database] < backup.sql"; - break; - case "SQLServer": - data.message &= " Use SQL Server Management Studio or: sqlcmd -S [server] -d [database] -i backup.sql"; - break; - case "H2": - data.message &= " Use: RUNSCRIPT FROM 'backup.sql' in H2 console"; - break; - } - break; - - case "dbShell": - // Database shell - data.success = false; - - // For H2, provide specific information about accessing the console - if (data.databaseType == "H2") { - data.message = "H2 Database Console Access:" & chr(10); - data.message &= chr(10) & "Option 1: Web Console" & chr(10); - data.message &= "The H2 web console may be available at the /h2-console path of your application." & chr(10); - data.message &= "URL: http://localhost:[your-port]/h2-console" & chr(10); - data.message &= "JDBC URL: " & application.wheels.dataSourceName & chr(10); - - // Try to get connection info - try { - local.dbinfo = new Query(); - local.dbinfo.setDatasource(application.wheels.dataSourceName); - local.dbinfo.setSQL("SELECT DATABASE() as dbname, USER() as dbuser"); - local.dbResult = local.dbinfo.execute().getResult(); - if (local.dbResult.recordCount) { - data.message &= "Database: " & local.dbResult.dbname & chr(10); - data.message &= "User: " & local.dbResult.dbuser & chr(10); - } - } catch (any e) { - // Ignore errors getting extra info - } - - data.message &= chr(10) & "Option 2: Command Line" & chr(10); - data.message &= "java -cp [path-to-h2.jar] org.h2.tools.Shell" & chr(10); - - // NOTE: an earlier revision tried to execute - // request.wheels.params.command as SQL here, but that - // param is always the literal dispatch value "dbShell", - // so the branch executed "dbShell" as SQL, always threw, - // and clobbered the help text above with an error - // (2026-06-09 review P1). An SQL pass-through would also - // need the POST + reload-password gate; use the console - // (`wheels console`) for ad-hoc statements instead. - } else { - // Provide database-specific guidance - data.message = "Database shell access requires command-line tools. "; - switch(data.databaseType) { - case "MySQL": - data.message &= "Use: mysql -u [username] -p [database]"; - break; - case "PostgreSQL": - data.message &= "Use: psql -U [username] [database]"; - break; - case "SQLServer": - data.message &= "Use: sqlcmd -S [server] -d [database] -U [username]"; - break; - } - } - break; - - // ── Job Worker Commands ────────────────────────────────────── - - case "jobsProcessNext": - // Process the next available job (used by `wheels jobs work`) - try { - local.worker = new wheels.JobWorker(); - local.jobQueues = structKeyExists(request.wheels.params, "queues") ? request.wheels.params.queues : ""; - local.jobTimeout = structKeyExists(request.wheels.params, "timeout") ? val(request.wheels.params.timeout) : 300; - local.jobResult = local.worker.processNext(queues=local.jobQueues, timeout=local.jobTimeout); - data.success = true; - data.jobResult = local.jobResult; - data.message = local.jobResult.skipped ? "No jobs available" : "Processed job #local.jobResult.jobId#"; - } catch (any e) { - data.success = false; - data.message = "Error processing job: " & e.message; - } - break; - - case "jobsStatus": - // Get queue statistics (used by `wheels jobs status`) - try { - local.worker = new wheels.JobWorker(); - local.jobQueue = structKeyExists(request.wheels.params, "queue") ? request.wheels.params.queue : ""; - data.success = true; - data.stats = local.worker.getStats(queue=local.jobQueue); - data.message = "Queue statistics retrieved"; - } catch (any e) { - data.success = false; - data.message = "Error getting status: " & e.message; - } - break; - - case "jobsRetry": - // Retry failed jobs (used by `wheels jobs retry`) - try { - local.worker = new wheels.JobWorker(); - local.jobQueue = structKeyExists(request.wheels.params, "queue") ? request.wheels.params.queue : ""; - local.jobLimit = structKeyExists(request.wheels.params, "limit") ? val(request.wheels.params.limit) : 0; - local.retryCount = local.worker.retryFailed(queue=local.jobQueue, limit=local.jobLimit); - data.success = true; - data.retried = local.retryCount; - data.message = "Retried #local.retryCount# failed job(s)"; - } catch (any e) { - data.success = false; - data.message = "Error retrying jobs: " & e.message; - } - break; - - case "jobsPurge": - // Purge old jobs (used by `wheels jobs purge`) - try { - local.worker = new wheels.JobWorker(); - local.jobQueue = structKeyExists(request.wheels.params, "queue") ? request.wheels.params.queue : ""; - local.purgeStatus = structKeyExists(request.wheels.params, "status") ? request.wheels.params.status : "completed"; - local.purgeDays = structKeyExists(request.wheels.params, "days") ? val(request.wheels.params.days) : 7; - local.purgeCount = local.worker.purge(status=local.purgeStatus, days=local.purgeDays, queue=local.jobQueue); - data.success = true; - data.purged = local.purgeCount; - data.message = "Purged #local.purgeCount# #local.purgeStatus# job(s)"; - } catch (any e) { - data.success = false; - data.message = "Error purging jobs: " & e.message; - } - break; - - case "jobsMonitor": - // Get monitoring data (used by `wheels jobs monitor`) - try { - local.worker = new wheels.JobWorker(); - local.jobQueue = structKeyExists(request.wheels.params, "queue") ? request.wheels.params.queue : ""; - local.minutes = structKeyExists(request.wheels.params, "minutes") ? val(request.wheels.params.minutes) : 60; - data.success = true; - data.monitor = local.worker.getMonitorData(queue=local.jobQueue, minutes=local.minutes); - data.stats = local.worker.getStats(queue=local.jobQueue); - local.timeouts = local.worker.checkTimeouts(); - if (local.timeouts > 0) { - data.timeoutsRecovered = local.timeouts; - } - data.message = "Monitor data retrieved"; - } catch (any e) { - data.success = false; - data.message = "Error getting monitor data: " & e.message; - } - break; + // Dispatch to the CliBridge service (issue #2959). The 44-case switch + // that used to live here is now one allowlist-gated method per command + // in wheels.public.CliBridge — individually unit-testable, and the + // dispatcher never spreads query-string keys into function arguments. + // `context` carries the preamble-computed envelope values plus a `host` + // reference (this Public instance) so handlers can reach framework + // primitives (model(), get(), $cliFormatMigrationStatus(), + // $cliResolveDumpPath()). An unrecognized command stays a silent no-op, + // preserving the legacy default-less switch behavior. + local.bridge = $cliBridge(); + if (local.bridge.handles(local.cliCommand)) { + local.cliContext = { + host = this, + migrator = migrator, + datasource = data.datasource, + databaseType = data.databaseType, + currentVersion = data.currentVersion, + lastVersion = data.lastVersion, + migrations = data.migrations + }; + local.cliResult = local.bridge.dispatch( + command = local.cliCommand, + context = local.cliContext, + params = request.wheels.params + ); + StructAppend(data, local.cliResult, true); } } } catch (any e) { @@ -868,68 +107,6 @@ try { data.message = e.message & ': ' & e.detail; data.messages = data.message; } - -// Seed orchestration extracted from the `dbSeed` switch case so that -// `dbSetup` can compose seeding through a direct call instead of the -// legacy recursive cfinclude (issue ##2959). Returns a struct with -// {success, mode, message, ...mode-specific fields} that the caller -// merges into the response envelope via StructAppend. -function runDbSeed(struct seedParams = {}) { - var result = {success = true, mode = "auto", message = ""}; - var sp = arguments.seedParams; - var requestedMode = structKeyExists(sp, "mode") ? sp.mode : "auto"; - var environment = structKeyExists(sp, "environment") ? sp.environment : get("environment"); - result.mode = requestedMode; - - try { - var useConvention = false; - if (requestedMode == "convention") { - useConvention = true; - } else if (requestedMode == "generate") { - useConvention = false; - } else if (structKeyExists(application.wheels, "seeder") && application.wheels.seeder.hasSeedFiles()) { - useConvention = true; - } - - if (useConvention) { - result.mode = "convention"; - var seeder = application.wheels.seeder; - var conventionResult = seeder.runSeeds(environment = environment); - result.success = conventionResult.success; - result.message = conventionResult.message; - result.environment = environment; - result.totalCreated = conventionResult.totalCreated; - result.totalSkipped = conventionResult.totalSkipped; - if (structKeyExists(conventionResult, "totalFailed")) { - result.totalFailed = conventionResult.totalFailed; - } - result.results = conventionResult.results; - if (structKeyExists(conventionResult, "detail")) { - result.detail = conventionResult.detail; - } - } else { - // Generate mode delegates to Seeder.generateSeeds(), which fixes - // both #3082 defects: it iterates $classData().properties as the - // STRUCT it is (the old inline loop treated it as an array of - // property structs and threw on every model), and it reports - // overall success=false when any model fails — so the CLI surfaces - // a non-zero exit instead of printing "Seeding completed." (#3082). - var count = structKeyExists(sp, "count") ? val(sp.count) : 10; - var modelsArg = structKeyExists(sp, "models") ? sp.models : ""; - var generateSeeder = structKeyExists(application.wheels, "seeder") - ? application.wheels.seeder - : CreateObject("component", "wheels.Seeder").init(); - var generateResult = generateSeeder.generateSeeds(models = modelsArg, count = count); - StructAppend(result, generateResult, true); - } - } catch (any e) { - result.success = false; - result.message = "Error during database seeding: " & e.message; - } - - return result; -} - #SerializeJSON(data)# diff --git a/vendor/wheels/tests/specs/cli/CliBridgeSpec.cfc b/vendor/wheels/tests/specs/cli/CliBridgeSpec.cfc new file mode 100644 index 0000000000..18da65b5c9 --- /dev/null +++ b/vendor/wheels/tests/specs/cli/CliBridgeSpec.cfc @@ -0,0 +1,100 @@ +/** + * Unit specs for the CliBridge service (issue ##2959, P2). + * + * The dev-UI dispatcher `vendor/wheels/public/views/cli.cfm` was a ~935-line + * template with a 44-case switch whose handlers could not be unit-tested + * because the template only runs under a full HTTP request context. The + * handlers were extracted into `wheels.public.CliBridge` — a plain, + * stateless component with one method per command and an explicit + * command->method allowlist. cli.cfm is now a thin dispatcher that builds a + * context, checks `handles()`, and calls `dispatch()`. + * + * Because CliBridge is a plain component, the dispatch contract and the + * pure (no-DB) handler branches ARE unit-testable here — the regression net + * the god-template never had. DB- and worker-backed handlers are + * behaviour-preserving moves verified by the cross-engine matrix and live + * endpoint testing. + */ +component extends="wheels.WheelsTest" { + + function run() { + + describe("CliBridge dispatch contract (issue ##2959)", () => { + + beforeEach(() => { + bridge = new wheels.public.CliBridge(); + }); + + it("handles() returns true for every declared command", () => { + var declared = "createMigration,migrateTo,migrateToLatest,migrateUp,migrateDown," + & "renameSystemTables,diff,redoMigration,info,doctor,forgetVersion,pretendVersion," + & "dbStatus,dbVersion,dbRollback,dbSchema,introspect,dbSeed,routes,dbCreate,dbDrop," + & "dbReset,dbSetup,dbDump,dbRestore,dbShell,jobsProcessNext,jobsStatus,jobsRetry," + & "jobsPurge,jobsMonitor"; + for (var cmd in ListToArray(declared)) { + expect(bridge.handles(cmd)).toBeTrue("CliBridge should handle '" & cmd & "'"); + } + }); + + it("handles() returns false for unknown or unsafe command names", () => { + expect(bridge.handles("")).toBeFalse(); + expect(bridge.handles("notACommand")).toBeFalse(); + // Must NOT expose arbitrary component methods as commands. + expect(bridge.handles("init")).toBeFalse(); + expect(bridge.handles("dispatch")).toBeFalse(); + expect(bridge.handles("handles")).toBeFalse(); + }); + + it("dispatch() throws for a command not on the allowlist (defensive guard)", () => { + var call = () => { + bridge.dispatch(command = "notACommand", context = {}, params = {}); + }; + expect(call).toThrow("Wheels.UnknownCliCommand"); + }); + + }); + + describe("CliBridge pure handler branches (issue ##2959)", () => { + + beforeEach(() => { + bridge = new wheels.public.CliBridge(); + }); + + it("dbVersion reports the current version from the context", () => { + var rv = bridge.dispatch( + command = "dbVersion", + context = {currentVersion = "20260101000000"}, + params = {} + ); + expect(rv.success).toBeTrue(); + expect(rv.version).toBe("20260101000000"); + expect(rv.message).toInclude("20260101000000"); + }); + + it("introspect returns a missing-parameter error when no model is given", () => { + var rv = bridge.dispatch(command = "introspect", context = {}, params = {}); + expect(rv.success).toBeFalse(); + expect(rv.message).toInclude("Missing required parameter: model"); + }); + + it("forgetVersion returns a missing-argument error when no version is given", () => { + var rv = bridge.dispatch(command = "forgetVersion", context = {}, params = {}); + expect(rv.success).toBeFalse(); + expect(rv.message).toInclude("Missing required argument: version"); + }); + + it("migrateToLatest delegates to the migrator and returns its message", () => { + var fakeMigrator = {migrateToLatest = () => "Migrated to 20260101000000."}; + var rv = bridge.dispatch( + command = "migrateToLatest", + context = {migrator = fakeMigrator}, + params = {} + ); + expect(rv.message).toBe("Migrated to 20260101000000."); + }); + + }); + + } + +} From 181cb6d9fa7fe974614ee44352a3ae42bc502764 Mon Sep 17 00:00:00 2001 From: Peter Amiri Date: Mon, 22 Jun 2026 09:21:49 -0700 Subject: [PATCH 016/140] fix: anchor app-template rootPath to GetCurrentTemplatePath for subfolder stability (#3244) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The application template set `this.wheels.rootPath` from `GetDirectoryFromPath(GetBaseTemplatePath())` — the directory of whatever file was originally requested. When a request bootstraps under a subfolder (e.g. the web test runner), the base template is not the public front controller, so rootPath mis-anchors. Because rootPath seeds `this.name` via `Hash(rootPath)` (the issue-359 shared-app-name pattern), an unstable value silently splits one app across two application scopes — a contributor to the "reload=true fixes it" symptom in #3025/#2887. Anchor to `GetCurrentTemplatePath()` instead — always this Application.cfc's own path (the public dir), stable regardless of the requested base template. The value is identical for a normal front-controller request, so existing apps that uncommented `Hash(rootPath)` keep the same app name. (Deliberately not the reporter's `dir & "../"` form, which would shift the value to the app root and change that hash for every existing user — stability, not level, is the fix.) Same idiom already used two lines down in rocketunit_tests/Application.cfc for `this.webrootDir`. Applied to the `wheels new` scaffold, the demo app, both examples, and the legacy test app. Validated: demo app reload/boot clean; onboarding harness (wheels new -> start -> migrate -> generate -> test) green (45/0). Refs #3025, #2887 Signed-off-by: Peter Amiri Co-authored-by: Peter Amiri Co-authored-by: Claude Opus 4.8 --- changelog.d/3025-rootpath-anchor.fixed.md | 1 + cli/lucli/templates/app/public/Application.cfc | 11 ++++++++++- examples/starter-app/public/Application.cfc | 6 +++++- examples/tweet/public/Application.cfc | 6 +++++- public/Application.cfc | 6 +++++- vendor/wheels/rocketunit_tests/Application.cfc | 5 ++++- 6 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 changelog.d/3025-rootpath-anchor.fixed.md diff --git a/changelog.d/3025-rootpath-anchor.fixed.md b/changelog.d/3025-rootpath-anchor.fixed.md new file mode 100644 index 0000000000..97a7d34cfd --- /dev/null +++ b/changelog.d/3025-rootpath-anchor.fixed.md @@ -0,0 +1 @@ +- The application template's `this.wheels.rootPath` now anchors to `GetCurrentTemplatePath()` (the `public/` front-controller directory) instead of `GetBaseTemplatePath()` (whatever file was originally requested). When a request bootstrapped under a subfolder — e.g. the test runner — the old base-template anchor produced an unstable path, and because `rootPath` seeds `this.name` via `Hash(rootPath)`, that silently split one app across two application scopes (the "reload=true fixes it" symptom). The value is identical for a normal front-controller request, so existing apps are unaffected (#3025, refs #2887) diff --git a/cli/lucli/templates/app/public/Application.cfc b/cli/lucli/templates/app/public/Application.cfc index 0a38c6aace..21f1dbb142 100644 --- a/cli/lucli/templates/app/public/Application.cfc +++ b/cli/lucli/templates/app/public/Application.cfc @@ -2,7 +2,16 @@ component output="false" { // Put variables we just need internally inside a wheels struct. this.wheels = {}; - this.wheels.rootPath = GetDirectoryFromPath(GetBaseTemplatePath()); + // Anchor to THIS file's directory (the public front-controller dir), not the + // base template's. GetBaseTemplatePath() returns whatever file was originally + // requested, so when a request bootstraps under a subfolder (e.g. the test + // runner) rootPath would mis-anchor — and since it seeds `this.name` via + // Hash(rootPath) below, an unstable value silently splits one app across two + // application scopes (the "reload=true fixes it" symptom in issue #3025/#2887). + // GetCurrentTemplatePath() is always this Application.cfc's path, so rootPath + // stays stable regardless of the requested base template — and is identical to + // the old value for a normal front-controller request. + this.wheels.rootPath = GetDirectoryFromPath(GetCurrentTemplatePath()); this.name = createUUID(); diff --git a/examples/starter-app/public/Application.cfc b/examples/starter-app/public/Application.cfc index 954ba4e7dc..76bc8c6639 100644 --- a/examples/starter-app/public/Application.cfc +++ b/examples/starter-app/public/Application.cfc @@ -2,7 +2,11 @@ component output="false" { // Put variables we just need internally inside a wheels struct. this.wheels = {}; - this.wheels.rootPath = GetDirectoryFromPath(GetBaseTemplatePath()); + // Anchor to this file's directory, not the requested base template's, so + // rootPath stays stable when a request bootstraps under a subfolder (e.g. + // the test runner) — Hash(rootPath) below seeds this.name, and an unstable + // value splits one app across two application scopes (issue #3025/#2887). + this.wheels.rootPath = GetDirectoryFromPath(GetCurrentTemplatePath()); this.name = createUUID(); // Give this application a unique name by taking the path to the root and hashing it. diff --git a/examples/tweet/public/Application.cfc b/examples/tweet/public/Application.cfc index 954ba4e7dc..76bc8c6639 100755 --- a/examples/tweet/public/Application.cfc +++ b/examples/tweet/public/Application.cfc @@ -2,7 +2,11 @@ component output="false" { // Put variables we just need internally inside a wheels struct. this.wheels = {}; - this.wheels.rootPath = GetDirectoryFromPath(GetBaseTemplatePath()); + // Anchor to this file's directory, not the requested base template's, so + // rootPath stays stable when a request bootstraps under a subfolder (e.g. + // the test runner) — Hash(rootPath) below seeds this.name, and an unstable + // value splits one app across two application scopes (issue #3025/#2887). + this.wheels.rootPath = GetDirectoryFromPath(GetCurrentTemplatePath()); this.name = createUUID(); // Give this application a unique name by taking the path to the root and hashing it. diff --git a/public/Application.cfc b/public/Application.cfc index b1eb617a63..af1b2c610f 100644 --- a/public/Application.cfc +++ b/public/Application.cfc @@ -2,7 +2,11 @@ component output="false" { // Put variables we just need internally inside a wheels struct. this.wheels = {}; - this.wheels.rootPath = GetDirectoryFromPath(GetBaseTemplatePath()); + // Anchor to this file's directory, not the requested base template's, so + // rootPath stays stable when a request bootstraps under a subfolder (e.g. + // the test runner) — Hash(rootPath) below seeds this.name, and an unstable + // value splits one app across two application scopes (issue #3025/#2887). + this.wheels.rootPath = GetDirectoryFromPath(GetCurrentTemplatePath()); this.name = createUUID(); // Give this application a unique name by taking the path to the root and hashing it. diff --git a/vendor/wheels/rocketunit_tests/Application.cfc b/vendor/wheels/rocketunit_tests/Application.cfc index cce8012284..2506679156 100644 --- a/vendor/wheels/rocketunit_tests/Application.cfc +++ b/vendor/wheels/rocketunit_tests/Application.cfc @@ -10,7 +10,10 @@ component { // Put variables we just need internally inside a wheels struct. this.wheels = {}; - this.wheels.rootPath = GetDirectoryFromPath(GetBaseTemplatePath()); + // Anchor to this file's directory (matches this.webrootDir below), not the + // requested base template's, so rootPath stays stable under subfolder + // bootstrap (issue #3025/#2887). + this.wheels.rootPath = GetDirectoryFromPath(GetCurrentTemplatePath()); this.webrootDir = getDirectoryFromPath( getCurrentTemplatePath() ); this.appDir = getCanonicalPath("_assets"); From 7e65f610824aa812eddf7f7204ac20c95ea73bff Mon Sep 17 00:00:00 2001 From: Peter Amiri Date: Tue, 23 Jun 2026 07:00:02 -0700 Subject: [PATCH 017/140] docs(web/blog): Real-Time Without WebSockets: Server-Sent Events in Wheels 4.0 --- .../blog/posts/server-sent-events-wheels-4.md | 291 ++++++++++++++++++ 1 file changed, 291 insertions(+) create mode 100644 web/content/blog/posts/server-sent-events-wheels-4.md diff --git a/web/content/blog/posts/server-sent-events-wheels-4.md b/web/content/blog/posts/server-sent-events-wheels-4.md new file mode 100644 index 0000000000..8dd1307f9e --- /dev/null +++ b/web/content/blog/posts/server-sent-events-wheels-4.md @@ -0,0 +1,291 @@ +--- +title: 'Real-Time Without WebSockets: Server-Sent Events in Wheels 4.0' +slug: server-sent-events-wheels-4 +publishedAt: '2026-06-23T14:00:00.000Z' +updatedAt: '2026-06-19T14:45:00.000Z' +author: Peter Amiri +tags: + - wheels-4 + - sse + - real-time + - controllers +categories: [] +excerpt: >- + A worked guide to Wheels 4.0's Server-Sent Events helpers — renderSSE for + one-shot events, the initSSEStream/sendSSEEvent/closeSSEStream trio for + long-lived streams, plus isSSERequest content negotiation, keep-alive + heartbeats, and the engine-fragility sharp edges to test for. +coverImage: null +--- + +A user opens your dashboard and leaves the tab open. Somewhere in the background a worker finishes a report, an order ships, a teammate leaves a comment. The page sits there, stale, until the user gets bored and hits refresh — and when they do, half the time nothing's changed and they've burned a round-trip to find that out. + +The reflex answer is "add WebSockets." But WebSockets are a bidirectional protocol, and what you actually have is a one-directional problem: the server has news, the client wants to hear it. You don't need the client talking back over the same channel. You need a pipe that pushes. Reaching for WebSockets here is bringing a phone call to a problem that wants a text message — now you're running a separate connection upgrade, a frame protocol, a heartbeat scheme, and probably a second process to hold all those sockets, all to deliver updates that only ever flow one way. + +Server-Sent Events are the text message. One long-lived HTTP response, `Content-Type: text/event-stream`, the server writes `data: ...` lines, the browser's built-in `EventSource` parses them and fires events. Auto-reconnect is in the spec. Last-event tracking is in the spec. It rides ordinary HTTP, so your existing proxy, auth, and routing all just work. + +Wheels 4.0 ships SSE as first-class controller helpers. This post walks both shapes — the one-shot event and the true stream — through a worked notifications feature, and then it's honest about the sharp edges, because one of them is genuinely engine-fragile and you need to know which one before you ship it. + +## Two shapes, one decision + +There are exactly two ways to send SSE in Wheels, and picking between them is the only real architecture decision you'll make: + +| | `renderSSE()` | `initSSEStream()` + friends | +|---|---|---| +| Events per request | **One**, then the request ends | **Many**, over a held-open connection | +| Pipeline | Flows through `renderText()` — after-filters still run | **Bypasses** layouts *and* after-filters | +| Holds a worker thread | No — returns immediately | **Yes** — for the whole connection lifetime | +| How the client gets the next event | `EventSource` reconnects | Same connection keeps delivering | +| Spec-covered across engines | Yes | **No** — hand-test per engine (see Sharp edges) | + +The mental model: `renderSSE()` is polling dressed up in SSE clothing. It sends one event and the request is done; the browser's `EventSource` reconnects on its own to pull the next one. It's simple, it's safe, it's covered by the test suite, and for most "is there anything new?" features it's all you want. The streaming trio is for when you genuinely need the server to push a burst of events down one connection without the reconnect tax — and it comes with strings attached. + +Start with the simple one. + +## One event per request: `renderSSE()` + +Here's a notifications endpoint. A controller at `app/controllers/Notifications.cfc`, one action: + +```cfm +// app/controllers/Notifications.cfc +component extends="Controller" { + + // GET /notifications/updates -> one SSE event per request + function updates() { + var unsent = model("Notification").findAll( + where = "userId = #params.userId# AND sent = 0", + order = "createdAt ASC" + ); + + // `data` is a REQUIRED string -> you serialize it yourself. + // `event` is the SSE event-TYPE name the client listens for. + // `retry` (ms) tells the browser how long to wait before reconnecting. + renderSSE( + data = SerializeJSON(unsent), + event = "notifications", + retry = 5000 + ); + } +} +``` + +Three things to notice, because all three trip people up. + +**You stringify the payload yourself.** `data` is `required string`. There is no auto-JSON in `renderSSE` — `model("Notification").findAll()` returns a query object, and handing a query straight to `data` throws a cast error. Call `SerializeJSON()` and pass the string. This is deliberate: SSE data can be anything (JSON, plain text, a CSV row), so the framework doesn't presume. + +**The argument is `event`, not `eventName`.** It's the SSE *event-type* name — the string your client's `addEventListener` matches on. Not `type`, not `name`, not `eventName`. Get this wrong and you'll pass it as a positional arg by accident, which is its own problem (see below). + +**`retry` is real but undocumented.** The CLAUDE.md SSE summary doesn't mention it, but `renderSSE` accepts `retry` (milliseconds) and emits a `retry:` line that tells the browser how long to wait before reconnecting. For a one-shot endpoint this is your polling interval — `retry=5000` means "come back in 5 seconds." That's the whole pacing mechanism for the `renderSSE` model. + +Under the hood, `renderSSE` sets four headers — `Content-Type: text/event-stream`, `Cache-Control: no-cache`, `Connection: keep-alive`, and `X-Accel-Buffering: no` (the last one tells nginx not to buffer the stream) — formats the event, and hands the result to `renderText()`. That last detail matters: because it routes through the normal rendering pipeline, **your after-filters still run.** If you log responses or inject a header in an after-filter, that still happens for `renderSSE`. (It does *not* for the streaming trio — hold that thought.) + +Never mix positional and named arguments — that's the number-one error source in Wheels code framework-wide, and SSE is no exception. The moment you pass any optional arg, go all-named: + +```cfm +// WRONG — positional + named mixed +renderSSE(SerializeJSON(unsent), event="notifications"); + +// RIGHT — all named +renderSSE(data=SerializeJSON(unsent), event="notifications"); +``` + +### Wiring the route + +`config/routes.cfm` — nothing exotic, it's a normal GET: + +```cfm +mapper() + .get(name="notificationUpdates", to="notifications##updates") + .resources("notifications") + .root(to="home##index", method="get") + .wildcard() +.end(); +``` + +### The client side + +This is the payoff for using a protocol the browser already knows. No library, no framework: + +```javascript +// EventSource reconnects automatically after each single-event response, +// honoring the `retry` hint and sending Last-Event-ID on reconnect. +const es = new EventSource('/notifications/updates'); + +// Listen for the named event type you passed as `event=` in renderSSE. +es.addEventListener('notifications', (e) => { + const payload = JSON.parse(e.data); + console.log('new notifications:', payload); +}); + +es.onerror = (err) => console.warn('SSE connection error', err); +``` + +That's the entire client. `EventSource` opens the connection, your action sends one `notifications` event, the request ends, and `EventSource` reconnects on its own — waiting `retry` milliseconds — to pull the next batch. You never wrote a reconnect loop, a backoff, or a heartbeat. The browser owns all of that. + +## Serving SSE and HTML from one action: `isSSERequest()` + +Often the same URL should serve a live stream to `EventSource` clients and a plain HTML page to someone who navigates there in a browser tab. `isSSERequest()` checks the `Accept` header — `EventSource` always sends `Accept: text/event-stream` — and lets you branch: + +```cfm +function index() { + var items = model("Notification").findAll(order="createdAt DESC"); + + if (isSSERequest()) { // true when Accept: text/event-stream + renderSSE(data=SerializeJSON(items), event="notifications"); + return; + } + + // Falls through to the normal HTML view for browser navigations. + notifications = items; +} +``` + +`isSSERequest()` takes no arguments and reads the header defensively — if `GetHTTPRequestData()` fails for any reason it treats the request as non-SSE rather than throwing. One URL, two representations, zero duplication. And in the HTML branch, remember to `cfparam` the view variable at the top of `views/notifications/index.cfm`: + +```cfm + +``` + +Then loop it as a query, because finders return query objects, not arrays: + +```cfm + +

  • #notifications.title# — #notifications.createdAt#
  • + +``` + +## When one event isn't enough: the streaming trio + +`renderSSE` reconnects per event. That's fine until reconnection overhead matters — a high-frequency feed, a progress stream for a long-running job, a live activity ticker. For those you want one connection that stays open and delivers a burst of events. That's the `initSSEStream()` / `sendSSEEvent()` / `closeSSEStream()` trio. + +The shape is different. `initSSEStream()` doesn't go through Wheels' rendering pipeline at all. It reaches for the underlying response object via the engine adapter, sets the same four SSE headers directly, calls `renderNothing()` so Wheels emits no body of its own, and **returns you the raw output writer.** You then write events to that writer yourself and close it when you're done. + +Here's a bounded streaming endpoint. It mirrors the real streaming loop Wheels uses internally for its Channels feature — and "mirrors the real one" is doing a lot of work, because a naive streaming loop in CFML will eat a worker thread alive: + +```cfm +// app/controllers/Feed.cfc +component extends="Controller" { + + // GET /feed/stream -> long-lived SSE stream + // NOTE: bypasses layouts AND after-filters. + function stream() { + var writer = initSSEStream(); // takes NO args; returns the raw writer + var timeoutSeconds = 30; + var heartbeatSeconds = 10; + var lastId = 0; + + try { + var startTime = GetTickCount() / 1000; + var lastHeartbeat = startTime; + + while (true) { + var now = GetTickCount() / 1000; + if (now - startTime > timeoutSeconds) break; // ALWAYS bound the loop + + var fresh = model("Notification").findAll( + where = "id > #lastId#", + order = "id ASC" + ); + for (var n in fresh) { + sendSSEEvent( + writer = writer, + data = SerializeJSON(n), + event = "notification", + id = n.id // becomes Last-Event-ID on the client + ); + lastId = n.id; + lastHeartbeat = now; + } + + // Keep-alive comment so idle connections aren't dropped by proxies. + if (now - lastHeartbeat > heartbeatSeconds) { + sendSSEComment(writer = writer); // default comment 'ping' + lastHeartbeat = now; + } + + if (writer.checkError()) break; // client disconnected + sleep(500); + } + } finally { + closeSSEStream(writer); // flush + close; swallows disconnect errors + } + } +} +``` + +Walk the load-bearing parts: + +**`initSSEStream()` takes no arguments and returns the writer.** Capture it. Every subsequent call needs it. + +**`sendSSEEvent(writer=..., data=..., ...)` pushes one event and flushes immediately.** It formats the event and calls `writer.write()` then `writer.flush()`, so the event hits the wire right away rather than sitting in a buffer. `writer` and `data` are both required; `event`, `id`, and `retry` carry the same meaning as in `renderSSE`. The `id` here is worth using — it becomes the client's `Last-Event-ID`, which is what lets a reconnecting client tell you where it left off. + +**`sendSSEComment(writer=...)` is the heartbeat.** This one isn't in the CLAUDE.md summary at all, but it's the canonical keep-alive primitive — the same one the Channels loops use. It writes an SSE comment line (`: ping\n\n`), which the `EventSource` client ignores entirely but which keeps the connection from looking idle to a proxy that would otherwise drop it. It strips CR/LF from the comment so it can't be used to smuggle a fake field, defaults to `"ping"`, and flushes immediately. + +**The loop is bounded three ways, and all three are mandatory.** CFML's request/response model means this loop holds a worker thread for the entire connection lifetime. An unbounded `while(true)` is a thread leak that will starve your pool. So: (1) a wall-clock `timeoutSeconds` cap that breaks the loop; (2) `writer.checkError()` to detect that the client disconnected; and (3) `sleep(500)` between polls so you're not spinning the CPU. The whole thing lives in a `try`/`finally` that calls `closeSSEStream(writer)` no matter how the loop exits. + +**`closeSSEStream(writer)` is forgiving by design.** It flushes and closes inside a try/catch that swallows errors, because by the time you close, the client may already be gone — and a disconnected client is the normal way these streams end, not an exception worth surfacing. Both `closeSSEStream(writer)` and `closeSSEStream(writer=writer)` are valid; there's a single required argument. + +## What goes on the wire + +Both paths run your event through the same internal formatter, and it's worth seeing what it produces because the format explains a couple of the gotchas below. Fields come out in a fixed order — `id`, then `event`, then `retry`, then `data` — each emitted only when present (`retry` only when greater than zero), and the event terminates with a blank line: + +``` +id: 42 +event: notification +retry: 5000 +data: {"id":42,"title":"Order shipped"} + +``` + +Multi-line data is split so each line gets its own `data:` prefix, which is exactly what the SSE spec wants — the browser reassembles them with `\n`. So this `data` value: + +```cfml +sendSSEEvent(writer=writer, data="line one#Chr(10)#line two", event="log"); +``` + +…goes out as two `data:` lines: + +``` +event: log +data: line one +data: line two + +``` + +…and `e.data` on the client comes back as `"line one\nline two"`. That's correct behavior, not a bug — and it's also your field-injection defense, which brings us to the sharp edges. + +## Sharp edges + +SSE in Wheels is small and clean, but there are five things that will bite you if you don't know them up front. Every one of these is real and grounded in the implementation. + +### 1. `initSSEStream()` is engine-fragile on BoxLang — hand-test it + +This is the big one. `initSSEStream()` works by asking the engine adapter for the underlying response object and then calling `setContentType()`, `setHeader()`, and `getWriter()` on it. On Lucee and Adobe that object is the real `HttpServletResponse` (Lucee via `GetPageContext().getResponse()`, Adobe via `GetPageContext().getFusionContext().getResponse()`). **On BoxLang it isn't** — BoxLang's adapter deliberately returns the `PageContext` itself, with an explicit note that anything needing the real response object has to override `getResponse()` locally. So the streaming path is not guaranteed to resolve those methods the same way across engines. + +Concretely: `renderSSE`, `isSSERequest`, and the internal formatter are all covered by the test suite and behave identically everywhere. The streaming trio — `initSSEStream` / `sendSSEEvent` / `closeSSEStream` end-to-end — is **not** exercised by the spec. If you're building a streaming endpoint, hand-test it on every engine you deploy to before you rely on it. The one-shot `renderSSE` model has no such caveat; if you want SSE that "just works" everywhere with zero hand-testing, that's the one to reach for. + +### 2. `renderSSE` sends ONE event — it is not a stream + +`renderSSE` is a single event and then the request ends, full stop. There is no loop inside it. If you want multiple events pushed down one connection you *must* use the streaming trio with your own loop. The reconnection between `renderSSE` events is handled entirely by the browser's `EventSource`. Don't try to call `renderSSE` in a loop — only the last call would matter, and you'd be confused for an afternoon. + +### 3. After-filters run for `renderSSE` but are SKIPPED for streaming + +Because `renderSSE` routes through `renderText()`, your after-filters run normally. Because `initSSEStream()` bypasses the entire rendering pipeline, after-filters (and layouts) **do not run** for streaming endpoints. If you have an after-filter doing response logging, audit-trail writes, or header injection, it silently won't fire on your streaming routes. Either move that logic into the action itself or accept that streaming endpoints are off the filter path. + +### 4. You stringify the payload — always + +`data` is `required string` on every one of these methods. There is no auto-JSON anywhere. Pass `SerializeJSON(yourData)`. Handing a struct, a query, or an array directly throws a cast error. This is consistent across `renderSSE`, `sendSSEEvent`, and the internal formatter — there's no path where the framework serializes for you. + +### 5. Field injection is handled — you can't smuggle fake events through user data + +If you're putting user-supplied content into `data`, you might worry that a malicious payload containing `\nevent: something\n` could inject a fake SSE field. It can't. The formatter strips CR/LF from `id` and `event` values outright, and for `data` it normalizes all line endings to LF and re-prefixes every line with `data: ` — so an embedded newline in user data just becomes another `data:` line that the client reassembles with `\n`, never a new field. That's the *correct* SSE behavior and the security property at the same time. You still want to validate and escape on the client when you render the payload into the DOM, but the SSE framing itself is safe. + +One more thing worth knowing: all of these methods — including the `$`-prefixed internal formatter — are mixed onto every controller via `$integrateComponents("wheels.controller")`, which is why even the internal `$formatSSEEvent` is declared `public` (private mixin functions don't get integrated in Wheels). The practical takeaway is small but real: the six SSE helpers (`renderSSE`, `initSSEStream`, `sendSSEEvent`, `sendSSEComment`, `closeSSEStream`, `isSSERequest`) live in the protected-method surface, so don't name one of your own controller actions after them or the dispatcher will 404 the action instead of running it. Your own action names like `updates` and `stream` are fine — they aren't framework helpers. + +## Which one should you use? + +If you can express your feature as "the client asks, the server answers once, repeat" — and most notification, badge-count, and is-it-done-yet features can — use `renderSSE`. It's spec-covered, engine-safe, holds no thread, and the browser does your reconnect logic for free. Set `retry` to your polling cadence and you're done. + +Reach for the streaming trio only when reconnection overhead is a real cost — high-frequency feeds, live progress on a long job, a ticker that updates several times a second. When you do, copy the bounded-loop pattern above verbatim: timeout cap, `checkError()` disconnect detection, heartbeat comments, `sleep` between polls, `try`/`finally` close. And hand-test it on every engine, because the streaming path is the one corner of Wheels SSE that the test suite doesn't have your back on. + +Real-time doesn't have to mean a second protocol and a second process. For one-directional server-to-client updates — which is most of what "real-time" actually means in a web app — SSE over plain HTTP is the right-sized tool, and Wheels 4.0 makes it about four lines of controller code. From fe5fc429362c1714fd8498b4f5a1a5182c477de1 Mon Sep 17 00:00:00 2001 From: "wheels-bot[bot]" <283220952+wheels-bot[bot]@users.noreply.github.com> Date: Tue, 23 Jun 2026 14:07:38 +0000 Subject: [PATCH 018/140] chore(docs): auto-refresh blog visual baseline after content change [skip ci] Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- web/tests/visual-baselines/blog.png | Bin 132975 -> 128776 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/web/tests/visual-baselines/blog.png b/web/tests/visual-baselines/blog.png index a50a6889cb10f75acacac045095fc3d08c826f2d..89f3a62e5e9fab59821128adf1c6bc1c416083bd 100644 GIT binary patch literal 128776 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 z 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 EoWV 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%0D(0ozE;))_GM<7<^(48WFruBm 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 From 5056ea48446699e7b923325a7b0bafd127ff9474 Mon Sep 17 00:00:00 2001 From: Peter Amiri Date: Wed, 24 Jun 2026 05:02:11 -0700 Subject: [PATCH 019/140] docs(web/guides): document buttonTo input-prefix convention and schema cache (#3250) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two v4 guide gaps surfaced while reviewing GitHub discussions: - buttonTo's input-prefixed attribute convention (inputClass/inputId/inputRel) was documented in v3 guides but dropped in the v4-0-0 restructure (#1352). Added a buttonTo entry to the view-helpers reference explaining that button attributes are input-prefixed because the button renders inside a
    , and that siblings like linkTo take class/id directly. - The per-model schema/column-metadata cache in application.wheels.models — the cache that goes stale on a live ALTER TABLE and which $clearCache() cannot rebuild — was undocumented (#1481). Added a "Schema and model-metadata cache" section to the caching guide with reload/restart recovery options. Signed-off-by: Peter Amiri Co-authored-by: Peter Amiri Co-authored-by: Claude Opus 4.8 (1M context) --- .../v4-0-0/basics/views-layouts-partials.mdx | 3 ++- .../docs/v4-0-0/digging-deeper/caching.mdx | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/web/sites/guides/src/content/docs/v4-0-0/basics/views-layouts-partials.mdx b/web/sites/guides/src/content/docs/v4-0-0/basics/views-layouts-partials.mdx index ad28cd49ac..a39a249c73 100644 --- a/web/sites/guides/src/content/docs/v4-0-0/basics/views-layouts-partials.mdx +++ b/web/sites/guides/src/content/docs/v4-0-0/basics/views-layouts-partials.mdx @@ -140,7 +140,8 @@ Wheels 4.0 form helpers escape their input by default (see [Forms and Form Helpe The helpers you'll reach for most often in view code: -- `linkTo(route=..., key=..., text=..., class=...)` — renders an `` tag with the URL filled in from a named route. +- `linkTo(route=..., key=..., text=..., class=...)` — renders an `` tag with the URL filled in from a named route. `class`, `id`, and other HTML attributes pass straight through onto the anchor. +- `buttonTo(route=..., key=..., text=..., method="delete")` — renders a `` wrapping a single submit button. Reach for it when an action must POST/PUT/PATCH/DELETE rather than GET (e.g. a "Delete" button). Because the button lives *inside* a form, attributes for the **button itself** are prefixed with `input` — use `inputClass`, `inputId`, `inputRel`, **not** `class`/`id`, e.g. `buttonTo(text="Delete", route="post", key=post.id, method="delete", inputClass="btn btn-danger")`. Unprefixed `class`/`id` land on the wrapping ``. (`buttonTo` is the only link helper with this split — siblings like `linkTo` take `class`/`id` directly.) - `urlFor(route=..., key=...)` — returns just the URL string. Use when you need the URL outside an anchor (JavaScript, form action, `Location:` header). - `imageTag("logo.png", alt="Logo")` — renders `` with the path resolved against `public/images/`. - `styleSheetLinkTag("app.css")` — renders `` against `public/stylesheets/`. diff --git a/web/sites/guides/src/content/docs/v4-0-0/digging-deeper/caching.mdx b/web/sites/guides/src/content/docs/v4-0-0/digging-deeper/caching.mdx index 02832d6618..b60dcba505 100644 --- a/web/sites/guides/src/content/docs/v4-0-0/digging-deeper/caching.mdx +++ b/web/sites/guides/src/content/docs/v4-0-0/digging-deeper/caching.mdx @@ -201,6 +201,22 @@ For caches keyed by query arguments (the automatic `findAll(cache=N)` flavor), i Now the model callback can call `$removeFromCache(key="posts-listing")` surgically. 3. **Bust the engine's query cache with a reload.** `$clearCache(category="query")` does **not** invalidate finder caches — as noted above, `findAll(cache=N)` results live in the CFML engine's native query cache, not in `application.wheels.cache`. The blunt instruments that actually work are `?reload=true&password=...` (which rotates the cache-key comment Wheels embeds in every cached query's SQL, invalidating all engine-cached results) or an application restart. +## Schema and model-metadata cache + +Separate from `application.wheels.cache` — the store everything above talks about — Wheels keeps a second, longer-lived cache that `$clearCache()` cannot reach: each model's **table and column metadata**. The first time a model is used, Wheels runs `cfdbinfo` against its table and caches the column list, types, and defaults in `application.wheels.models` for the lifetime of the application. That's what lets `model("Post").new()` know its properties without a database round-trip on every request. + +The flip side: a **live schema change goes stale instantly**. Drop or rename a column with `ALTER TABLE` against a running app and the next request fails with a "column not found" error (or silently ignores the new column) — the model is still working from the metadata it read at startup. `$clearCache()`, `clearQueryCacheOnReload`, and `clearTemplateCacheOnReload` do **not** rebuild it; only a reload or a restart re-runs `cfdbinfo`. + +To pick up a schema change without killing the process, in order of preference: + +1. **Migrate, then reload.** Apply the change through a [migration](/v4-0-0/basics/migrations/) and reload each node with `?reload=true&password=...` — the reload re-reads every model's schema. With more than one app server, reload them one at a time for a zero-downtime rollout. +2. **Rolling load-balancer restart.** Drain and restart each node behind the load balancer in turn, so the fleet is never fully down. +3. **Off-hours engine restart.** The blunt option: a full Lucee/CF restart clears everything. Fine when a maintenance window is acceptable. + + + ## Per-user keys A cached action is shared across every request for the same URL — which is a problem the moment the rendered output depends on the logged-in user. Use `appendToKey` to mix more identifiers into the cache key: From 121b64d3e33853ca62a871b31f29386f736f5e34 Mon Sep 17 00:00:00 2001 From: Peter Amiri Date: Wed, 24 Jun 2026 05:15:20 -0700 Subject: [PATCH 020/140] docs(web/guides): name the dead cfwheels-base-template slug and redirect to wheels-base-template (#3253) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Installing with CommandBox page existed to give 2.x/3.x CommandBox teams a clear Wheels 4 answer, but it never mentioned the slug a migrating 2.x user actually has in muscle memory: `box install cfwheels-base-template`. That pre-rebrand slug still resolves on ForgeBox (76,754 installs, top 'cfwheels' search hit) but errors on its missing `cfwheels` core dependency and leaves an unrunnable skeleton. Worse, the 2.x/3.x migration table claimed `box install wheels-base-template` + `wheels-core` was 'Unchanged' — inaccurate for a genuine 2.x user, whose slug DID change (cfwheels-base-template -> wheels-base-template). The row now reads 'Slug changed' and a caution Aside maps the dead cfwheels- prefixed slugs to the supported 4.x slugs (cfwheels-base-template -> wheels-base-template, cfwheels -> wheels-core). Refs #3198 (post-merge review finding) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Signed-off-by: Peter Amiri Co-authored-by: Peter Amiri Co-authored-by: Claude Fable 5 --- .../start-here/installing-with-commandbox.mdx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/web/sites/guides/src/content/docs/v4-0-0/start-here/installing-with-commandbox.mdx b/web/sites/guides/src/content/docs/v4-0-0/start-here/installing-with-commandbox.mdx index dd68caf360..e53d74407f 100644 --- a/web/sites/guides/src/content/docs/v4-0-0/start-here/installing-with-commandbox.mdx +++ b/web/sites/guides/src/content/docs/v4-0-0/start-here/installing-with-commandbox.mdx @@ -124,7 +124,20 @@ The 3.x getting-started spine was built on CommandBox. Here's how each old step | `wheels generate app myApp` / `wheels g app` | `wheels new myApp` | | `box server start` | Still works — or `wheels start` (Lucee, bundled with the CLI) | | ForgeBox plugins (`box install ...`, `forgebox install`) | The [`wheels packages`](/v4-0-0/digging-deeper/packages/) registry (CLI-only; not ForgeBox) | -| `box install wheels-base-template` + `wheels-core` | Unchanged — still the supported way to fetch the framework with CommandBox | +| `box install cfwheels-base-template` | **Slug changed** — `box install wheels-base-template` (the `cfwheels-`-prefixed slug is dead; see below) | + + The practical recommendation: keep CommandBox if you rely on it for Adobe CF or BoxLang server management, and add the `wheels` CLI alongside it for everything in the [feature-set list above](#not-supported-via-commandbox-the-wheels-cli-feature-set). From bab07fdcf5bdc57b67c60cce7fb224aebc535730 Mon Sep 17 00:00:00 2001 From: Peter Amiri Date: Wed, 24 Jun 2026 05:19:47 -0700 Subject: [PATCH 021/140] chore: add reusable triage-discussions workflow (#3256) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Permanent named workflow at .claude/workflows/triage-discussions.js, invokable via Workflow({name:"triage-discussions"}) and visible in /workflows. It fetches recent GitHub Discussions, drops Announcements and bot reports, triages each thread, then adversarially verifies whether each proposed action is genuinely needed against current code and open issues. Read-only — produces a verified findings report and posts nothing. Signed-off-by: Peter Amiri Co-authored-by: Peter Amiri Co-authored-by: Claude Opus 4.8 (1M context) --- .claude/workflows/triage-discussions.js | 179 ++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 .claude/workflows/triage-discussions.js diff --git a/.claude/workflows/triage-discussions.js b/.claude/workflows/triage-discussions.js new file mode 100644 index 0000000000..dd12416a6e --- /dev/null +++ b/.claude/workflows/triage-discussions.js @@ -0,0 +1,179 @@ +export const meta = { + name: 'triage-discussions', + description: 'Fetch recent GitHub Discussions, triage each thread, and adversarially verify which ones actually need a code fix, doc update, or new issue', + whenToUse: 'Periodic (e.g. monthly) sweep of community GitHub Discussions to surface genuinely actionable items — without filing duplicates or acting on reports that are already fixed/answered. Read-only: produces a verified findings report, posts nothing.', + phases: [ + { title: 'Fetch', detail: 'pull + filter recent discussions (drop Announcements and bot reports)' }, + { title: 'Triage', detail: 'read each discussion thread, classify, propose action', model: 'sonnet' }, + { title: 'Verify', detail: 'adversarially check each proposed action against current code + open issues' }, + ], +} + +// --------------------------------------------------------------------------- +// args (all optional). Accepts an object, a JSON string, or a bare date string: +// { repo: "owner/name", since: "YYYY-MM-DD", max: 40 } +// "2026-01-01" -> treated as { since } +// Defaults: repo=wheels-dev/wheels, since=2025-01-01, max=40 +// --------------------------------------------------------------------------- +const opts = (() => { + if (args == null) return {} + if (typeof args === 'string') { + const s = args.trim() + if (s.startsWith('{')) { try { return JSON.parse(s) } catch (e) { return {} } } + return s ? { since: s } : {} + } + return args +})() +const REPO = opts.repo || 'wheels-dev/wheels' +const SINCE = opts.since || '2025-01-01' +const MAX = opts.max || 40 +const [OWNER, NAME] = REPO.split('/') + +const CANDIDATES_SCHEMA = { + type: 'object', + additionalProperties: false, + properties: { + candidates: { + type: 'array', + items: { + type: 'object', + additionalProperties: false, + properties: { + number: { type: 'integer' }, + title: { type: 'string' }, + category: { type: 'string' }, + comments: { type: 'integer' }, + isAnswered: { type: 'boolean' }, + updatedAt: { type: 'string' }, + author: { type: 'string' }, + }, + required: ['number', 'title', 'category', 'comments', 'isAnswered', 'updatedAt', 'author'], + }, + }, + }, + required: ['candidates'], +} + +const TRIAGE_SCHEMA = { + type: 'object', + additionalProperties: false, + properties: { + number: { type: 'integer' }, + classification: { type: 'string', enum: ['bug', 'feature-idea', 'doc-gap', 'question-unanswered', 'question-answered', 'onboarding-friction', 'infra', 'noise'] }, + summary: { type: 'string' }, + resolvedInThread: { type: 'boolean' }, + proposedAction: { type: 'string', enum: ['code-fix', 'doc-update', 'file-issue', 'reply', 'close-stale', 'none'] }, + actionDetail: { type: 'string' }, + severity: { type: 'string', enum: ['high', 'medium', 'low'] }, + needsVerification: { type: 'boolean' }, + }, + required: ['number', 'classification', 'summary', 'resolvedInThread', 'proposedAction', 'actionDetail', 'severity', 'needsVerification'], +} + +const VERDICT_SCHEMA = { + type: 'object', + additionalProperties: false, + properties: { + number: { type: 'integer' }, + verdict: { type: 'string', enum: ['confirmed-needs-action', 'already-fixed', 'already-tracked', 'wont-act', 'insufficient-evidence'] }, + evidence: { type: 'string' }, + existingIssue: { type: 'string' }, + recommendedAction: { type: 'string' }, + confidence: { type: 'string', enum: ['high', 'medium', 'low'] }, + }, + required: ['number', 'verdict', 'evidence', 'existingIssue', 'recommendedAction', 'confidence'], +} + +function fetchCmd(num) { + return `gh api graphql -f query='query($num: Int!) { repository(owner:"${OWNER}", name:"${NAME}") { discussion(number:$num) { title url createdAt updatedAt category{name} answer{ body author{login} } body comments(first:50){ nodes{ author{login} createdAt body replies(first:20){ nodes{ author{login} body } } } } } } }' -F num=${num}` +} + +const fetchPrompt = [ + `Build the candidate list of GitHub Discussions to triage for repo ${REPO}.`, + ``, + `Run this in Bash (the API returns the 100 most-recently-updated; that is enough for a recency sweep):`, + `gh api graphql -f query='query { repository(owner:"${OWNER}", name:"${NAME}") { discussions(first:100, orderBy:{field:UPDATED_AT, direction:DESC}) { nodes { number title url createdAt updatedAt isAnswered category{name} comments{totalCount} author{login} } } } }'`, + ``, + `Filter the nodes:`, + `- EXCLUDE category == "Announcements" (maintainer marketing / release posts — not actionable).`, + `- EXCLUDE author login "github-actions" (automated monthly metrics reports).`, + `- KEEP only discussions whose updatedAt >= ${SINCE}.`, + `Sort the kept set by updatedAt descending and return at most ${MAX}.`, + ``, + `For each kept discussion emit: number, title, category (name), comments (the comments.totalCount integer), isAnswered (use false when the GraphQL value is null), updatedAt (date only, "YYYY-MM-DD"), author (login).`, + `Return ONLY the structured object {candidates: [...]}.`, +].join('\n') + +function triagePrompt(c) { + return [ + `You are triaging a GitHub Discussion in the Wheels CFML framework repo (${REPO}). Wheels is on the develop branch; many older threads reference 3.x.`, + `Discussion #${c.number}: "${c.title}" — category=${c.category}, comments=${c.comments}, updated=${c.updatedAt}, author=${c.author}.`, + ``, + `STEP 1 — Read the FULL thread. Run this in Bash:`, + fetchCmd(c.number), + ``, + `STEP 2 — Understand what the user reports or asks, and whether the thread already resolved it (accepted answer, "thanks that worked", maintainer fix linked, etc).`, + ``, + `STEP 3 — Classify and decide whether the maintainer needs to DO something NOW.`, + `- classification: bug | feature-idea | doc-gap | question-unanswered | question-answered | onboarding-friction | infra | noise`, + `- proposedAction: code-fix | doc-update | file-issue | reply | close-stale | none`, + `- needsVerification: TRUE when the proposed action depends on the current state of the codebase or on whether an issue already exists (any code-fix / file-issue / doc-update claim a downstream verifier must confirm against HEAD). FALSE for pure social replies, clear no-ops, or answered questions that revealed nothing latent.`, + ``, + `Be conservative: an answered Q&A with an accepted answer usually needs no action UNLESS it exposes a real doc gap or a latent bug. A "broken"/"doesn't work" title is a CLAIM, not a confirmed bug — flag it for verification rather than asserting it.`, + `summary: 1-2 sentences. actionDetail: the concrete next step (or "none"). severity: high|medium|low (impact on users).`, + `Return ONLY the structured object.`, + ].join('\n') +} + +function verifyPrompt(t, c) { + return [ + `You are an ADVERSARIAL verifier for the Wheels CFML framework (${REPO}); working tree is the develop branch. DEFAULT TO SKEPTICAL — assume the proposed action is unnecessary until evidence proves otherwise.`, + `A triage agent reviewed Discussion #${c.number} ("${c.title}") and proposed: ${t.proposedAction} — "${t.actionDetail}" (classification: ${t.classification}, severity: ${t.severity}).`, + `Thread summary: ${t.summary}`, + ``, + `Verify against reality, citing evidence:`, + `1. ALREADY FIXED? Search the codebase (Grep/Glob/Read) and recent history (git log --oneline -40). The reported behavior may already be patched. Re-read the thread if useful: ${fetchCmd(c.number)}`, + `2. ALREADY TRACKED? Run: gh issue list --repo ${REPO} --state all --search "" --limit 15 (try a couple of keyword sets).`, + `3. Only if it is a REAL, untracked, unfixed problem -> confirmed-needs-action.`, + ``, + `verdict: confirmed-needs-action | already-fixed | already-tracked | wont-act | insufficient-evidence`, + `evidence: cite a file:line, commit SHA, or issue number that justifies the verdict (be specific). existingIssue: issue number if already-tracked, else "".`, + `recommendedAction: the crisp final recommendation for the maintainer. confidence: high|medium|low.`, + `READ-ONLY: do NOT post anything to GitHub, do NOT edit files. Return ONLY the structured object.`, + ].join('\n') +} + +phase('Fetch') +const fetched = await agent(fetchPrompt, { label: 'fetch-discussions', phase: 'Fetch', schema: CANDIDATES_SCHEMA, effort: 'low' }) +const candidates = (fetched && fetched.candidates) || [] +log(`Fetched ${candidates.length} candidate discussions (updated since ${SINCE}, excluding Announcements + bots).`) +if (!candidates.length) return { reviewed: 0, confirmedCount: 0, findings: [] } + +phase('Triage') +const results = await pipeline( + candidates, + (c) => agent(triagePrompt(c), { label: `triage:#${c.number}`, phase: 'Triage', schema: TRIAGE_SCHEMA, model: 'sonnet', effort: 'medium' }), + (t, c) => { + if (!t) return { number: c.number, candidate: c, triage: null, verdict: null } + const actionable = t.needsVerification && t.proposedAction !== 'none' && t.classification !== 'noise' + if (!actionable) { + return { + number: c.number, candidate: c, triage: t, + verdict: { + number: c.number, verdict: 'wont-act', + evidence: 'triage: no codebase/issue verification needed', + existingIssue: '', + recommendedAction: t.proposedAction === 'none' ? 'No action needed' : t.actionDetail, + confidence: 'medium', skippedVerify: true, + }, + } + } + return agent(verifyPrompt(t, c), { label: `verify:#${c.number}`, phase: 'Verify', effort: 'high', schema: VERDICT_SCHEMA }) + .then(v => ({ number: c.number, candidate: c, triage: t, verdict: v })) + } +) + +const findings = results.filter(Boolean) +const confirmed = findings.filter(f => f.verdict && f.verdict.verdict === 'confirmed-needs-action') +log(`Done: ${findings.length} reviewed, ${confirmed.length} confirmed as needing action.`) +return { reviewed: candidates.length, confirmedCount: confirmed.length, findings } From f902f249c96c9b36ae51121d8983ab2b74fdd622 Mon Sep 17 00:00:00 2001 From: Peter Amiri Date: Wed, 24 Jun 2026 07:00:02 -0700 Subject: [PATCH 022/140] docs(web/blog): Pagination That Isn't a Pain: paginationNav and the Preset System --- .../posts/pagination-nav-preset-system.md | 350 ++++++++++++++++++ 1 file changed, 350 insertions(+) create mode 100644 web/content/blog/posts/pagination-nav-preset-system.md diff --git a/web/content/blog/posts/pagination-nav-preset-system.md b/web/content/blog/posts/pagination-nav-preset-system.md new file mode 100644 index 0000000000..84b9150e63 --- /dev/null +++ b/web/content/blog/posts/pagination-nav-preset-system.md @@ -0,0 +1,350 @@ +--- +title: 'Pagination That Isn''t a Pain: paginationNav and the Preset System' +slug: pagination-nav-preset-system +publishedAt: '2026-06-24T14:00:00.000Z' +updatedAt: '2026-06-19T15:10:00.000Z' +author: Peter Amiri +tags: + - wheels-4 + - pagination + - views + - helpers +categories: [] +excerpt: >- + A complete how-to on Wheels 4.0's paginationNav helper — the all-in-one nav, + the bootstrap5/bootstrap4/tailwind preset system, the auto/always/never + anchor tri-state, and the dev-time guardrails that catch typos before they + ship. +coverImage: null +--- + +You have a list of 1,000 blog posts and a view that needs to show 25 of them at a time. The query part is one line — `findAll(page=params.page, perPage=25)` — and Wheels has handled it cleanly since forever. The *navigation* part is where the afternoon goes. + +In the old world you'd reach for `paginationLinks()`, then discover it gives you bare anchors and you have to hand-wrap each one in `
  • ` to make Bootstrap happy. So you build a wad of `prependToPage`/`appendToPage` arguments, copy that wad into four views, get one of the class names wrong in the third one, and ship a pagination bar that's subtly broken on the archive page nobody looks at until a customer does. + +Wheels 4.0 ships `paginationNav()` — one helper that emits the whole `